diff options
| author | romanyx <romanyx90@yandex.ru> | 2017-08-09 20:21:58 +0300 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2017-08-11 11:05:01 +0000 |
| commit | 92cfd07a6cfd917bcd3db41b15dbcd78d3f089af (patch) | |
| tree | b9b4171b174582d2396bec07da255c9170f39fc6 /src/math/bits/make_examples.go | |
| parent | 9c7bf0807a56429a92c4518f90d3418609688cbb (diff) | |
| download | go-92cfd07a6cfd917bcd3db41b15dbcd78d3f089af.tar.xz | |
math/bits: examples generator
Change-Id: Icdd0566d3b7dbc034256e16f8a6b6f1af07069b3
Reviewed-on: https://go-review.googlesource.com/54350
Reviewed-by: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/math/bits/make_examples.go')
| -rw-r--r-- | src/math/bits/make_examples.go | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/math/bits/make_examples.go b/src/math/bits/make_examples.go new file mode 100644 index 0000000000..caef0b1b69 --- /dev/null +++ b/src/math/bits/make_examples.go @@ -0,0 +1,174 @@ +// 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 example_test.go. + +package main + +import ( + "bytes" + "fmt" + "go/format" + "io" + "io/ioutil" + "log" + "math/bits" + "sort" +) + +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_examples.go. DO NOT EDIT. + +package bits_test + +import ( + "fmt" + "math/bits" +) + +`) + + exampleRegF = ` +func Example%s() { + fmt.Printf("%s\n", %d, bits.%s(%d)) + // Output: + // %s +} +` + exampleRevF = ` +func Example%s() { + fmt.Printf("%s\n", %d) + fmt.Printf("%s\n", bits.%s(%d)) + // Output: + // %s + // %s +} +` +) + +func main() { + buf := bytes.NewBuffer(header) + + genReg(buf) + genRev(buf) + + out, err := format.Source(buf.Bytes()) + if err != nil { + log.Fatal(err) + } + + err = ioutil.WriteFile("example_test.go", out, 0666) + if err != nil { + log.Fatal(err) + } +} + +func genReg(w io.Writer) { + examples := []struct { + name string + in int + out map[uint]interface{} + }{ + { + name: "LeadingZeros", + in: 1, + out: map[uint]interface{}{ + 8: bits.LeadingZeros8(1), + 16: bits.LeadingZeros16(1), + 32: bits.LeadingZeros32(1), + 64: bits.LeadingZeros64(1), + }, + }, { + name: "TrailingZeros", + in: 14, + out: map[uint]interface{}{ + 8: bits.TrailingZeros8(14), + 16: bits.TrailingZeros16(14), + 32: bits.TrailingZeros32(14), + 64: bits.TrailingZeros64(14), + }, + }, { + name: "OnesCount", + in: 14, + out: map[uint]interface{}{ + 8: bits.OnesCount8(14), + 16: bits.OnesCount16(14), + 32: bits.OnesCount32(14), + 64: bits.OnesCount64(14), + }, + }, { + name: "Len", + in: 8, + out: map[uint]interface{}{ + 8: bits.Len8(8), + 16: bits.Len16(8), + 32: bits.Len32(8), + 64: bits.Len64(8), + }, + }, + } + + for _, e := range examples { + sizes := sortedSizes(e.out) + + for _, size := range sizes { + fnName := fmt.Sprintf("%s%d", e.name, size) + outF := fmt.Sprintf("%s(%%0%db) = %%d", fnName, size) + out := fmt.Sprintf(outF, e.in, e.out[size]) + + fmt.Fprintf(w, exampleRegF, fnName, outF, e.in, fnName, e.in, out) + } + } +} + +func genRev(w io.Writer) { + examples := []struct { + name string + in int + out map[uint]interface{} + }{ + { + name: "Reverse", + in: 19, + out: map[uint]interface{}{ + 8: bits.Reverse8(19), + 16: bits.Reverse16(19), + 32: bits.Reverse32(19), + 64: bits.Reverse64(19), + }, + }, + } + + for _, e := range examples { + sizes := sortedSizes(e.out) + + for _, size := range sizes { + fnName := fmt.Sprintf("%s%d", e.name, size) + outF := fmt.Sprintf("%%0%db", size) + out := fmt.Sprintf(outF, e.in) + secOut := fmt.Sprintf(outF, e.out[size]) + + fmt.Fprintf(w, exampleRevF, fnName, outF, e.in, outF, fnName, e.in, out, secOut) + } + } +} + +func sortedSizes(out map[uint]interface{}) []uint { + sizes := make([]uint, 0, len(out)) + for size := range out { + sizes = append(sizes, size) + } + + sort.Slice(sizes, func(i, j int) bool { + return sizes[i] < sizes[j] + }) + + return sizes +} |
