]> Cypherpunks repositories - gostls13.git/commitdiff
math/bits: examples generator
authorromanyx <romanyx90@yandex.ru>
Wed, 9 Aug 2017 17:21:58 +0000 (20:21 +0300)
committerRobert Griesemer <gri@golang.org>
Fri, 11 Aug 2017 11:05:01 +0000 (11:05 +0000)
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>

src/math/bits/example_test.go
src/math/bits/make_examples.go [new file with mode: 0644]

index 3d6ec53d29acf32ab7faa32ab62cb4caba93c9f3..f4ed2590436da54fcc8583055e98da02b2c6655a 100644 (file)
@@ -2,6 +2,8 @@
 // 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 (
@@ -33,52 +35,52 @@ func ExampleLeadingZeros64() {
        // LeadingZeros64(0000000000000000000000000000000000000000000000000000000000000001) = 63
 }
 
-func ExampleOnesCount8() {
-       fmt.Printf("OnesCount8(%08b) = %d\n", 14, bits.OnesCount8(14))
+func ExampleTrailingZeros8() {
+       fmt.Printf("TrailingZeros8(%08b) = %d\n", 14, bits.TrailingZeros8(14))
        // Output:
-       // OnesCount8(00001110) = 3
+       // TrailingZeros8(00001110) = 1
 }
 
-func ExampleOnesCount16() {
-       fmt.Printf("OnesCount16(%016b) = %d\n", 14, bits.OnesCount16(14))
+func ExampleTrailingZeros16() {
+       fmt.Printf("TrailingZeros16(%016b) = %d\n", 14, bits.TrailingZeros16(14))
        // Output:
-       // OnesCount16(0000000000001110) = 3
+       // TrailingZeros16(0000000000001110) = 1
 }
 
-func ExampleOnesCount32() {
-       fmt.Printf("OnesCount32(%032b) = %d\n", 14, bits.OnesCount32(14))
+func ExampleTrailingZeros32() {
+       fmt.Printf("TrailingZeros32(%032b) = %d\n", 14, bits.TrailingZeros32(14))
        // Output:
-       // OnesCount32(00000000000000000000000000001110) = 3
+       // TrailingZeros32(00000000000000000000000000001110) = 1
 }
 
-func ExampleOnesCount64() {
-       fmt.Printf("OnesCount64(%064b) = %d\n", 14, bits.OnesCount64(14))
+func ExampleTrailingZeros64() {
+       fmt.Printf("TrailingZeros64(%064b) = %d\n", 14, bits.TrailingZeros64(14))
        // Output:
-       // OnesCount64(0000000000000000000000000000000000000000000000000000000000001110) = 3
+       // TrailingZeros64(0000000000000000000000000000000000000000000000000000000000001110) = 1
 }
 
-func ExampleTrailingZeros8() {
-       fmt.Printf("TrailingZeros8(%08b) = %d\n", 8, bits.TrailingZeros8(8))
+func ExampleOnesCount8() {
+       fmt.Printf("OnesCount8(%08b) = %d\n", 14, bits.OnesCount8(14))
        // Output:
-       // TrailingZeros8(00001000) = 3
+       // OnesCount8(00001110) = 3
 }
 
-func ExampleTrailingZeros16() {
-       fmt.Printf("TrailingZeros16(%016b) = %d\n", 8, bits.TrailingZeros16(8))
+func ExampleOnesCount16() {
+       fmt.Printf("OnesCount16(%016b) = %d\n", 14, bits.OnesCount16(14))
        // Output:
-       // TrailingZeros16(0000000000001000) = 3
+       // OnesCount16(0000000000001110) = 3
 }
 
-func ExampleTrailingZeros32() {
-       fmt.Printf("TrailingZeros32(%032b) = %d\n", 8, bits.TrailingZeros32(8))
+func ExampleOnesCount32() {
+       fmt.Printf("OnesCount32(%032b) = %d\n", 14, bits.OnesCount32(14))
        // Output:
-       // TrailingZeros32(00000000000000000000000000001000) = 3
+       // OnesCount32(00000000000000000000000000001110) = 3
 }
 
-func ExampleTrailingZeros64() {
-       fmt.Printf("TrailingZeros64(%064b) = %d\n", 8, bits.TrailingZeros64(8))
+func ExampleOnesCount64() {
+       fmt.Printf("OnesCount64(%064b) = %d\n", 14, bits.OnesCount64(14))
        // Output:
-       // TrailingZeros64(0000000000000000000000000000000000000000000000000000000000001000) = 3
+       // OnesCount64(0000000000000000000000000000000000000000000000000000000000001110) = 3
 }
 
 func ExampleLen8() {
@@ -105,6 +107,14 @@ func ExampleLen64() {
        // Len64(0000000000000000000000000000000000000000000000000000000000001000) = 4
 }
 
+func ExampleReverse8() {
+       fmt.Printf("%08b\n", 19)
+       fmt.Printf("%08b\n", bits.Reverse8(19))
+       // Output:
+       // 00010011
+       // 11001000
+}
+
 func ExampleReverse16() {
        fmt.Printf("%016b\n", 19)
        fmt.Printf("%016b\n", bits.Reverse16(19))
@@ -128,11 +138,3 @@ func ExampleReverse64() {
        // 0000000000000000000000000000000000000000000000000000000000010011
        // 1100100000000000000000000000000000000000000000000000000000000000
 }
-
-func ExampleReverse8() {
-       fmt.Printf("%008b\n", 19)
-       fmt.Printf("%008b\n", bits.Reverse8(19))
-       // Output:
-       // 00010011
-       // 11001000
-}
diff --git a/src/math/bits/make_examples.go b/src/math/bits/make_examples.go
new file mode 100644 (file)
index 0000000..caef0b1
--- /dev/null
@@ -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
+}