sync_slice.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package syncutils
  2. import "sync"
  3. type RangeFunc[T any] func(index int, e T) bool
  4. type SyncSlice[T any] struct {
  5. writeLocker sync.Locker
  6. readLocker sync.Locker
  7. s []T
  8. }
  9. func NewSyncSlice[T any](s []T, isRWMutex bool) *SyncSlice[T] {
  10. var writeLocker sync.Locker
  11. var readLocker sync.Locker
  12. if !isRWMutex {
  13. mutex := &sync.Mutex{}
  14. writeLocker = mutex
  15. readLocker = mutex
  16. } else {
  17. mutex := &sync.RWMutex{}
  18. writeLocker = mutex
  19. readLocker = mutex.RLocker()
  20. }
  21. return &SyncSlice[T]{
  22. writeLocker: writeLocker,
  23. readLocker: readLocker,
  24. s: s,
  25. }
  26. }
  27. func (syncSlice *SyncSlice[T]) Lock() {
  28. syncSlice.writeLocker.Lock()
  29. }
  30. func (syncSlice *SyncSlice[T]) Unlock() {
  31. syncSlice.writeLocker.Unlock()
  32. }
  33. func (syncSlice *SyncSlice[T]) RLock() {
  34. syncSlice.readLocker.Lock()
  35. }
  36. func (syncSlice *SyncSlice[T]) RUnlock() {
  37. syncSlice.readLocker.Unlock()
  38. }
  39. func (syncSlice *SyncSlice[T]) AppendNoLock(elements ...T) {
  40. if elements == nil || len(elements) == 0 {
  41. return
  42. }
  43. syncSlice.appendNoLock(elements...)
  44. }
  45. func (syncSlice *SyncSlice[T]) DeleteAtNoLock(index int) T {
  46. if index < 0 {
  47. var zero T
  48. return zero
  49. }
  50. return syncSlice.deleteAtNoLock(index)
  51. }
  52. func (syncSlice *SyncSlice[T]) RangeNoLock(rangeFunc RangeFunc[T]) {
  53. if rangeFunc == nil {
  54. return
  55. }
  56. syncSlice.rangeNoLock(rangeFunc)
  57. }
  58. func (syncSlice *SyncSlice[T]) LenNoLock() int {
  59. return syncSlice.lenNoLock()
  60. }
  61. func (syncSlice *SyncSlice[T]) CapNoLock() int {
  62. return syncSlice.capNoLock()
  63. }
  64. func (syncSlice *SyncSlice[T]) Append(elements ...T) {
  65. if elements == nil || len(elements) == 0 {
  66. return
  67. }
  68. syncSlice.writeLocker.Lock()
  69. defer syncSlice.writeLocker.Unlock()
  70. syncSlice.appendNoLock(elements...)
  71. }
  72. func (syncSlice *SyncSlice[T]) DeleteAt(index int) T {
  73. if index < 0 {
  74. var zero T
  75. return zero
  76. }
  77. syncSlice.writeLocker.Lock()
  78. defer syncSlice.writeLocker.Unlock()
  79. return syncSlice.deleteAtNoLock(index)
  80. }
  81. func (syncSlice *SyncSlice[T]) Range(rangeFunc RangeFunc[T]) {
  82. if rangeFunc == nil {
  83. return
  84. }
  85. syncSlice.readLocker.Lock()
  86. defer syncSlice.readLocker.Unlock()
  87. syncSlice.rangeNoLock(rangeFunc)
  88. }
  89. func (syncSlice *SyncSlice[T]) Len() int {
  90. syncSlice.readLocker.Lock()
  91. defer syncSlice.readLocker.Unlock()
  92. return syncSlice.lenNoLock()
  93. }
  94. func (syncSlice *SyncSlice[T]) Cap() int {
  95. syncSlice.readLocker.Lock()
  96. defer syncSlice.readLocker.Unlock()
  97. return syncSlice.capNoLock()
  98. }
  99. func (syncSlice *SyncSlice[T]) appendNoLock(elements ...T) {
  100. syncSlice.s = append(syncSlice.s, elements...)
  101. }
  102. func (syncSlice *SyncSlice[T]) deleteAtNoLock(index int) T {
  103. if len(syncSlice.s)-1 < index {
  104. var zero T
  105. return zero
  106. }
  107. v := syncSlice.s[index]
  108. syncSlice.s = append(syncSlice.s[:index], syncSlice.s[index+1:]...)
  109. return v
  110. }
  111. func (syncSlice *SyncSlice[T]) rangeNoLock(rangeFunc RangeFunc[T]) {
  112. for i, e := range syncSlice.s {
  113. stop := rangeFunc(i, e)
  114. if stop {
  115. return
  116. }
  117. }
  118. }
  119. func (syncSlice *SyncSlice[T]) lenNoLock() int {
  120. return len(syncSlice.s)
  121. }
  122. func (syncSlice *SyncSlice[T]) capNoLock() int {
  123. return cap(syncSlice.s)
  124. }