summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-pools/bytes.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-pools/bytes.go')
-rw-r--r--vendor/codeberg.org/gruf/go-pools/bytes.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-pools/bytes.go b/vendor/codeberg.org/gruf/go-pools/bytes.go
new file mode 100644
index 000000000..76fe18616
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-pools/bytes.go
@@ -0,0 +1,46 @@
+package pools
+
+import (
+ "sync"
+
+ "codeberg.org/gruf/go-bytes"
+)
+
+// BufferPool is a pooled allocator for bytes.Buffer objects
+type BufferPool interface {
+ // Get fetches a bytes.Buffer from pool
+ Get() *bytes.Buffer
+
+ // Put places supplied bytes.Buffer in pool
+ Put(*bytes.Buffer)
+}
+
+// NewBufferPool returns a newly instantiated bytes.Buffer pool
+func NewBufferPool(size int) BufferPool {
+ return &bufferPool{
+ pool: sync.Pool{
+ New: func() interface{} {
+ return &bytes.Buffer{B: make([]byte, 0, size)}
+ },
+ },
+ size: size,
+ }
+}
+
+// bufferPool is our implementation of BufferPool
+type bufferPool struct {
+ pool sync.Pool
+ size int
+}
+
+func (p *bufferPool) Get() *bytes.Buffer {
+ return p.pool.Get().(*bytes.Buffer)
+}
+
+func (p *bufferPool) Put(buf *bytes.Buffer) {
+ if buf.Cap() < p.size {
+ return
+ }
+ buf.Reset()
+ p.pool.Put(buf)
+}