github.com/sandwich-go/boost@v1.3.29/xcontainer/sset/gen_uint16.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  	"strconv"
    11  	"sync"
    12  )
    13  
    14  //template type SyncSet(VType)
    15  
    16  type Uint16 struct {
    17  	mu   *localRWMutexVTypeUint16
    18  	data map[uint16]struct{}
    19  }
    20  
    21  // New 创建非协程安全版本
    22  func NewUint16() *Uint16 { return newWithSafeUint16(false) }
    23  
    24  // NewSync 创建协程安全版本
    25  func NewSyncUint16() *Uint16 { return newWithSafeUint16(true) }
    26  
    27  func newWithSafeUint16(safe bool) *Uint16 {
    28  	return &Uint16{data: make(map[uint16]struct{}), mu: newLocalRWMutexVTypeUint16(safe)}
    29  }
    30  
    31  // Iterator 遍历
    32  func (set *Uint16) Iterator(f func(v uint16) 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 *Uint16) Add(items ...uint16) {
    44  	set.mu.Lock()
    45  	if set.data == nil {
    46  		set.data = make(map[uint16]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 *Uint16) AddIfNotExist(item uint16) (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[uint16]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 *Uint16) AddIfNotExistFunc(item uint16, 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[uint16]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 *Uint16) AddIfNotExistFuncLock(item uint16, 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[uint16]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 *Uint16) Contains(item uint16) 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 *Uint16) Remove(item uint16) {
   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 *Uint16) 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 *Uint16) Clear() {
   138  	set.mu.Lock()
   139  	set.data = make(map[uint16]struct{})
   140  	set.mu.Unlock()
   141  }
   142  
   143  // Slice 返回元素slice
   144  func (set *Uint16) Slice() []uint16 {
   145  	set.mu.RLock()
   146  	var i = 0
   147  	var ret = make([]uint16, 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 *Uint16) LockFunc(f func(m map[uint16]struct{})) {
   158  	set.mu.Lock()
   159  	defer set.mu.Unlock()
   160  	f(set.data)
   161  }
   162  
   163  // RLockFunc 读锁住当前set调用方法f
   164  func (set *Uint16) RLockFunc(f func(m map[uint16]struct{})) {
   165  	set.mu.RLock()
   166  	defer set.mu.RUnlock()
   167  	f(set.data)
   168  }
   169  
   170  // Equal 是否相等
   171  func (set *Uint16) Equal(other *Uint16) 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 *Uint16) Merge(others ...*Uint16) *Uint16 {
   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 *Uint16) Walk(f func(item uint16) uint16) *Uint16 {
   210  	set.mu.Lock()
   211  	defer set.mu.Unlock()
   212  	m := make(map[uint16]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 localRWMutexVTypeUint16 struct {
   221  	*sync.RWMutex
   222  }
   223  
   224  func newLocalRWMutexVTypeUint16(safe bool) *localRWMutexVTypeUint16 {
   225  	mu := localRWMutexVTypeUint16{}
   226  	if safe {
   227  		mu.RWMutex = new(sync.RWMutex)
   228  	}
   229  	return &mu
   230  }
   231  
   232  func (mu *localRWMutexVTypeUint16) IsSafe() bool {
   233  	return mu.RWMutex != nil
   234  }
   235  
   236  func (mu *localRWMutexVTypeUint16) Lock() {
   237  	if mu.RWMutex != nil {
   238  		mu.RWMutex.Lock()
   239  	}
   240  }
   241  
   242  func (mu *localRWMutexVTypeUint16) Unlock() {
   243  	if mu.RWMutex != nil {
   244  		mu.RWMutex.Unlock()
   245  	}
   246  }
   247  
   248  func (mu *localRWMutexVTypeUint16) RLock() {
   249  	if mu.RWMutex != nil {
   250  		mu.RWMutex.RLock()
   251  	}
   252  }
   253  
   254  func (mu *localRWMutexVTypeUint16) RUnlock() {
   255  	if mu.RWMutex != nil {
   256  		mu.RWMutex.RUnlock()
   257  	}
   258  }
   259  
   260  //template format
   261  var __formatToUint16 = func(i interface{}) uint16 {
   262  	switch ii := i.(type) {
   263  	case int:
   264  		return uint16(ii)
   265  	case int8:
   266  		return uint16(ii)
   267  	case int16:
   268  		return uint16(ii)
   269  	case int32:
   270  		return uint16(ii)
   271  	case int64:
   272  		return uint16(ii)
   273  	case uint:
   274  		return uint16(ii)
   275  	case uint8:
   276  		return uint16(ii)
   277  	case uint16:
   278  		return uint16(ii)
   279  	case uint32:
   280  		return uint16(ii)
   281  	case uint64:
   282  		return uint16(ii)
   283  	case float32:
   284  		return uint16(ii)
   285  	case float64:
   286  		return uint16(ii)
   287  	case string:
   288  		iv, err := strconv.ParseUint(ii, 10, 64)
   289  		if err != nil {
   290  			panic(err)
   291  		}
   292  		return uint16(iv)
   293  	default:
   294  		panic("unknown type")
   295  	}
   296  }