From 84c8cefea94f97b28341dab14182cb021794bae7 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Fri, 26 May 2023 10:07:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B6=E5=8F=91=E5=AE=89=E5=85=A8=E7=9A=84?= =?UTF-8?q?=E5=88=87=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/synchronization/slice.go | 59 +++++++++++++++++++++++++++ utils/synchronization/slice_option.go | 21 ++++++++++ 2 files changed, 80 insertions(+) create mode 100644 utils/synchronization/slice.go create mode 100644 utils/synchronization/slice_option.go diff --git a/utils/synchronization/slice.go b/utils/synchronization/slice.go new file mode 100644 index 0000000..4362615 --- /dev/null +++ b/utils/synchronization/slice.go @@ -0,0 +1,59 @@ +package synchronization + +import ( + "github.com/kercylan98/minotaur/utils/slice" + "sync" +) + +func NewSlice[T any](options ...SliceOption[T]) *Slice[T] { + s := &Slice[T]{} + for _, option := range options { + option(s) + } + return s +} + +type Slice[T any] struct { + rw sync.RWMutex + data []T +} + +func (slf *Slice[T]) Get(index int) T { + slf.rw.RLock() + defer slf.rw.RUnlock() + return slf.data[index] +} + +func (slf *Slice[T]) GetWithRange(start, end int) []T { + return slf.data[start:end] +} + +func (slf *Slice[T]) Set(index int, value T) { + slf.rw.Lock() + slf.data[index] = value + slf.rw.Unlock() +} + +func (slf *Slice[T]) Append(values ...T) { + slf.rw.Lock() + slf.data = append(slf.data, values...) + slf.rw.Unlock() +} + +func (slf *Slice[T]) Release() { + slf.rw.Lock() + slf.data = nil + slf.rw.Unlock() +} + +func (slf *Slice[T]) Clear() { + slf.rw.Lock() + slf.data = slf.data[:0] + slf.rw.Unlock() +} + +func (slf *Slice[T]) GetData() []T { + slf.rw.Lock() + defer slf.rw.Unlock() + return slice.Copy(slf.data) +} diff --git a/utils/synchronization/slice_option.go b/utils/synchronization/slice_option.go new file mode 100644 index 0000000..ce6fa13 --- /dev/null +++ b/utils/synchronization/slice_option.go @@ -0,0 +1,21 @@ +package synchronization + +type SliceOption[T any] func(slice *Slice[T]) + +func WithSliceLen[T any](len int) SliceOption[T] { + return func(slice *Slice[T]) { + slice.data = make([]T, len) + } +} + +func WithSliceCap[T any](cap int) SliceOption[T] { + return func(slice *Slice[T]) { + slice.data = make([]T, 0, cap) + } +} + +func WithSliceLenCap[T any](len, cap int) SliceOption[T] { + return func(slice *Slice[T]) { + slice.data = make([]T, len, cap) + } +}