| // 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" |
| "io/ioutil" |
| |
| "golang.org/x/text/internal/triegen" |
| ) |
| |
| func ExampleCompacter() { |
| t := triegen.NewTrie("root") |
| for r := rune(0); r < 10000; r += 64 { |
| t.Insert(r, 0x9015BADA55^uint64(r)) |
| } |
| sz, _ := t.Gen(ioutil.Discard) |
| |
| fmt.Printf("Size normal: %5d\n", sz) |
| |
| var c myCompacter |
| sz, _ = t.Gen(ioutil.Discard, triegen.Compact(&c)) |
| |
| fmt.Printf("Size compacted: %5d\n", sz) |
| |
| // Output: |
| // Size normal: 81344 |
| // Size compacted: 3224 |
| } |
| |
| // A myCompacter accepts a block if only the first value is given. |
| type myCompacter []uint64 |
| |
| func (c *myCompacter) Size(values []uint64) (sz int, ok bool) { |
| for _, v := range values[1:] { |
| if v != 0 { |
| return 0, false |
| } |
| } |
| return 8, true // the size of a uint64 |
| } |
| |
| func (c *myCompacter) Store(v []uint64) uint32 { |
| x := uint32(len(*c)) |
| *c = append(*c, v[0]) |
| return x |
| } |
| |
| func (c *myCompacter) Print(w io.Writer) error { |
| fmt.Fprintln(w, "var firstValue = []uint64{") |
| for _, v := range *c { |
| fmt.Fprintf(w, "\t%#x,\n", v) |
| } |
| fmt.Fprintln(w, "}") |
| return nil |
| } |
| |
| func (c *myCompacter) Handler() string { |
| return "getFirstValue" |
| |
| // Where getFirstValue is included along with the generated code: |
| // func getFirstValue(n uint32, b byte) uint64 { |
| // if b == 0x80 { // the first continuation byte |
| // return firstValue[n] |
| // } |
| // return 0 |
| // } |
| } |