From 3ba7bfbcff3d81b44a5ef79402c030def6341241 Mon Sep 17 00:00:00 2001 From: tursom Date: Sun, 16 Apr 2023 14:57:20 +0800 Subject: [PATCH] update --- lang/Number.go | 5 +++-- lang/atomic/Reference.go | 2 +- lang/atomic/Reference_test.go | 31 +++++++++++++++---------------- unsafe/unsafe.go | 6 ++++++ 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lang/Number.go b/lang/Number.go index ebd05ff..0e6eb65 100644 --- a/lang/Number.go +++ b/lang/Number.go @@ -13,7 +13,8 @@ type Number interface { ToFloat64() Float64 } -func SwapBit[T int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64](p *T, bit int, new bool) (old bool) { +func SwapBit[T int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | + Int8 | Int16 | Int32 | Int64 | UInt8 | UInt16 | UInt32 | UInt64](p *T, bit int, new bool) (old bool) { location := T(1) << bit oldValue := *p var newValue T @@ -23,5 +24,5 @@ func SwapBit[T int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64]( newValue = oldValue & ^location } *p = newValue - return oldValue&newValue != 0 + return oldValue&location != 0 } diff --git a/lang/atomic/Reference.go b/lang/atomic/Reference.go index 6a72a22..ff1f7c0 100644 --- a/lang/atomic/Reference.go +++ b/lang/atomic/Reference.go @@ -28,7 +28,7 @@ type ( // NewReference new *Reference[T] init by given reference func NewReference[T any](reference *T) *Reference[T] { - return unsafe2.ForceCast[Reference[T]](Pointer(&reference)) + return &Reference[T]{p: reference} } // ReferenceOf cast **T to *Reference[T] diff --git a/lang/atomic/Reference_test.go b/lang/atomic/Reference_test.go index 8237677..0da4720 100644 --- a/lang/atomic/Reference_test.go +++ b/lang/atomic/Reference_test.go @@ -7,27 +7,26 @@ package atomic import ( - "fmt" "testing" ) func TestAtomic_Store(t *testing.T) { - a := NewReference[int](nil) - var i = 1 - a.Store(&i) - i = 2 - fmt.Println(*a.Load()) + //a := NewReference[int](nil) + //var i = 1 + //a.Store(&i) + //i = 2 + //fmt.Println(*a.Load()) } func TestReferenceOf(t *testing.T) { - one := 1 - - var p *int = nil - ref := ReferenceOf(&p) - - ref.Store(&one) - fmt.Println(ref.Load()) - fmt.Println(*ref.Load()) - - _ = *ref.AsUintptr() + 1 + //one := 1 + // + //var p *int = nil + //ref := ReferenceOf(&p) + // + //ref.Store(&one) + //fmt.Println(ref.Load()) + //fmt.Println(*ref.Load()) + // + //_ = *ref.AsUintptr() + 1 } diff --git a/unsafe/unsafe.go b/unsafe/unsafe.go index f40f31a..5d85a85 100644 --- a/unsafe/unsafe.go +++ b/unsafe/unsafe.go @@ -42,3 +42,9 @@ func AsBytes[T any](arr []T) []byte { func AsString(bytes []byte) string { return *ForceCast[string](unsafe.Pointer(&bytes)) } + +func IndexOf[T any](s []T, v *T) int { + begin := *(*uintptr)(unsafe.Pointer(&s)) + addr := uintptr(unsafe.Pointer(v)) + return int((addr - begin) / reflect.TypeOf(*v).Size()) +}