github.com/vipernet-xyz/tm@v0.34.24/libs/cmap/cmap.go (about)

     1  package cmap
     2  
     3  import (
     4  	tmsync "github.com/vipernet-xyz/tm/libs/sync"
     5  )
     6  
     7  // CMap is a goroutine-safe map
     8  type CMap struct {
     9  	m map[string]interface{}
    10  	l tmsync.Mutex
    11  }
    12  
    13  func NewCMap() *CMap {
    14  	return &CMap{
    15  		m: make(map[string]interface{}),
    16  	}
    17  }
    18  
    19  func (cm *CMap) Set(key string, value interface{}) {
    20  	cm.l.Lock()
    21  	cm.m[key] = value
    22  	cm.l.Unlock()
    23  }
    24  
    25  func (cm *CMap) Get(key string) interface{} {
    26  	cm.l.Lock()
    27  	val := cm.m[key]
    28  	cm.l.Unlock()
    29  	return val
    30  }
    31  
    32  func (cm *CMap) Has(key string) bool {
    33  	cm.l.Lock()
    34  	_, ok := cm.m[key]
    35  	cm.l.Unlock()
    36  	return ok
    37  }
    38  
    39  func (cm *CMap) Delete(key string) {
    40  	cm.l.Lock()
    41  	delete(cm.m, key)
    42  	cm.l.Unlock()
    43  }
    44  
    45  func (cm *CMap) Size() int {
    46  	cm.l.Lock()
    47  	size := len(cm.m)
    48  	cm.l.Unlock()
    49  	return size
    50  }
    51  
    52  func (cm *CMap) Clear() {
    53  	cm.l.Lock()
    54  	cm.m = make(map[string]interface{})
    55  	cm.l.Unlock()
    56  }
    57  
    58  func (cm *CMap) Keys() []string {
    59  	cm.l.Lock()
    60  
    61  	keys := make([]string, 0, len(cm.m))
    62  	for k := range cm.m {
    63  		keys = append(keys, k)
    64  	}
    65  	cm.l.Unlock()
    66  	return keys
    67  }
    68  
    69  func (cm *CMap) Values() []interface{} {
    70  	cm.l.Lock()
    71  	items := make([]interface{}, 0, len(cm.m))
    72  	for _, v := range cm.m {
    73  		items = append(items, v)
    74  	}
    75  	cm.l.Unlock()
    76  	return items
    77  }