summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:41:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:41:39 +0000
commitfcfb5e62f95d625836328131cc5ca851182bcae4 (patch)
tree5309ef2284a82d61ece838d1dd1c97c09df152b8 /dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer
parentAdding upstream version 1.1.1. (diff)
downloadicingadb-upstream/1.2.0.tar.xz
icingadb-upstream/1.2.0.zip
Adding upstream version 1.2.0.upstream/1.2.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer')
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer.go146
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer_test.go95
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool.go53
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool_test.go52
4 files changed, 346 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer.go b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer.go
new file mode 100644
index 0000000..0b8540c
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer.go
@@ -0,0 +1,146 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package buffer provides a thin wrapper around a byte slice. Unlike the
+// standard library's bytes.Buffer, it supports a portion of the strconv
+// package's zero-allocation formatters.
+package buffer // import "go.uber.org/zap/buffer"
+
+import (
+ "strconv"
+ "time"
+)
+
+const _size = 1024 // by default, create 1 KiB buffers
+
+// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so
+// the only way to construct one is via a Pool.
+type Buffer struct {
+ bs []byte
+ pool Pool
+}
+
+// AppendByte writes a single byte to the Buffer.
+func (b *Buffer) AppendByte(v byte) {
+ b.bs = append(b.bs, v)
+}
+
+// AppendBytes writes the given slice of bytes to the Buffer.
+func (b *Buffer) AppendBytes(v []byte) {
+ b.bs = append(b.bs, v...)
+}
+
+// AppendString writes a string to the Buffer.
+func (b *Buffer) AppendString(s string) {
+ b.bs = append(b.bs, s...)
+}
+
+// AppendInt appends an integer to the underlying buffer (assuming base 10).
+func (b *Buffer) AppendInt(i int64) {
+ b.bs = strconv.AppendInt(b.bs, i, 10)
+}
+
+// AppendTime appends the time formatted using the specified layout.
+func (b *Buffer) AppendTime(t time.Time, layout string) {
+ b.bs = t.AppendFormat(b.bs, layout)
+}
+
+// AppendUint appends an unsigned integer to the underlying buffer (assuming
+// base 10).
+func (b *Buffer) AppendUint(i uint64) {
+ b.bs = strconv.AppendUint(b.bs, i, 10)
+}
+
+// AppendBool appends a bool to the underlying buffer.
+func (b *Buffer) AppendBool(v bool) {
+ b.bs = strconv.AppendBool(b.bs, v)
+}
+
+// AppendFloat appends a float to the underlying buffer. It doesn't quote NaN
+// or +/- Inf.
+func (b *Buffer) AppendFloat(f float64, bitSize int) {
+ b.bs = strconv.AppendFloat(b.bs, f, 'f', -1, bitSize)
+}
+
+// Len returns the length of the underlying byte slice.
+func (b *Buffer) Len() int {
+ return len(b.bs)
+}
+
+// Cap returns the capacity of the underlying byte slice.
+func (b *Buffer) Cap() int {
+ return cap(b.bs)
+}
+
+// Bytes returns a mutable reference to the underlying byte slice.
+func (b *Buffer) Bytes() []byte {
+ return b.bs
+}
+
+// String returns a string copy of the underlying byte slice.
+func (b *Buffer) String() string {
+ return string(b.bs)
+}
+
+// Reset resets the underlying byte slice. Subsequent writes re-use the slice's
+// backing array.
+func (b *Buffer) Reset() {
+ b.bs = b.bs[:0]
+}
+
+// Write implements io.Writer.
+func (b *Buffer) Write(bs []byte) (int, error) {
+ b.bs = append(b.bs, bs...)
+ return len(bs), nil
+}
+
+// WriteByte writes a single byte to the Buffer.
+//
+// Error returned is always nil, function signature is compatible
+// with bytes.Buffer and bufio.Writer
+func (b *Buffer) WriteByte(v byte) error {
+ b.AppendByte(v)
+ return nil
+}
+
+// WriteString writes a string to the Buffer.
+//
+// Error returned is always nil, function signature is compatible
+// with bytes.Buffer and bufio.Writer
+func (b *Buffer) WriteString(s string) (int, error) {
+ b.AppendString(s)
+ return len(s), nil
+}
+
+// TrimNewline trims any final "\n" byte from the end of the buffer.
+func (b *Buffer) TrimNewline() {
+ if i := len(b.bs) - 1; i >= 0 {
+ if b.bs[i] == '\n' {
+ b.bs = b.bs[:i]
+ }
+ }
+}
+
+// Free returns the Buffer to its Pool.
+//
+// Callers must not retain references to the Buffer after calling Free.
+func (b *Buffer) Free() {
+ b.pool.put(b)
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer_test.go b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer_test.go
new file mode 100644
index 0000000..71ffac1
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/buffer_test.go
@@ -0,0 +1,95 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package buffer
+
+import (
+ "bytes"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestBufferWrites(t *testing.T) {
+ buf := NewPool().Get()
+
+ tests := []struct {
+ desc string
+ f func()
+ want string
+ }{
+ {"AppendByte", func() { buf.AppendByte('v') }, "v"},
+ {"AppendString", func() { buf.AppendString("foo") }, "foo"},
+ {"AppendIntPositive", func() { buf.AppendInt(42) }, "42"},
+ {"AppendIntNegative", func() { buf.AppendInt(-42) }, "-42"},
+ {"AppendUint", func() { buf.AppendUint(42) }, "42"},
+ {"AppendBool", func() { buf.AppendBool(true) }, "true"},
+ {"AppendFloat64", func() { buf.AppendFloat(3.14, 64) }, "3.14"},
+ // Intentionally introduce some floating-point error.
+ {"AppendFloat32", func() { buf.AppendFloat(float64(float32(3.14)), 32) }, "3.14"},
+ {"AppendWrite", func() { buf.Write([]byte("foo")) }, "foo"},
+ {"AppendTime", func() { buf.AppendTime(time.Date(2000, 1, 2, 3, 4, 5, 6, time.UTC), time.RFC3339) }, "2000-01-02T03:04:05Z"},
+ {"WriteByte", func() { buf.WriteByte('v') }, "v"},
+ {"WriteString", func() { buf.WriteString("foo") }, "foo"},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.desc, func(t *testing.T) {
+ buf.Reset()
+ tt.f()
+ assert.Equal(t, tt.want, buf.String(), "Unexpected buffer.String().")
+ assert.Equal(t, tt.want, string(buf.Bytes()), "Unexpected string(buffer.Bytes()).")
+ assert.Equal(t, len(tt.want), buf.Len(), "Unexpected buffer length.")
+ // We're not writing more than a kibibyte in tests.
+ assert.Equal(t, _size, buf.Cap(), "Expected buffer capacity to remain constant.")
+ })
+ }
+}
+
+func BenchmarkBuffers(b *testing.B) {
+ // Because we use the strconv.AppendFoo functions so liberally, we can't
+ // use the standard library's bytes.Buffer anyways (without incurring a
+ // bunch of extra allocations). Nevertheless, let's make sure that we're
+ // not losing any precious nanoseconds.
+ str := strings.Repeat("a", 1024)
+ slice := make([]byte, 1024)
+ buf := bytes.NewBuffer(slice)
+ custom := NewPool().Get()
+ b.Run("ByteSlice", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ slice = append(slice, str...)
+ slice = slice[:0]
+ }
+ })
+ b.Run("BytesBuffer", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ buf.WriteString(str)
+ buf.Reset()
+ }
+ })
+ b.Run("CustomBuffer", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ custom.AppendString(str)
+ custom.Reset()
+ }
+ })
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool.go b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool.go
new file mode 100644
index 0000000..8463233
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool.go
@@ -0,0 +1,53 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package buffer
+
+import (
+ "go.uber.org/zap/internal/pool"
+)
+
+// A Pool is a type-safe wrapper around a sync.Pool.
+type Pool struct {
+ p *pool.Pool[*Buffer]
+}
+
+// NewPool constructs a new Pool.
+func NewPool() Pool {
+ return Pool{
+ p: pool.New(func() *Buffer {
+ return &Buffer{
+ bs: make([]byte, 0, _size),
+ }
+ }),
+ }
+}
+
+// Get retrieves a Buffer from the pool, creating one if necessary.
+func (p Pool) Get() *Buffer {
+ buf := p.p.Get()
+ buf.Reset()
+ buf.pool = p
+ return buf
+}
+
+func (p Pool) put(buf *Buffer) {
+ p.p.Put(buf)
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool_test.go b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool_test.go
new file mode 100644
index 0000000..a219815
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.27.0/buffer/pool_test.go
@@ -0,0 +1,52 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package buffer
+
+import (
+ "sync"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestBuffers(t *testing.T) {
+ const dummyData = "dummy data"
+ p := NewPool()
+
+ var wg sync.WaitGroup
+ for g := 0; g < 10; g++ {
+ wg.Add(1)
+ go func() {
+ for i := 0; i < 100; i++ {
+ buf := p.Get()
+ assert.Zero(t, buf.Len(), "Expected truncated buffer")
+ assert.NotZero(t, buf.Cap(), "Expected non-zero capacity")
+
+ buf.AppendString(dummyData)
+ assert.Equal(t, buf.Len(), len(dummyData), "Expected buffer to contain dummy data")
+
+ buf.Free()
+ }
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+}