From: qydysky Date: Thu, 14 Dec 2023 14:26:12 +0000 (+0800) Subject: 1 X-Git-Tag: v0.28.20231214142916 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=57307c274c40936dda1d5f67b4bcf8803dcb5b41;p=part%2F.git 1 --- diff --git a/slice/Blocks.go b/slice/Blocks.go new file mode 100644 index 0000000..5de6c8a --- /dev/null +++ b/slice/Blocks.go @@ -0,0 +1,45 @@ +package part + +import ( + "errors" +) + +type blocks[T any] struct { + free chan int + size int + buf []T +} + +var ErrOverflow = errors.New("ErrOverflow") + +func NewBlocks[T any](blockSize int, blockNum int) *blocks[T] { + p := &blocks[T]{ + size: blockSize, + free: make(chan int, blockNum+1), + buf: make([]T, blockSize*blockNum), + } + for i := 0; i < blockNum; i++ { + p.free <- i + } + return p +} + +// // eg +// +// if tmpbuf, putBack, e := buf.Get(); e == nil { +// clear(tmpbuf) +// // do something with tmpbuf +// putBack() +// } +func (t *blocks[T]) Get() ([]T, func(), error) { + select { + case offset := <-t.free: + offset *= t.size + return t.buf[offset : offset+t.size], func() { + clear(t.buf[offset : offset+t.size]) + t.free <- offset + }, nil + default: + return nil, func() {}, ErrOverflow + } +} diff --git a/slice/Blocks_test.go b/slice/Blocks_test.go new file mode 100644 index 0000000..b6eae39 --- /dev/null +++ b/slice/Blocks_test.go @@ -0,0 +1,12 @@ +package part + +import "testing" + +func TestMain(t *testing.T) { + buf := NewBlocks[byte](1024, 10) + if tmpbuf, putBack, e := buf.Get(); e == nil { + clear(tmpbuf) + // do something with tmpbuf + putBack() + } +}