// 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 // } }