OSDN Git Service

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