src: Add DMA localagent
[barometer.git] / src / dma / vendor / github.com / valyala / bytebufferpool / bytebuffer.go
diff --git a/src/dma/vendor/github.com/valyala/bytebufferpool/bytebuffer.go b/src/dma/vendor/github.com/valyala/bytebufferpool/bytebuffer.go
new file mode 100644 (file)
index 0000000..07a055a
--- /dev/null
@@ -0,0 +1,111 @@
+package bytebufferpool
+
+import "io"
+
+// ByteBuffer provides byte buffer, which can be used for minimizing
+// memory allocations.
+//
+// ByteBuffer may be used with functions appending data to the given []byte
+// slice. See example code for details.
+//
+// Use Get for obtaining an empty byte buffer.
+type ByteBuffer struct {
+
+       // B is a byte buffer to use in append-like workloads.
+       // See example code for details.
+       B []byte
+}
+
+// Len returns the size of the byte buffer.
+func (b *ByteBuffer) Len() int {
+       return len(b.B)
+}
+
+// ReadFrom implements io.ReaderFrom.
+//
+// The function appends all the data read from r to b.
+func (b *ByteBuffer) ReadFrom(r io.Reader) (int64, error) {
+       p := b.B
+       nStart := int64(len(p))
+       nMax := int64(cap(p))
+       n := nStart
+       if nMax == 0 {
+               nMax = 64
+               p = make([]byte, nMax)
+       } else {
+               p = p[:nMax]
+       }
+       for {
+               if n == nMax {
+                       nMax *= 2
+                       bNew := make([]byte, nMax)
+                       copy(bNew, p)
+                       p = bNew
+               }
+               nn, err := r.Read(p[n:])
+               n += int64(nn)
+               if err != nil {
+                       b.B = p[:n]
+                       n -= nStart
+                       if err == io.EOF {
+                               return n, nil
+                       }
+                       return n, err
+               }
+       }
+}
+
+// WriteTo implements io.WriterTo.
+func (b *ByteBuffer) WriteTo(w io.Writer) (int64, error) {
+       n, err := w.Write(b.B)
+       return int64(n), err
+}
+
+// Bytes returns b.B, i.e. all the bytes accumulated in the buffer.
+//
+// The purpose of this function is bytes.Buffer compatibility.
+func (b *ByteBuffer) Bytes() []byte {
+       return b.B
+}
+
+// Write implements io.Writer - it appends p to ByteBuffer.B
+func (b *ByteBuffer) Write(p []byte) (int, error) {
+       b.B = append(b.B, p...)
+       return len(p), nil
+}
+
+// WriteByte appends the byte c to the buffer.
+//
+// The purpose of this function is bytes.Buffer compatibility.
+//
+// The function always returns nil.
+func (b *ByteBuffer) WriteByte(c byte) error {
+       b.B = append(b.B, c)
+       return nil
+}
+
+// WriteString appends s to ByteBuffer.B.
+func (b *ByteBuffer) WriteString(s string) (int, error) {
+       b.B = append(b.B, s...)
+       return len(s), nil
+}
+
+// Set sets ByteBuffer.B to p.
+func (b *ByteBuffer) Set(p []byte) {
+       b.B = append(b.B[:0], p...)
+}
+
+// SetString sets ByteBuffer.B to s.
+func (b *ByteBuffer) SetString(s string) {
+       b.B = append(b.B[:0], s...)
+}
+
+// String returns string representation of ByteBuffer.B.
+func (b *ByteBuffer) String() string {
+       return string(b.B)
+}
+
+// Reset makes ByteBuffer.B empty.
+func (b *ByteBuffer) Reset() {
+       b.B = b.B[:0]
+}