// 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.

// +build ignore

// This program generates bits_tables.go.

package main

import (
	"bytes"
	"fmt"
	"go/format"
	"io"
	"io/ioutil"
	"log"
)

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 = ioutil.WriteFile("bits_tables.go", out, 0666)
	if err != nil {
		log.Fatal(err)
	}
}

func gen(w io.Writer, name string, f func(uint8) uint8) {
	fmt.Fprintf(w, "var %s = [256]uint8{", name)
	for i := 0; i < 256; i++ {
		if i%16 == 0 {
			fmt.Fprint(w, "\n\t")
		} else {
			fmt.Fprint(w, " ")
		}
		fmt.Fprintf(w, "%#02x,", f(uint8(i)))
	}
	fmt.Fprint(w, "\n}\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
}
