// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package sys // ByteBuffer is an expandable buffer backed by a byte slice. type ByteBuffer struct { buf []byte offset int } // NewByteBuffer creates a new ByteBuffer with an initial capacity of // initialSize. func NewByteBuffer(initialSize int) *ByteBuffer { return &ByteBuffer{buf: make([]byte, initialSize)} } // Write appends the contents of p to the buffer, growing the buffer as needed. // The return value is the length of p; err is always nil. func (b *ByteBuffer) Write(p []byte) (int, error) { if len(b.buf) < b.offset+len(p) { // Create a buffer larger than needed so we don't spend lots of time // allocating and copying. spaceNeeded := len(b.buf) - b.offset + len(p) largerBuf := make([]byte, 2*len(b.buf)+spaceNeeded) copy(largerBuf, b.buf[:b.offset]) b.buf = largerBuf } n := copy(b.buf[b.offset:], p) b.offset += n return n, nil } // Reset resets the buffer to be empty. It retains the same underlying storage. func (b *ByteBuffer) Reset() { b.offset = 0 b.buf = b.buf[:cap(b.buf)] } // Bytes returns a slice of length b.Len() holding the bytes that have been // written to the buffer. func (b *ByteBuffer) Bytes() []byte { return b.buf[:b.offset] } // Len returns the number of bytes that have been written to the buffer. func (b *ByteBuffer) Len() int { return b.offset }