123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // Copyright 2014 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package triegen_test
- import (
- "fmt"
- "io/ioutil"
- "math/rand"
- "unicode"
- "golang.org/x/text/internal/triegen"
- )
- const seed = 0x12345
- var genWriter = ioutil.Discard
- func randomRunes() map[rune]uint8 {
- rnd := rand.New(rand.NewSource(seed))
- m := map[rune]uint8{}
- for len(m) < 100 {
- // Only set our random rune if it is a valid Unicode code point.
- if r := rune(rnd.Int31n(unicode.MaxRune + 1)); []rune(string(r))[0] == r {
- m[r] = 1
- }
- }
- return m
- }
- // Example_build shows how to build a simple trie. It assigns the value 1 to
- // 100 random runes generated by randomRunes.
- func Example_build() {
- t := triegen.NewTrie("rand")
- for r, _ := range randomRunes() {
- t.Insert(r, 1)
- }
- sz, err := t.Gen(genWriter)
- fmt.Printf("Trie size: %d bytes\n", sz)
- fmt.Printf("Error: %v\n", err)
- // Output:
- // Trie size: 9280 bytes
- // Error: <nil>
- }
- // Example_lookup demonstrates how to use the trie generated by Example_build.
- func Example_lookup() {
- trie := newRandTrie(0)
- // The same set of runes used by Example_build.
- runes := randomRunes()
- // Verify the right value is returned for all runes.
- for r := rune(0); r <= unicode.MaxRune; r++ {
- // Note that the return type of lookup is uint8.
- if v, _ := trie.lookupString(string(r)); v != runes[r] {
- fmt.Println("FAILURE")
- return
- }
- }
- fmt.Println("SUCCESS")
- // Output:
- // SUCCESS
- }
- // runeValues generates some random values for a set of interesting runes.
- func runeValues() map[rune]uint64 {
- rnd := rand.New(rand.NewSource(seed))
- m := map[rune]uint64{}
- for p := 4; p <= unicode.MaxRune; p <<= 1 {
- for d := -1; d <= 1; d++ {
- m[rune(p+d)] = uint64(rnd.Int63())
- }
- }
- return m
- }
- // ExampleGen_build demonstrates the creation of multiple tries sharing common
- // blocks. ExampleGen_lookup demonstrates how to use the generated tries.
- func ExampleGen_build() {
- var tries []*triegen.Trie
- rv := runeValues()
- for _, c := range []struct {
- include func(rune) bool
- name string
- }{
- {func(r rune) bool { return true }, "all"},
- {func(r rune) bool { return r < 0x80 }, "ASCII only"},
- {func(r rune) bool { return r < 0x80 }, "ASCII only 2"},
- {func(r rune) bool { return r <= 0xFFFF }, "BMP only"},
- {func(r rune) bool { return r > 0xFFFF }, "No BMP"},
- } {
- t := triegen.NewTrie(c.name)
- tries = append(tries, t)
- for r, v := range rv {
- if c.include(r) {
- t.Insert(r, v)
- }
- }
- }
- sz, err := triegen.Gen(genWriter, "multi", tries)
- fmt.Printf("Trie size: %d bytes\n", sz)
- fmt.Printf("Error: %v\n", err)
- // Output:
- // Trie size: 18250 bytes
- // Error: <nil>
- }
- // ExampleGen_lookup shows how to look up values in the trie generated by
- // ExampleGen_build.
- func ExampleGen_lookup() {
- rv := runeValues()
- for i, include := range []func(rune) bool{
- func(r rune) bool { return true }, // all
- func(r rune) bool { return r < 0x80 }, // ASCII only
- func(r rune) bool { return r < 0x80 }, // ASCII only 2
- func(r rune) bool { return r <= 0xFFFF }, // BMP only
- func(r rune) bool { return r > 0xFFFF }, // No BMP
- } {
- t := newMultiTrie(i)
- for r := rune(0); r <= unicode.MaxRune; r++ {
- x := uint64(0)
- if include(r) {
- x = rv[r]
- }
- // As we convert from a valid rune, we know it is safe to use
- // lookupStringUnsafe.
- if v := t.lookupStringUnsafe(string(r)); x != v {
- fmt.Println("FAILURE")
- return
- }
- }
- }
- fmt.Println("SUCCESS")
- // Output:
- // SUCCESS
- }
|