From f78ceb82d94beacfb54a94ec44b3efcf6b3b8f68 Mon Sep 17 00:00:00 2001 From: astaxie Date: Thu, 28 Mar 2013 15:25:49 +0800 Subject: [PATCH] add safemap and test --- safemap.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ safemap_test.go | 24 ++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 safemap.go create mode 100644 safemap_test.go diff --git a/safemap.go b/safemap.go new file mode 100644 index 00000000..3ec441fb --- /dev/null +++ b/safemap.go @@ -0,0 +1,58 @@ +package beego + +import ( + "sync" +) + +type BeeMap struct { + lock *sync.RWMutex + bm map[interface{}]interface{} +} + +func NewBeeMap() *BeeMap { + return &BeeMap{ + lock: new(sync.RWMutex), + bm: make(map[interface{}]interface{}), + } +} + +//Get from maps return the k's value +func (m *BeeMap) Get(k interface{}) interface{} { + m.lock.RLock() + defer m.lock.RUnlock() + if val, ok := m.bm[k]; ok { + return val + } + return nil +} + +// Maps the given key and value. Returns false +// if the key is already in the map and changes nothing. +func (m *BeeMap) Set(k interface{}, v interface{}) bool { + m.lock.Lock() + defer m.lock.Unlock() + if val, ok := m.bm[k]; !ok { + m.bm[k] = v + } else if val != v { + m.bm[k] = v + } else { + return false + } + return true +} + +// Returns true if k is exist in the map. +func (m *BeeMap) Check(k interface{}) bool { + m.lock.RLock() + defer m.lock.RUnlock() + if _, ok := m.bm[k]; !ok { + return false + } + return true +} + +func (m *BeeMap) Delete(k interface{}) { + m.lock.Lock() + defer m.lock.Unlock() + delete(m.bm, k) +} diff --git a/safemap_test.go b/safemap_test.go new file mode 100644 index 00000000..cd2a06bc --- /dev/null +++ b/safemap_test.go @@ -0,0 +1,24 @@ +package beego + +import ( + "testing" +) + +func Test_beemap(t *testing.T) { + bm := NewBeeMap() + if !bm.Set("astaxie", 1) { + t.Error("set Error") + } + if !bm.Check("astaxie") { + t.Error("check err") + } + + if v := bm.Get("astaxie"); v.(int) != 1 { + t.Error("get err") + } + + bm.Delete("astaxie") + if bm.Check("astaxie") { + t.Error("delete err") + } +}