You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.1 KiB

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