github.com/sandwich-go/boost@v1.3.29/xcontainer/templates/sarray/sarray.go (about)

     1  // sarray 包提供了一个同步的数组实现
     2  // 可以产生一个带读写锁的线程安全的SyncArray,也可以产生一个非线程安全的SyncArray
     3  // New 产生非协程安全的版本
     4  // NewSync 产生协程安全的版本
     5  package sarray
     6  
     7  import (
     8  	"encoding/json"
     9  	"fmt"
    10  	"math/rand"
    11  	"sort"
    12  	"sync"
    13  )
    14  
    15  //template type SyncArray(VType)
    16  
    17  type VType interface{}
    18  
    19  // SyncArray 包含一个读写锁和一个切片,根据不同需求可提供对切片协程安全版本或者非协程安全版本的实例
    20  type SyncArray struct {
    21  	mu    *localRWMutexVType
    22  	array []VType
    23  }
    24  
    25  // New 创建非协程安全版本
    26  func New() *SyncArray { return newWithSafe(false) }
    27  
    28  // NewSync 创建协程安全版本
    29  func NewSync() *SyncArray { return newWithSafe(true) }
    30  
    31  func newWithSafe(safe bool) *SyncArray {
    32  	return &SyncArray{
    33  		mu:    newLocalRWMutexVType(safe),
    34  		array: make([]VType, 0),
    35  	}
    36  }
    37  
    38  // At 返回指定位置元素,如果越界则返回默认空值
    39  func (a *SyncArray) At(index int) (value VType) {
    40  	value, _ = a.Get(index)
    41  	return
    42  }
    43  
    44  // Get 返回指定位置元素,found标识元素是否存在
    45  func (a *SyncArray) Get(index int) (value VType, found bool) {
    46  	a.mu.RLock()
    47  	defer a.mu.RUnlock()
    48  	if index < 0 || index >= len(a.array) {
    49  		return
    50  	}
    51  	return a.array[index], true
    52  }
    53  
    54  func (a *SyncArray) errorIndexOutRangeUnLock(index int) error {
    55  	return fmt.Errorf("index %d out of array range %d", index, len(a.array))
    56  }
    57  
    58  // Set 设定指定位置数据
    59  func (a *SyncArray) Set(index int, value VType) error {
    60  	a.mu.Lock()
    61  	defer a.mu.Unlock()
    62  	if index < 0 || index >= len(a.array) {
    63  		return a.errorIndexOutRangeUnLock(index)
    64  	}
    65  	a.array[index] = value
    66  	return nil
    67  }
    68  
    69  // SetArray 替换底层存储
    70  func (a *SyncArray) SetArray(array []VType) *SyncArray {
    71  	a.mu.Lock()
    72  	defer a.mu.Unlock()
    73  	a.array = array
    74  	return a
    75  }
    76  
    77  // Replace 替换指定位置元素
    78  func (a *SyncArray) Replace(given []VType) *SyncArray {
    79  	a.mu.Lock()
    80  	defer a.mu.Unlock()
    81  	max := len(given)
    82  	if max > len(a.array) {
    83  		max = len(a.array)
    84  	}
    85  	for i := 0; i < max; i++ {
    86  		a.array[i] = given[i]
    87  	}
    88  	return a
    89  }
    90  
    91  // SortFunc  根据指定的方法进行排序
    92  func (a *SyncArray) SortFunc(less func(v1, v2 VType) bool) *SyncArray {
    93  	a.mu.Lock()
    94  	defer a.mu.Unlock()
    95  	sort.Slice(a.array, func(i, j int) bool {
    96  		return less(a.array[i], a.array[j])
    97  	})
    98  	return a
    99  }
   100  
   101  // InsertBefore 在index位置前插入数据
   102  func (a *SyncArray) InsertBefore(index int, value VType) error {
   103  	a.mu.Lock()
   104  	defer a.mu.Unlock()
   105  	if index < 0 || index >= len(a.array) {
   106  		return a.errorIndexOutRangeUnLock(index)
   107  	}
   108  	rear := append([]VType{}, a.array[index:]...)
   109  	a.array = append(a.array[0:index], value)
   110  	a.array = append(a.array, rear...)
   111  	return nil
   112  }
   113  
   114  // InsertAfter 在index位置后插入数据
   115  func (a *SyncArray) InsertAfter(index int, value VType) error {
   116  	a.mu.Lock()
   117  	defer a.mu.Unlock()
   118  	if index < 0 || index >= len(a.array) {
   119  		return a.errorIndexOutRangeUnLock(index)
   120  	}
   121  	rear := append([]VType{}, a.array[index+1:]...)
   122  	a.array = append(a.array[0:index+1], value)
   123  	a.array = append(a.array, rear...)
   124  	return nil
   125  }
   126  
   127  // Contains  是否存在value
   128  func (a *SyncArray) Contains(value VType) bool {
   129  	return a.Search(value) != -1
   130  }
   131  
   132  // Search 查找元素,如果存在则返回index,不存在返回-1
   133  func (a *SyncArray) Search(value VType) int {
   134  	a.mu.RLock()
   135  	defer a.mu.RUnlock()
   136  	if len(a.array) == 0 {
   137  		return -1
   138  	}
   139  	result := -1
   140  	for index, v := range a.array {
   141  		if v == value {
   142  			result = index
   143  			break
   144  		}
   145  	}
   146  	return result
   147  }
   148  
   149  // DeleteValue 查找并删除找到的第一个元素,不存在返回false
   150  func (a *SyncArray) DeleteValue(value VType) (found bool) {
   151  	if i := a.Search(value); i != -1 {
   152  		_, found = a.LoadAndDelete(i)
   153  		return found
   154  	}
   155  	return false
   156  }
   157  
   158  // LoadAndDelete 删除元素,如果删除成功返回被删除的元素
   159  func (a *SyncArray) LoadAndDelete(index int) (value VType, found bool) {
   160  	a.mu.Lock()
   161  	defer a.mu.Unlock()
   162  	return a.doDeleteWithoutLock(index)
   163  }
   164  
   165  // doRemoveWithoutLock 不加锁移除元素
   166  func (a *SyncArray) doDeleteWithoutLock(index int) (value VType, found bool) {
   167  	if index < 0 || index >= len(a.array) {
   168  		return
   169  	}
   170  	if index == 0 {
   171  		value = a.array[0]
   172  		a.array = a.array[1:]
   173  		return value, true
   174  	} else if index == len(a.array)-1 {
   175  		value = a.array[index]
   176  		a.array = a.array[:index]
   177  		return value, true
   178  	}
   179  	value = a.array[index]
   180  	a.array = append(a.array[:index], a.array[index+1:]...)
   181  	return value, true
   182  }
   183  
   184  // PushLeft 头插入
   185  func (a *SyncArray) PushLeft(value ...VType) *SyncArray {
   186  	a.mu.Lock()
   187  	a.array = append(value, a.array...)
   188  	a.mu.Unlock()
   189  	return a
   190  }
   191  
   192  // PushRight 尾插入
   193  func (a *SyncArray) PushRight(value ...VType) *SyncArray {
   194  	a.mu.Lock()
   195  	a.array = append(a.array, value...)
   196  	a.mu.Unlock()
   197  	return a
   198  }
   199  
   200  // PopLeft 头弹出
   201  func (a *SyncArray) PopLeft() (value VType, found bool) {
   202  	a.mu.Lock()
   203  	defer a.mu.Unlock()
   204  	if len(a.array) == 0 {
   205  		return
   206  	}
   207  	value = a.array[0]
   208  	a.array = a.array[1:]
   209  	return value, true
   210  }
   211  
   212  // PopRight 尾弹出
   213  func (a *SyncArray) PopRight() (value VType, found bool) {
   214  	a.mu.Lock()
   215  	defer a.mu.Unlock()
   216  	index := len(a.array) - 1
   217  	if index < 0 {
   218  		return
   219  	}
   220  	value = a.array[index]
   221  	a.array = a.array[:index]
   222  	return value, true
   223  }
   224  
   225  // PopRand 随机弹出
   226  func (a *SyncArray) PopRand() (value VType, found bool) {
   227  	a.mu.Lock()
   228  	defer a.mu.Unlock()
   229  	return a.doDeleteWithoutLock(rand.Intn(len(a.array)))
   230  }
   231  
   232  // PopRands 随机n个元素并弹出,如果size大于数组尺寸则全部弹出
   233  func (a *SyncArray) PopRands(size int) []VType {
   234  	a.mu.Lock()
   235  	defer a.mu.Unlock()
   236  	if size <= 0 || len(a.array) == 0 {
   237  		return nil
   238  	}
   239  	if size >= len(a.array) {
   240  		size = len(a.array)
   241  	}
   242  	array := make([]VType, size)
   243  	for i := 0; i < size; i++ {
   244  		array[i], _ = a.doDeleteWithoutLock(rand.Intn(len(a.array)))
   245  	}
   246  	return array
   247  }
   248  
   249  // Append 尾添加元素 alias of PushRight
   250  func (a *SyncArray) Append(value ...VType) *SyncArray { return a.PushRight(value...) }
   251  
   252  // Len 获取长度
   253  func (a *SyncArray) Len() int {
   254  	a.mu.RLock()
   255  	length := len(a.array)
   256  	a.mu.RUnlock()
   257  	return length
   258  }
   259  
   260  // Slice 获取底层数据存储,如果为sync安全模式则返回一份拷贝,否则直接返回底层数据指针
   261  func (a *SyncArray) Slice() []VType {
   262  	array := ([]VType)(nil)
   263  	if a.mu.IsSafe() {
   264  		a.mu.RLock()
   265  		defer a.mu.RUnlock()
   266  		array = make([]VType, len(a.array))
   267  		copy(array, a.array)
   268  	} else {
   269  		array = a.array
   270  	}
   271  	return array
   272  }
   273  
   274  // Clear 清空存储
   275  func (a *SyncArray) Clear() *SyncArray {
   276  	a.mu.Lock()
   277  	if len(a.array) > 0 {
   278  		a.array = make([]VType, 0)
   279  	}
   280  	a.mu.Unlock()
   281  	return a
   282  }
   283  
   284  // LockFunc 写锁操作array
   285  func (a *SyncArray) LockFunc(f func(array []VType)) *SyncArray {
   286  	a.mu.Lock()
   287  	defer a.mu.Unlock()
   288  	f(a.array)
   289  	return a
   290  }
   291  
   292  // RLockFunc 读锁操作array
   293  func (a *SyncArray) RLockFunc(f func(array []VType)) *SyncArray {
   294  	a.mu.RLock()
   295  	defer a.mu.RUnlock()
   296  	f(a.array)
   297  	return a
   298  }
   299  
   300  // Rand 随机一个元素
   301  func (a *SyncArray) Rand() (value VType, found bool) {
   302  	a.mu.RLock()
   303  	defer a.mu.RUnlock()
   304  	if len(a.array) == 0 {
   305  		return
   306  	}
   307  	return a.array[rand.Intn(len(a.array))], true
   308  }
   309  
   310  // WalkAsc 按照index从小到大的顺序进行遍历,并将k,v作为参数执行f。如果f执行返回false则中止
   311  func (a *SyncArray) WalkAsc(f func(k int, v VType) bool) {
   312  	a.mu.RLock()
   313  	defer a.mu.RUnlock()
   314  	for k, v := range a.array {
   315  		if !f(k, v) {
   316  			break
   317  		}
   318  	}
   319  }
   320  
   321  // WalkDesc 按照index从大到小的顺序进行遍历,并将k,v作为参数执行f。如果f执行返回false则中止
   322  func (a *SyncArray) WalkDesc(f func(k int, v VType) bool) {
   323  	a.mu.RLock()
   324  	defer a.mu.RUnlock()
   325  	for i := len(a.array) - 1; i >= 0; i-- {
   326  		if !f(i, a.array[i]) {
   327  			break
   328  		}
   329  	}
   330  }
   331  
   332  // MarshalJSON 序列化到json
   333  func (a SyncArray) MarshalJSON() ([]byte, error) {
   334  	a.mu.RLock()
   335  	defer a.mu.RUnlock()
   336  	return json.Marshal(a.array)
   337  }
   338  
   339  // UnmarshalJSON 由json反序列化
   340  func (a *SyncArray) UnmarshalJSON(b []byte) error {
   341  	if a.array == nil {
   342  		a.array = make([]VType, 0)
   343  	}
   344  	a.mu.Lock()
   345  	defer a.mu.Unlock()
   346  	if err := json.Unmarshal(b, &a.array); err != nil {
   347  		return err
   348  	}
   349  	return nil
   350  }
   351  
   352  // Empty 是否为空
   353  func (a *SyncArray) Empty() bool { return a.Len() == 0 }
   354  
   355  type localRWMutexVType struct {
   356  	*sync.RWMutex
   357  }
   358  
   359  func newLocalRWMutexVType(safe bool) *localRWMutexVType {
   360  	mu := localRWMutexVType{}
   361  	if safe {
   362  		mu.RWMutex = new(sync.RWMutex)
   363  	}
   364  	return &mu
   365  }
   366  
   367  func (mu *localRWMutexVType) IsSafe() bool {
   368  	return mu.RWMutex != nil
   369  }
   370  
   371  func (mu *localRWMutexVType) Lock() {
   372  	if mu.RWMutex != nil {
   373  		mu.RWMutex.Lock()
   374  	}
   375  }
   376  
   377  func (mu *localRWMutexVType) Unlock() {
   378  	if mu.RWMutex != nil {
   379  		mu.RWMutex.Unlock()
   380  	}
   381  }
   382  
   383  func (mu *localRWMutexVType) RLock() {
   384  	if mu.RWMutex != nil {
   385  		mu.RWMutex.RLock()
   386  	}
   387  }
   388  
   389  func (mu *localRWMutexVType) RUnlock() {
   390  	if mu.RWMutex != nil {
   391  		mu.RWMutex.RUnlock()
   392  	}
   393  }