package buffer

import "sync"

// A BytesBufferPool is a type-safe wrapper around a sync.BytesBufferPool.
type BytesBufferPool struct {
	p *sync.Pool
}

// NewBytesPool constructs a new BytesBufferPool.
func NewBytesPool() BytesBufferPool {
	return BytesBufferPool{
		p: &sync.Pool{
			New: func() interface{} {
				return &BytesBuffer{bs: make([]byte, 0, defaultSize)}
			},
		},
	}
}

// Get retrieves a BytesBuffer from the pool, creating one if necessary.
func (p BytesBufferPool) Get() *BytesBuffer {
	buf := p.p.Get().(*BytesBuffer)
	buf.Reset()
	buf.pool = p
	return buf
}

func (p BytesBufferPool) put(buf *BytesBuffer) {
	p.p.Put(buf)
}

// GlobalBytesPool returns the global buffer pool.
func GlobalBytesPool() *BytesBufferPool {
	return &bytesPool
}

// bytesPool is a pool of buffer bytes.
var bytesPool = NewBytesPool()