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