github.com/go-xe2/third@v1.0.3/golang.org/x/text/internal/triegen/example_test.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package triegen_test 6 7 import ( 8 "fmt" 9 "io/ioutil" 10 "math/rand" 11 "unicode" 12 13 "github.com/go-xe2/third/golang.org/x/text/internal/triegen" 14 ) 15 16 const seed = 0x12345 17 18 var genWriter = ioutil.Discard 19 20 func randomRunes() map[rune]uint8 { 21 rnd := rand.New(rand.NewSource(seed)) 22 m := map[rune]uint8{} 23 for len(m) < 100 { 24 // Only set our random rune if it is a valid Unicode code point. 25 if r := rune(rnd.Int31n(unicode.MaxRune + 1)); []rune(string(r))[0] == r { 26 m[r] = 1 27 } 28 } 29 return m 30 } 31 32 // Example_build shows how to build a simple trie. It assigns the value 1 to 33 // 100 random runes generated by randomRunes. 34 func Example_build() { 35 t := triegen.NewTrie("rand") 36 37 for r, _ := range randomRunes() { 38 t.Insert(r, 1) 39 } 40 sz, err := t.Gen(genWriter) 41 42 fmt.Printf("Trie size: %d bytes\n", sz) 43 fmt.Printf("Error: %v\n", err) 44 45 // Output: 46 // Trie size: 9280 bytes 47 // Error: <nil> 48 } 49 50 // Example_lookup demonstrates how to use the trie generated by Example_build. 51 func Example_lookup() { 52 trie := newRandTrie(0) 53 54 // The same set of runes used by Example_build. 55 runes := randomRunes() 56 57 // Verify the right value is returned for all runes. 58 for r := rune(0); r <= unicode.MaxRune; r++ { 59 // Note that the return type of lookup is uint8. 60 if v, _ := trie.lookupString(string(r)); v != runes[r] { 61 fmt.Println("FAILURE") 62 return 63 } 64 } 65 fmt.Println("SUCCESS") 66 67 // Output: 68 // SUCCESS 69 } 70 71 // runeValues generates some random values for a set of interesting runes. 72 func runeValues() map[rune]uint64 { 73 rnd := rand.New(rand.NewSource(seed)) 74 m := map[rune]uint64{} 75 for p := 4; p <= unicode.MaxRune; p <<= 1 { 76 for d := -1; d <= 1; d++ { 77 m[rune(p+d)] = uint64(rnd.Int63()) 78 } 79 } 80 return m 81 } 82 83 // ExampleGen_build demonstrates the creation of multiple tries sharing common 84 // blocks. ExampleGen_lookup demonstrates how to use the generated tries. 85 func ExampleGen_build() { 86 var tries []*triegen.Trie 87 88 rv := runeValues() 89 for _, c := range []struct { 90 include func(rune) bool 91 name string 92 }{ 93 {func(r rune) bool { return true }, "all"}, 94 {func(r rune) bool { return r < 0x80 }, "ASCII only"}, 95 {func(r rune) bool { return r < 0x80 }, "ASCII only 2"}, 96 {func(r rune) bool { return r <= 0xFFFF }, "BMP only"}, 97 {func(r rune) bool { return r > 0xFFFF }, "No BMP"}, 98 } { 99 t := triegen.NewTrie(c.name) 100 tries = append(tries, t) 101 102 for r, v := range rv { 103 if c.include(r) { 104 t.Insert(r, v) 105 } 106 } 107 } 108 sz, err := triegen.Gen(genWriter, "multi", tries) 109 110 fmt.Printf("Trie size: %d bytes\n", sz) 111 fmt.Printf("Error: %v\n", err) 112 113 // Output: 114 // Trie size: 18250 bytes 115 // Error: <nil> 116 } 117 118 // ExampleGen_lookup shows how to look up values in the trie generated by 119 // ExampleGen_build. 120 func ExampleGen_lookup() { 121 rv := runeValues() 122 for i, include := range []func(rune) bool{ 123 func(r rune) bool { return true }, // all 124 func(r rune) bool { return r < 0x80 }, // ASCII only 125 func(r rune) bool { return r < 0x80 }, // ASCII only 2 126 func(r rune) bool { return r <= 0xFFFF }, // BMP only 127 func(r rune) bool { return r > 0xFFFF }, // No BMP 128 } { 129 t := newMultiTrie(i) 130 131 for r := rune(0); r <= unicode.MaxRune; r++ { 132 x := uint64(0) 133 if include(r) { 134 x = rv[r] 135 } 136 // As we convert from a valid rune, we know it is safe to use 137 // lookupStringUnsafe. 138 if v := t.lookupStringUnsafe(string(r)); x != v { 139 fmt.Println("FAILURE") 140 return 141 } 142 } 143 } 144 fmt.Println("SUCCESS") 145 146 // Output: 147 // SUCCESS 148 }