|
- package render
-
- import "bytes"
-
- // bufPool represents a reusable buffer pool for executing templates into.
- var bufPool *BufferPool
-
- // BufferPool implements a pool of bytes.Buffers in the form of a bounded channel.
- // Pulled from the github.com/oxtoacart/bpool package (Apache licensed).
- type BufferPool struct {
- c chan *bytes.Buffer
- }
-
- // NewBufferPool creates a new BufferPool bounded to the given size.
- func NewBufferPool(size int) (bp *BufferPool) {
- return &BufferPool{
- c: make(chan *bytes.Buffer, size),
- }
- }
-
- // Get gets a Buffer from the BufferPool, or creates a new one if none are
- // available in the pool.
- func (bp *BufferPool) Get() (b *bytes.Buffer) {
- select {
- case b = <-bp.c:
- // reuse existing buffer
- default:
- // create new buffer
- b = bytes.NewBuffer([]byte{})
- }
- return
- }
-
- // Put returns the given Buffer to the BufferPool.
- func (bp *BufferPool) Put(b *bytes.Buffer) {
- b.Reset()
- select {
- case bp.c <- b:
- default: // Discard the buffer if the pool is full.
- }
- }
-
- // Initialize buffer pool for writing templates into.
- func init() {
- bufPool = NewBufferPool(64)
- }
|