github.com/mithrandie/csvq@v1.18.1/lib/query/sync_map.go (about) 1 package query 2 3 import ( 4 "sort" 5 "sync" 6 ) 7 8 type SyncMap struct { 9 m *sync.Map 10 mtx *sync.Mutex 11 } 12 13 func NewSyncMap() *SyncMap { 14 return &SyncMap{ 15 m: &sync.Map{}, 16 mtx: &sync.Mutex{}, 17 } 18 } 19 20 func (m SyncMap) store(key string, value interface{}) { 21 m.m.Store(key, value) 22 } 23 24 func (m SyncMap) load(key string) (interface{}, bool) { 25 return m.m.Load(key) 26 } 27 28 func (m SyncMap) delete(key string) { 29 m.m.Delete(key) 30 } 31 32 func (m SyncMap) exists(name string) bool { 33 _, ok := m.m.Load(name) 34 return ok 35 } 36 37 func (m SyncMap) lock() { 38 m.mtx.Lock() 39 } 40 41 func (m SyncMap) unlock() { 42 m.mtx.Unlock() 43 } 44 45 func (m SyncMap) Clear() { 46 m.lock() 47 m.Range(func(key, value interface{}) bool { 48 m.m.Delete(key) 49 return true 50 }) 51 m.unlock() 52 } 53 54 func (m SyncMap) Range(fn func(key, value interface{}) bool) { 55 m.m.Range(fn) 56 } 57 58 func (m SyncMap) Keys() []string { 59 keys := make([]string, 0, 10) 60 m.m.Range(func(key, value interface{}) bool { 61 keys = append(keys, key.(string)) 62 return true 63 }) 64 return keys 65 } 66 67 func (m SyncMap) Len() int { 68 cnt := 0 69 m.m.Range(func(key, value interface{}) bool { 70 cnt++ 71 return true 72 }) 73 return cnt 74 } 75 76 func (m SyncMap) SortedKeys() []string { 77 keys := m.Keys() 78 sort.Strings(keys) 79 return keys 80 }