smap.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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) Insert(k, v interface{}) error {
  40. self.Lock()
  41. defer self.Unlock()
  42. v, ok := self.m[k]
  43. if ok {
  44. return ErrKeyExists
  45. }
  46. self.m[k] = v
  47. return nil
  48. }
  49. func (self *SMap) Update(k, v interface{}) error {
  50. self.Lock()
  51. defer self.Unlock()
  52. v, ok := self.m[k]
  53. if !ok {
  54. return ErrKeyNotExists
  55. }
  56. self.m[k] = v
  57. return nil
  58. }
  59. func (self *SMap) Keys() []interface{} {
  60. var retval []interface{}
  61. self.RLock()
  62. defer self.RUnlock()
  63. for k, _ := range self.m {
  64. retval = append(retval, k)
  65. }
  66. return retval
  67. }
  68. func (self *SMap) Values() []interface{} {
  69. var retval []interface{}
  70. self.RLock()
  71. defer self.RUnlock()
  72. for _, v := range self.m {
  73. retval = append(retval, v)
  74. }
  75. return retval
  76. }