GoCollections/lang/atomic/Array.go
2022-12-03 19:13:29 +08:00

194 lines
4.1 KiB
Go

/*
* Copyright (c) 2022 tursom. All rights reserved.
* Use of this source code is governed by a GPL-3
* license that can be found in the LICENSE file.
*/
package atomic
import "github.com/tursom/GoCollections/lang"
type (
Array[T any] lang.Array[*T]
Int32Array lang.Array[Int32]
Int64Array lang.Array[Int64]
UInt32Array lang.Array[UInt32]
UInt64Array lang.Array[UInt64]
)
func NewArray[T any](size int) Array[T] {
return make([]*T, size)
}
func CapArray[T any](array []*T) Array[T] {
return array
}
func NewInt32Array(size int) Int32Array {
return make(Int32Array, size)
}
func NewInt64Array(size int) Int64Array {
return make(Int64Array, size)
}
func NewUInt32Array(size int) UInt32Array {
return make(UInt32Array, size)
}
func NewUInt64Array(size int) UInt64Array {
return make(UInt64Array, size)
}
func (a Array[T]) Len() int {
return len(a)
}
func (a Array[T]) Array() []*T {
return a
}
func (a Array[T]) Get(index int) *T {
return GetAtomizer[T]().Load()(&a[index])
}
func (a Int32Array) Get(index int) int32 {
return a[index].Load()
}
func (a Int64Array) Get(index int) int64 {
return a[index].Load()
}
func (a UInt32Array) Get(index int) uint32 {
return a[index].Load()
}
func (a UInt64Array) Get(index int) uint64 {
return a[index].Load()
}
func (a Array[T]) Set(index int, p *T) {
GetAtomizer[T]().Store()(&a[index], p)
}
func (a Int32Array) Set(index int, v int32) {
a[index].Store(v)
}
func (a Int64Array) Set(index int, v int64) {
a[index].Store(v)
}
func (a UInt32Array) Set(index int, v uint32) {
a[index].Store(v)
}
func (a UInt64Array) Set(index int, v uint64) {
a[index].Store(v)
}
func (a Array[T]) Swap(index int, p *T) (old *T) {
return GetAtomizer[T]().Swap()(&a[index], p)
}
func (a Int32Array) Swap(index int, new int32) (old int32) {
return a[index].Swap(new)
}
func (a Int64Array) Swap(index int, new int64) (old int64) {
return a[index].Swap(new)
}
func (a UInt32Array) Swap(index int, new uint32) (old uint32) {
return a[index].Swap(new)
}
func (a UInt64Array) Swap(index int, new uint64) (old uint64) {
return a[index].Swap(new)
}
func (a Array[T]) CompareAndSwap(index int, old, new *T) (swapped bool) {
return GetAtomizer[T]().CompareAndSwap()(&a[index], old, new)
}
func (a Int32Array) CompareAndSwap(index int, old, new int32) (swapped bool) {
return a[index].CompareAndSwap(old, new)
}
func (a Int64Array) CompareAndSwap(index int, old, new int64) (swapped bool) {
return a[index].CompareAndSwap(old, new)
}
func (a UInt32Array) CompareAndSwap(index int, old, new uint32) (swapped bool) {
return a[index].CompareAndSwap(old, new)
}
func (a UInt64Array) CompareAndSwap(index int, old, new uint64) (swapped bool) {
return a[index].CompareAndSwap(old, new)
}
func (a Int32Array) Add(index int, value int32) {
a[index].Add(value)
}
func (a Int64Array) Add(index int, value int64) {
a[index].Add(value)
}
func (a UInt32Array) Add(index int, value uint32) {
a[index].Add(value)
}
func (a UInt64Array) Add(index int, value uint64) {
a[index].Add(value)
}
func (a Int32Array) BitLength() int {
return len(a) * 32
}
func (a Int64Array) BitLength() int {
return len(a) * 64
}
func (a UInt32Array) BitLength() int {
return len(a) * 32
}
func (a UInt64Array) BitLength() int {
return len(a) * 64
}
func (a Int32Array) SetBit(bit int, up bool) (old bool) {
return a[bit/32].SetBit(bit%32, up)
}
func (a Int64Array) SetBit(bit int, up bool) (old bool) {
return a[bit/64].SetBit(bit%64, up)
}
func (a UInt32Array) SetBit(bit int, up bool) (old bool) {
return a[bit/32].SetBit(bit%32, up)
}
func (a UInt64Array) SetBit(bit int, up bool) (old bool) {
return a[bit/64].SetBit(bit%64, up)
}
func (a Int32Array) CompareAndSwapBit(bit int, old, new bool) (swapped bool) {
return a[bit/32].CompareAndSwapBit(bit%32, old, new)
}
func (a Int64Array) CompareAndSwapBit(bit int, old, new bool) (swapped bool) {
return a[bit/64].CompareAndSwapBit(bit%64, old, new)
}
func (a UInt32Array) CompareAndSwapBit(bit int, old, new bool) (swapped bool) {
return a[bit/32].CompareAndSwapBit(bit%32, old, new)
}
func (a UInt64Array) CompareAndSwapBit(bit int, old, new bool) (swapped bool) {
return a[bit/64].CompareAndSwapBit(bit%64, old, new)
}