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