mirror of
https://github.com/tuneinsight/lattigo.git
synced 2025-09-13 03:27:14 +00:00
86 lines
1.3 KiB
Go
86 lines
1.3 KiB
Go
package structs
|
|
|
|
import "sync"
|
|
|
|
type BufferPool[T any] interface {
|
|
Get() T
|
|
Put(T)
|
|
}
|
|
|
|
type SyncPool[T any] struct {
|
|
pool *sync.Pool
|
|
}
|
|
|
|
func NewSyncPool[T any](f func() T) *SyncPool[T] {
|
|
pool := &sync.Pool{
|
|
New: func() any {
|
|
return f()
|
|
},
|
|
}
|
|
return &SyncPool[T]{pool: pool}
|
|
}
|
|
|
|
func (spool *SyncPool[T]) Get() T {
|
|
return spool.pool.Get().(T)
|
|
}
|
|
|
|
func (spool *SyncPool[T]) Put(buff T) {
|
|
spool.pool.Put(buff)
|
|
}
|
|
|
|
type BuffFromUintPool[T any] struct {
|
|
createObject func() T
|
|
recycleObject func(T)
|
|
}
|
|
|
|
func NewBuffFromUintPool[T any](create func() T, recycle func(T)) *BuffFromUintPool[T] {
|
|
return &BuffFromUintPool[T]{
|
|
createObject: create,
|
|
recycleObject: recycle,
|
|
}
|
|
}
|
|
|
|
func (bu *BuffFromUintPool[T]) Get() T {
|
|
return bu.createObject()
|
|
}
|
|
|
|
func (bu *BuffFromUintPool[T]) Put(obj T) {
|
|
bu.recycleObject(obj)
|
|
}
|
|
|
|
type FreeList[T any] struct {
|
|
pool chan T
|
|
newObject func() T
|
|
capacity int
|
|
}
|
|
|
|
func NewFreeList[T any](capacity int, f func() T) *FreeList[T] {
|
|
pool := make(chan T, capacity)
|
|
for i := 0; i < capacity; i++ {
|
|
pool <- f()
|
|
}
|
|
return &FreeList[T]{
|
|
pool: pool,
|
|
newObject: f,
|
|
capacity: capacity,
|
|
}
|
|
}
|
|
|
|
func (fl *FreeList[T]) Get() T {
|
|
var obj T
|
|
|
|
select {
|
|
case obj = <-fl.pool:
|
|
default:
|
|
obj = fl.newObject()
|
|
}
|
|
return obj
|
|
}
|
|
|
|
func (fl *FreeList[T]) Put(obj T) {
|
|
select {
|
|
case fl.pool <- obj:
|
|
default:
|
|
}
|
|
}
|