Home | History | Annotate | Download | only in bits
      1 // Copyright 2017 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // +build ignore
      6 
      7 // This program generates bits_tables.go.
      8 
      9 package main
     10 
     11 import (
     12 	"bytes"
     13 	"fmt"
     14 	"go/format"
     15 	"io"
     16 	"io/ioutil"
     17 	"log"
     18 )
     19 
     20 var header = []byte(`// Copyright 2017 The Go Authors. All rights reserved.
     21 // Use of this source code is governed by a BSD-style
     22 // license that can be found in the LICENSE file.
     23 
     24 // Code generated by go run make_tables.go. DO NOT EDIT.
     25 
     26 package bits
     27 
     28 `)
     29 
     30 func main() {
     31 	buf := bytes.NewBuffer(header)
     32 
     33 	gen(buf, "ntz8tab", ntz8)
     34 	gen(buf, "pop8tab", pop8)
     35 	gen(buf, "rev8tab", rev8)
     36 	gen(buf, "len8tab", len8)
     37 
     38 	out, err := format.Source(buf.Bytes())
     39 	if err != nil {
     40 		log.Fatal(err)
     41 	}
     42 
     43 	err = ioutil.WriteFile("bits_tables.go", out, 0666)
     44 	if err != nil {
     45 		log.Fatal(err)
     46 	}
     47 }
     48 
     49 func gen(w io.Writer, name string, f func(uint8) uint8) {
     50 	fmt.Fprintf(w, "var %s = [256]uint8{", name)
     51 	for i := 0; i < 256; i++ {
     52 		if i%16 == 0 {
     53 			fmt.Fprint(w, "\n\t")
     54 		} else {
     55 			fmt.Fprint(w, " ")
     56 		}
     57 		fmt.Fprintf(w, "%#02x,", f(uint8(i)))
     58 	}
     59 	fmt.Fprint(w, "\n}\n\n")
     60 }
     61 
     62 func ntz8(x uint8) (n uint8) {
     63 	for x&1 == 0 && n < 8 {
     64 		x >>= 1
     65 		n++
     66 	}
     67 	return
     68 }
     69 
     70 func pop8(x uint8) (n uint8) {
     71 	for x != 0 {
     72 		x &= x - 1
     73 		n++
     74 	}
     75 	return
     76 }
     77 
     78 func rev8(x uint8) (r uint8) {
     79 	for i := 8; i > 0; i-- {
     80 		r = r<<1 | x&1
     81 		x >>= 1
     82 	}
     83 	return
     84 }
     85 
     86 func len8(x uint8) (n uint8) {
     87 	for x != 0 {
     88 		x >>= 1
     89 		n++
     90 	}
     91 	return
     92 }
     93