From 57307c274c40936dda1d5f67b4bcf8803dcb5b41 Mon Sep 17 00:00:00 2001 From: qydysky Date: Thu, 14 Dec 2023 22:26:12 +0800 Subject: [PATCH] 1 --- slice/Blocks.go | 45 ++++++++++++++++++++++++++++++++++++++++++++ slice/Blocks_test.go | 12 ++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 slice/Blocks.go create mode 100644 slice/Blocks_test.go 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() + } +} -- 2.39.2