72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
// 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
|
|
// }
|
|
}
|