From c7f63caccc06bd6f77664db8ab0948d4e75c2fb1 Mon Sep 17 00:00:00 2001 From: tursom Date: Sat, 3 Dec 2022 21:37:16 +0800 Subject: [PATCH] add DCL singleton implement --- lang/Array.go | 22 +++++++++++++--------- lang/Int8.go | 9 +++++++++ util/Singleton.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 util/Singleton.go diff --git a/lang/Array.go b/lang/Array.go index b934e9b..576ffe7 100644 --- a/lang/Array.go +++ b/lang/Array.go @@ -3,14 +3,18 @@ package lang type ( Array[T any] []T - Int8Array Array[int32] - Int16Array Array[int32] - Int32Array Array[int32] - Int64Array Array[int64] - UInt8Array Array[uint32] - UInt16Array Array[uint32] - UInt32Array Array[uint32] - UInt64Array Array[uint64] + Int8Array Array[Int32] + Int16Array Array[Int32] + Int32Array Array[Int32] + Int64Array Array[Int64] + UInt8Array Array[UInt8] + UInt16Array Array[UInt16] + UInt32Array Array[UInt32] + UInt64Array Array[UInt64] + Float32Array Array[Float32] + Float64Array Array[Float64] + Complex64Array Array[Complex64] + Complex128Array Array[Complex128] ) func (a Array[T]) Array() []T { @@ -21,7 +25,7 @@ func (a Int8Array) SetBit(bit int, up bool) (old bool) { arrIndex := bit / 8 i := &a[arrIndex] - return SwapBit(i, bit%8, up) + return a[arrIndex].SwapBit(bit%8, up) } func (a Int16Array) SetBit(bit int, up bool) (old bool) { diff --git a/lang/Int8.go b/lang/Int8.go index d42d3cd..b194c03 100644 --- a/lang/Int8.go +++ b/lang/Int8.go @@ -99,6 +99,15 @@ func (i Int8) ToFloat64() Float64 { return Float64(i) } +func (i *Int8) BitLength() int { + return 8 +} + +func (i *Int8) SetBit(bit int, up bool) (old bool) { + //TODO implement me + panic("implement me") +} + func HashInt8(i int8) int32 { return HashInt32(int32(i)) } diff --git a/util/Singleton.go b/util/Singleton.go new file mode 100644 index 0000000..0453c04 --- /dev/null +++ b/util/Singleton.go @@ -0,0 +1,33 @@ +package util + +import "sync" + +// Singleton DCL singleton implement +type Singleton[T any] struct { + value T + init func() T + lock sync.Mutex +} + +func NewSingleton[T any](init func() T) *Singleton[T] { + if init == nil { + panic("nil singleton initializer") + } + + return &Singleton[T]{ + init: init, + } +} + +func (s *Singleton[T]) Get() T { + if s.init != nil { + s.lock.Lock() + s.lock.Unlock() + if s.init != nil { + s.value = s.init() + s.init = nil + } + } + + return s.value +}