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  }