Files
obitools4/pkg/obiseq/pool.go
Eric Coissac 3f8c0d6a2f Replace MakeBioSequence call by NewBioSequence call,
Implements a new file format guesser
Adds some more API doc


Former-commit-id: 9837bf1c28beca6ddb599b367f93548950ba83c1
2023-08-30 19:59:46 +02:00

95 lines
1.7 KiB
Go

package obiseq
import (
"log"
"sync"
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiutils"
)
var _BioSequenceByteSlicePool = sync.Pool{
New: func() interface{} {
bs := make([]byte, 0, 300)
return &bs
},
}
func RecycleSlice(s *[]byte) {
if s != nil && cap(*s) > 0 {
*s = (*s)[:0]
if cap(*s) == 0 {
log.Panicln("trying to store a NIL slice in the pool", s == nil, *s == nil, cap(*s))
}
if cap(*s) <= 1024 {
_BioSequenceByteSlicePool.Put(s)
}
}
}
// It returns a slice of bytes from a pool of slices.
//
// the slice can be prefilled with the provided values
func GetSlice(capacity int) []byte {
p := (*[]byte)(nil)
if capacity <= 1024 {
p = _BioSequenceByteSlicePool.Get().(*[]byte)
}
if p == nil || *p == nil || cap(*p) < capacity {
return make([]byte, 0, capacity)
}
s := *p
if cap(s) < capacity {
log.Panicln("Bizarre... j'aurai pourtant cru")
}
return s
}
func CopySlice(src []byte) []byte {
sl := GetSlice(len(src))
sl = sl[0:len(src)]
copy(sl, src)
return sl
}
var BioSequenceAnnotationPool = sync.Pool{
New: func() interface{} {
bs := make(Annotation, 5)
return &bs
},
}
func RecycleAnnotation(a *Annotation) {
if a != nil {
for k := range *a {
delete(*a, k)
}
BioSequenceAnnotationPool.Put(a)
}
}
// GetAnnotation returns an Annotation from the BioSequenceAnnotationPool.
//
// It takes as argument O or 1 Annotation annotation object.
// If an annotation object is passed, it is copied into the new Annotation.
//
// It returns an Annotation.
func GetAnnotation(values ...Annotation) Annotation {
a := Annotation(nil)
for a == nil {
a = *(BioSequenceAnnotationPool.Get().(*Annotation))
}
if len(values) > 0 {
obiutils.MustFillMap(a, values[0])
}
return a
}