smap.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package utl
  2. import (
  3. "errors"
  4. "sync"
  5. )
  6. var (
  7. ErrKeyExists = errors.New("key already exists")
  8. ErrKeyNotExists = errors.New("key not exists")
  9. )
  10. // secure map
  11. // exports funny interfaces
  12. type SMap struct {
  13. *sync.RWMutex
  14. m map[interface{}]interface{}
  15. }
  16. func NewSMap() *SMap {
  17. return &SMap{
  18. RWMutex: &sync.RWMutex{},
  19. m: make(map[interface{}]interface{}),
  20. }
  21. }
  22. func (self *SMap) Exists(k interface{}) bool {
  23. self.RLock()
  24. _, ok := self.m[k]
  25. self.RUnlock()
  26. return ok
  27. }
  28. func (self *SMap) Get(k interface{}) (interface{}, bool) {
  29. self.RLock()
  30. defer self.RUnlock()
  31. v, ok := self.m[k]
  32. return v, ok
  33. }
  34. func (self *SMap) Set(k, v interface{}) {
  35. self.Lock()
  36. self.m[k] = v
  37. self.Unlock()
  38. }
  39. func (self *SMap) Del(k interface{}) {
  40. self.Lock()
  41. delete(self.m, k)
  42. self.Unlock()
  43. }
  44. func (self *SMap) Insert(k, v interface{}) error {
  45. self.Lock()
  46. defer self.Unlock()
  47. _, ok := self.m[k]
  48. if ok {
  49. return ErrKeyExists
  50. }
  51. self.m[k] = v
  52. return nil
  53. }
  54. func (self *SMap) Update(k, v interface{}) error {
  55. self.Lock()
  56. defer self.Unlock()
  57. _, ok := self.m[k]
  58. if !ok {
  59. return ErrKeyNotExists
  60. }
  61. self.m[k] = v
  62. return nil
  63. }
  64. func (self *SMap) Keys() []interface{} {
  65. var retval []interface{}
  66. self.RLock()
  67. defer self.RUnlock()
  68. for k, _ := range self.m {
  69. retval = append(retval, k)
  70. }
  71. return retval
  72. }
  73. func (self *SMap) Values() []interface{} {
  74. var retval []interface{}
  75. self.RLock()
  76. defer self.RUnlock()
  77. for _, v := range self.m {
  78. retval = append(retval, v)
  79. }
  80. return retval
  81. }
  82. func (self *SMap) Foreach(each func(k, v interface{})) {
  83. self.RLock()
  84. for k, v := range self.m {
  85. each(k, v)
  86. }
  87. self.RUnlock()
  88. }