github.com/sandwich-go/boost@v1.3.29/xcontainer/syncmap/gen_int_int.go (about)

     1  // Code generated by gotemplate. DO NOT EDIT.
     2  
     3  // syncmap 提供了一个同步的映射实现,允许安全并发的访问
     4  package syncmap
     5  
     6  import (
     7  	"sort"
     8  	"strconv"
     9  	"sync"
    10  )
    11  
    12  //template type SyncMap(KType,VType)
    13  
    14  // SyncMap 定义并发安全的映射,使用 sync.Map 来实现
    15  type IntInt struct {
    16  	sm     sync.Map
    17  	locker sync.RWMutex
    18  }
    19  
    20  // NewSyncMap 构造函数,返回一个新的 SyncMap
    21  func NewIntInt() *IntInt {
    22  	return &IntInt{}
    23  }
    24  
    25  // Keys 获取映射中的所有键,返回一个 Key 类型的切片
    26  func (s *IntInt) Keys() (ret []int) {
    27  	s.sm.Range(func(key, value interface{}) bool {
    28  		ret = append(ret, key.(int))
    29  		return true
    30  	})
    31  	return ret
    32  }
    33  
    34  // Len 获取映射中键值对的数量
    35  func (s *IntInt) Len() (c int) {
    36  	s.sm.Range(func(key, value interface{}) bool {
    37  		c++
    38  		return true
    39  	})
    40  	return c
    41  }
    42  
    43  // Contains 检查映射中是否包含指定键
    44  func (s *IntInt) Contains(key int) (ok bool) {
    45  	_, ok = s.Load(key)
    46  	return
    47  }
    48  
    49  // Get 获取映射中的值
    50  func (s *IntInt) Get(key int) (value int) {
    51  	value, _ = s.Load(key)
    52  	return
    53  }
    54  
    55  // Load 获取映射中的值和是否成功加载的标志
    56  func (s *IntInt) Load(key int) (value int, loaded bool) {
    57  	if v, ok := s.sm.Load(key); ok {
    58  		return v.(int), true
    59  	}
    60  	return
    61  }
    62  
    63  // DeleteMultiple 删除映射中的多个键
    64  func (s *IntInt) DeleteMultiple(keys ...int) {
    65  	for _, k := range keys {
    66  		s.sm.Delete(k)
    67  	}
    68  }
    69  
    70  // Clear 清空映射
    71  func (s *IntInt) Clear() {
    72  	s.sm.Range(func(key, value interface{}) bool {
    73  		s.sm.Delete(key)
    74  		return true
    75  	})
    76  }
    77  
    78  // Delete 删除映射中的值
    79  func (s *IntInt) Delete(key int) { s.sm.Delete(key) }
    80  
    81  // Store 往映射中存储一个键值对
    82  func (s *IntInt) Store(key int, val int) { s.sm.Store(key, val) }
    83  
    84  // LoadAndDelete 获取映射中的值,并将其从映射中删除
    85  func (s *IntInt) LoadAndDelete(key int) (value int, loaded bool) {
    86  	if v, ok := s.sm.LoadAndDelete(key); ok {
    87  		return v.(int), true
    88  	}
    89  	return
    90  }
    91  
    92  // GetOrSetFuncErrorLock 函数根据key查找值,如果key存在则返回对应的值,否则用cf函数计算得到一个新的值,存储到 SyncMap 中并返回。
    93  // 如果执行cf函数时出错,则返回error。
    94  // 函数内部使用读写锁实现并发安全
    95  func (s *IntInt) GetOrSetFuncErrorLock(key int, cf func(key int) (int, error)) (value int, loaded bool, err error) {
    96  	return s.LoadOrStoreFuncErrorLock(key, cf)
    97  }
    98  
    99  // LoadOrStoreFuncErrorLock 函数根据key查找值,如果key存在则返回对应的值,否则用cf函数计算得到一个新的值,存储到 SyncMap 中并返回。
   100  // 如果执行cf函数时出错,则返回error。
   101  // 函数内部使用读写锁实现并发安全
   102  func (s *IntInt) LoadOrStoreFuncErrorLock(key int, cf func(key int) (int, error)) (value int, loaded bool, err error) {
   103  	if v, ok := s.Load(key); ok {
   104  		return v, true, nil
   105  	}
   106  	// 如果不存在,则加写锁,再次查找,如果获取到则直接返回
   107  	s.locker.Lock()
   108  	defer s.locker.Unlock()
   109  	// 再次重试,如果获取到则直接返回
   110  	if v, ok := s.Load(key); ok {
   111  		return v, true, nil
   112  	}
   113  	// 如果还是不存在,则执行cf函数计算出value,并存储到 SyncMap 中
   114  	value, err = cf(key)
   115  	if err != nil {
   116  		return value, false, err
   117  	}
   118  	s.Store(key, value)
   119  	return value, false, nil
   120  }
   121  
   122  // GetOrSetFuncLock 根据key获取对应的value,若不存在则通过cf回调创建value并存储
   123  func (s *IntInt) GetOrSetFuncLock(key int, cf func(key int) int) (value int, loaded bool) {
   124  	return s.LoadOrStoreFuncLock(key, cf)
   125  }
   126  
   127  // LoadOrStoreFuncLock 根据key获取对应的value,若不存在则通过cf回调创建value并存储
   128  func (s *IntInt) LoadOrStoreFuncLock(key int, cf func(key int) int) (value int, loaded bool) {
   129  	value, loaded, _ = s.LoadOrStoreFuncErrorLock(key, func(key int) (int, error) {
   130  		return cf(key), nil
   131  	})
   132  	return value, loaded
   133  }
   134  
   135  // LoadOrStore 存储一个 key-value 对,若key已存在则返回已存在的value
   136  func (s *IntInt) LoadOrStore(key int, val int) (int, bool) {
   137  	actual, ok := s.sm.LoadOrStore(key, val)
   138  	return actual.(int), ok
   139  }
   140  
   141  // Range 遍历映射中的 key-value 对,对每个 key-value 对执行给定的函数f
   142  func (s *IntInt) Range(f func(key int, value int) bool) {
   143  	s.sm.Range(func(k, v interface{}) bool {
   144  		return f(k.(int), v.(int))
   145  	})
   146  }
   147  
   148  // RangeDeterministic 按照 key 的顺序遍历映射中的 key-value 对,对每个 key-value 对执行给定的函数 f, f返回false则中断退出
   149  // 参数 sortableGetter 接收一个 KType 切片并返回一个可排序接口,用于对key进行排序
   150  func (s *IntInt) RangeDeterministic(f func(key int, value int) bool, sortableGetter func([]int) sort.Interface) {
   151  	var keys []int
   152  	s.sm.Range(func(key, value interface{}) bool {
   153  		keys = append(keys, key.(int))
   154  		return true
   155  	})
   156  	sort.Sort(sortableGetter(keys))
   157  	for _, k := range keys {
   158  		if v, ok := s.Load(k); ok {
   159  			if !f(k, v) {
   160  				break
   161  			}
   162  		}
   163  	}
   164  }
   165  
   166  //template format
   167  var __formatKTypeToIntInt = func(i interface{}) int {
   168  	switch ii := i.(type) {
   169  	case int:
   170  		return int(ii)
   171  	case int8:
   172  		return int(ii)
   173  	case int16:
   174  		return int(ii)
   175  	case int32:
   176  		return int(ii)
   177  	case int64:
   178  		return int(ii)
   179  	case uint:
   180  		return int(ii)
   181  	case uint8:
   182  		return int(ii)
   183  	case uint16:
   184  		return int(ii)
   185  	case uint32:
   186  		return int(ii)
   187  	case uint64:
   188  		return int(ii)
   189  	case float32:
   190  		return int(ii)
   191  	case float64:
   192  		return int(ii)
   193  	case string:
   194  		iv, err := strconv.ParseInt(ii, 10, 64)
   195  		if err != nil {
   196  			panic(err)
   197  		}
   198  		return int(iv)
   199  	default:
   200  		panic("unknown type")
   201  	}
   202  }
   203  
   204  //template format
   205  var __formatVTypeToIntInt = func(i interface{}) int {
   206  	switch ii := i.(type) {
   207  	case int:
   208  		return int(ii)
   209  	case int8:
   210  		return int(ii)
   211  	case int16:
   212  		return int(ii)
   213  	case int32:
   214  		return int(ii)
   215  	case int64:
   216  		return int(ii)
   217  	case uint:
   218  		return int(ii)
   219  	case uint8:
   220  		return int(ii)
   221  	case uint16:
   222  		return int(ii)
   223  	case uint32:
   224  		return int(ii)
   225  	case uint64:
   226  		return int(ii)
   227  	case float32:
   228  		return int(ii)
   229  	case float64:
   230  		return int(ii)
   231  	case string:
   232  		iv, err := strconv.ParseInt(ii, 10, 64)
   233  		if err != nil {
   234  			panic(err)
   235  		}
   236  		return int(iv)
   237  	default:
   238  		panic("unknown type")
   239  	}
   240  }
   241  
   242  // add 6,6 success
   243  
   244  // add 7, 7 failed
   245  
   246  // add 7, 7 success