github.com/likebike/go--@v0.0.0-20190911215757-0bd925d16e96/go/src/math/bits/make_tables.go (about)

     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  }