// Copyright 2017 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. //go:build ignore // +build ignore // This program generates bits_tables.go. package main import ( "bytes" "fmt" "go/format" "io" "log" "os" ) var header = []byte(`// Copyright 2017 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. // Code generated by go run make_tables.go. DO NOT EDIT. package bits `) func main() { buf := bytes.NewBuffer(header) gen(buf, "ntz8tab", ntz8) gen(buf, "pop8tab", pop8) gen(buf, "rev8tab", rev8) gen(buf, "len8tab", len8) out, err := format.Source(buf.Bytes()) if err != nil { log.Fatal(err) } err = os.WriteFile("bits_tables.go", out, 0666) if err != nil { log.Fatal(err) } } func gen(w io.Writer, name string, f func(uint8) uint8) { // Use a const string to allow the compiler to constant-evaluate lookups at constant index. fmt.Fprintf(w, "const %s = \"\"+\n\"", name) for i := 0; i < 256; i++ { fmt.Fprintf(w, "\\x%02x", f(uint8(i))) if i%16 == 15 && i != 255 { fmt.Fprint(w, "\"+\n\"") } } fmt.Fprint(w, "\"\n\n") } func ntz8(x uint8) (n uint8) { for x&1 == 0 && n < 8 { x >>= 1 n++ } return } func pop8(x uint8) (n uint8) { for x != 0 { x &= x - 1 n++ } return } func rev8(x uint8) (r uint8) { for i := 8; i > 0; i-- { r = r<<1 | x&1 x >>= 1 } return } func len8(x uint8) (n uint8) { for x != 0 { x >>= 1 n++ } return }