mirror of
https://github.com/tursom/GoCollections.git
synced 2025-03-16 11:00:14 +08:00
194 lines
4.1 KiB
Go
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)
|
|
}
|