mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-01-23 14:50:21 +00:00
32 lines
616 B
Go
32 lines
616 B
Go
|
package rt
|
||
|
|
||
|
import (
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
type SlicePool struct {
|
||
|
pool unsafe.Pointer
|
||
|
len int
|
||
|
index int
|
||
|
typ uintptr
|
||
|
}
|
||
|
|
||
|
func NewPool(typ *GoType, size int) SlicePool {
|
||
|
return SlicePool{pool: newarray(typ, size), len: size, typ: uintptr(unsafe.Pointer(typ))}
|
||
|
}
|
||
|
|
||
|
func (self *SlicePool) GetSlice(size int) unsafe.Pointer {
|
||
|
// pool is full, fallback to normal alloc
|
||
|
if size > self.Remain() {
|
||
|
return newarray(AsGoType(self.typ), size)
|
||
|
}
|
||
|
|
||
|
ptr := PtrAdd(self.pool, uintptr(self.index)* AsGoType(self.typ).Size)
|
||
|
self.index += size
|
||
|
return ptr
|
||
|
}
|
||
|
|
||
|
func (self *SlicePool) Remain() int {
|
||
|
return self.len - self.index
|
||
|
}
|