...

Source file src/pkg/math/bits/make_tables.go

     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	

View as plain text