github.com/sandwich-go/boost@v1.3.29/xcontainer/sset/gen_any.go (about) 1 // Code generated by gotemplate. DO NOT EDIT. 2 3 // sset 包提供了多种类型的集合 4 // 可以产生一个带读写锁的线程安全的SyncSet,也可以产生一个非线程安全的SyncSet 5 // New 产生非协程安全的版本 6 // NewSync 产生协程安全的版本 7 package sset 8 9 import ( 10 "sync" 11 ) 12 13 //template type SyncSet(VType) 14 15 type Any struct { 16 mu *localRWMutexVTypeAny 17 data map[interface{}]struct{} 18 } 19 20 // New 创建非协程安全版本 21 func NewAny() *Any { return newWithSafeAny(false) } 22 23 // NewSync 创建协程安全版本 24 func NewSyncAny() *Any { return newWithSafeAny(true) } 25 26 func newWithSafeAny(safe bool) *Any { 27 return &Any{data: make(map[interface{}]struct{}), mu: newLocalRWMutexVTypeAny(safe)} 28 } 29 30 // Iterator 遍历 31 func (set *Any) Iterator(f func(v interface{}) bool) { 32 set.mu.RLock() 33 defer set.mu.RUnlock() 34 for k := range set.data { 35 if !f(k) { 36 break 37 } 38 } 39 } 40 41 // Add 添加元素 42 func (set *Any) Add(items ...interface{}) { 43 set.mu.Lock() 44 if set.data == nil { 45 set.data = make(map[interface{}]struct{}) 46 } 47 for _, v := range items { 48 set.data[v] = struct{}{} 49 } 50 set.mu.Unlock() 51 } 52 53 // AddIfNotExist 如果元素不存在则添加,如添加成功则返回true 54 func (set *Any) AddIfNotExist(item interface{}) (addOK bool) { 55 if !set.Contains(item) { 56 set.mu.Lock() 57 defer set.mu.Unlock() 58 if set.data == nil { 59 set.data = make(map[interface{}]struct{}) 60 } 61 if _, ok := set.data[item]; !ok { 62 set.data[item] = struct{}{} 63 return true 64 } 65 } 66 return false 67 } 68 69 // AddIfNotExistFunc 如果元素不存在且f返回true则添加,如添加成功则返回true 70 // f函数运行在lock之外 71 func (set *Any) AddIfNotExistFunc(item interface{}, f func() bool) bool { 72 if !set.Contains(item) { 73 if f() { 74 set.mu.Lock() 75 defer set.mu.Unlock() 76 if set.data == nil { 77 set.data = make(map[interface{}]struct{}) 78 } 79 if _, ok := set.data[item]; !ok { 80 set.data[item] = struct{}{} 81 return true 82 } 83 } 84 } 85 return false 86 } 87 88 // AddIfNotExistFuncLock 如果元素不存在且f返回true则添加,如添加成功则返回true 89 // f函数运行在lock之内 90 func (set *Any) AddIfNotExistFuncLock(item interface{}, f func() bool) bool { 91 if !set.Contains(item) { 92 set.mu.Lock() 93 defer set.mu.Unlock() 94 if set.data == nil { 95 set.data = make(map[interface{}]struct{}) 96 } 97 if f() { 98 if _, ok := set.data[item]; !ok { 99 set.data[item] = struct{}{} 100 return true 101 } 102 } 103 } 104 return false 105 } 106 107 // Contains 是否存在元素 108 func (set *Any) Contains(item interface{}) bool { 109 var ok bool 110 set.mu.RLock() 111 if set.data != nil { 112 _, ok = set.data[item] 113 } 114 set.mu.RUnlock() 115 return ok 116 } 117 118 // Remove 移除指定元素 119 func (set *Any) Remove(item interface{}) { 120 set.mu.Lock() 121 if set.data != nil { 122 delete(set.data, item) 123 } 124 set.mu.Unlock() 125 } 126 127 // Size 返回长度 128 func (set *Any) Size() int { 129 set.mu.RLock() 130 l := len(set.data) 131 set.mu.RUnlock() 132 return l 133 } 134 135 // Clear 清理元素 136 func (set *Any) Clear() { 137 set.mu.Lock() 138 set.data = make(map[interface{}]struct{}) 139 set.mu.Unlock() 140 } 141 142 // Slice 返回元素slice 143 func (set *Any) Slice() []interface{} { 144 set.mu.RLock() 145 var i = 0 146 var ret = make([]interface{}, len(set.data)) 147 for item := range set.data { 148 ret[i] = item 149 i++ 150 } 151 set.mu.RUnlock() 152 return ret 153 } 154 155 // LockFunc 锁住当前set调用方法f 156 func (set *Any) LockFunc(f func(m map[interface{}]struct{})) { 157 set.mu.Lock() 158 defer set.mu.Unlock() 159 f(set.data) 160 } 161 162 // RLockFunc 读锁住当前set调用方法f 163 func (set *Any) RLockFunc(f func(m map[interface{}]struct{})) { 164 set.mu.RLock() 165 defer set.mu.RUnlock() 166 f(set.data) 167 } 168 169 // Equal 是否相等 170 func (set *Any) Equal(other *Any) bool { 171 if set == other { 172 return true 173 } 174 set.mu.RLock() 175 defer set.mu.RUnlock() 176 other.mu.RLock() 177 defer other.mu.RUnlock() 178 if len(set.data) != len(other.data) { 179 return false 180 } 181 for key := range set.data { 182 if _, ok := other.data[key]; !ok { 183 return false 184 } 185 } 186 return true 187 } 188 189 // Merge 合并set,返回当前set 190 func (set *Any) Merge(others ...*Any) *Any { 191 set.mu.Lock() 192 defer set.mu.Unlock() 193 for _, other := range others { 194 if set != other { 195 other.mu.RLock() 196 } 197 for k, v := range other.data { 198 set.data[k] = v 199 } 200 if set != other { 201 other.mu.RUnlock() 202 } 203 } 204 return set 205 } 206 207 // Walk 对每个元素作用f方法 208 func (set *Any) Walk(f func(item interface{}) interface{}) *Any { 209 set.mu.Lock() 210 defer set.mu.Unlock() 211 m := make(map[interface{}]struct{}, len(set.data)) 212 for k, v := range set.data { 213 m[f(k)] = v 214 } 215 set.data = m 216 return set 217 } 218 219 type localRWMutexVTypeAny struct { 220 *sync.RWMutex 221 } 222 223 func newLocalRWMutexVTypeAny(safe bool) *localRWMutexVTypeAny { 224 mu := localRWMutexVTypeAny{} 225 if safe { 226 mu.RWMutex = new(sync.RWMutex) 227 } 228 return &mu 229 } 230 231 func (mu *localRWMutexVTypeAny) IsSafe() bool { 232 return mu.RWMutex != nil 233 } 234 235 func (mu *localRWMutexVTypeAny) Lock() { 236 if mu.RWMutex != nil { 237 mu.RWMutex.Lock() 238 } 239 } 240 241 func (mu *localRWMutexVTypeAny) Unlock() { 242 if mu.RWMutex != nil { 243 mu.RWMutex.Unlock() 244 } 245 } 246 247 func (mu *localRWMutexVTypeAny) RLock() { 248 if mu.RWMutex != nil { 249 mu.RWMutex.RLock() 250 } 251 } 252 253 func (mu *localRWMutexVTypeAny) RUnlock() { 254 if mu.RWMutex != nil { 255 mu.RWMutex.RUnlock() 256 } 257 } 258 259 //template format 260 var __formatToAny = func(i interface{}) interface{} { 261 return i 262 }