codeberg.org/gruf/go-pools@v1.1.0/henc.go (about)

     1  package pools
     2  
     3  import (
     4  	"hash"
     5  	"sync"
     6  
     7  	"codeberg.org/gruf/go-hashenc"
     8  )
     9  
    10  // HashEncoderPool is a pooled allocator for hashenc.HashEncoder objects.
    11  type HashEncoderPool interface {
    12  	// Get fetches a hashenc.HashEncoder from pool
    13  	Get() hashenc.HashEncoder
    14  
    15  	// Put places supplied hashenc.HashEncoder back in pool
    16  	Put(hashenc.HashEncoder)
    17  }
    18  
    19  // NewHashEncoderPool returns a newly instantiated hashenc.HashEncoder pool.
    20  func NewHashEncoderPool(hash func() hash.Hash, enc func() hashenc.Encoder) HashEncoderPool {
    21  	return &hencPool{
    22  		pool: sync.Pool{
    23  			New: func() interface{} {
    24  				return hashenc.New(hash(), enc())
    25  			},
    26  		},
    27  		size: hashenc.New(hash(), enc()).Size(),
    28  	}
    29  }
    30  
    31  // hencPool is our implementation of HashEncoderPool.
    32  type hencPool struct {
    33  	pool sync.Pool
    34  	size int
    35  }
    36  
    37  func (p *hencPool) Get() hashenc.HashEncoder {
    38  	return p.pool.Get().(hashenc.HashEncoder)
    39  }
    40  
    41  func (p *hencPool) Put(henc hashenc.HashEncoder) {
    42  	if henc.Size() < p.size {
    43  		return
    44  	}
    45  	p.pool.Put(henc)
    46  }