From e076620d47ca7c158685e3f074b0c455a1395e19 Mon Sep 17 00:00:00 2001 From: boyce Date: Fri, 26 Apr 2019 18:54:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Emapex=EF=BC=8C=E9=99=8D?= =?UTF-8?q?=E4=BD=8E=E4=BA=92=E9=94=81=E5=8F=AF=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/mapex.go | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 util/mapex.go diff --git a/util/mapex.go b/util/mapex.go new file mode 100644 index 0000000..f9daa7e --- /dev/null +++ b/util/mapex.go @@ -0,0 +1,93 @@ +package util + +import ( + "fmt" + + "github.com/duanhf2012/origin/util/hash" +) + +const ( + DEFAULT_MAX_HASH_NUM = 100 +) + +type MapEx struct { + m []Map + hashMapNum uint +} + +func NewMapEx() *MapEx { + mapEx := MapEx{} + mapEx.Init(DEFAULT_MAX_HASH_NUM) + return &mapEx +} + +func (m *MapEx) Init(hashMapNum uint) { + var i uint + for i = 0; i < hashMapNum; i++ { + m.m = append(m.m, Map{}) + } + + m.hashMapNum = hashMapNum +} + +func (m *MapEx) ClearMap() { + var i uint + for i = 0; i < m.hashMapNum; i++ { + m.m[i].ClearMap() + } +} + +func (m *MapEx) GetHashCode(key interface{}) uint { + return hash.HashNumber(fmt.Sprint(key)) +} + +func (m *MapEx) GetMapByKey(key interface{}) *Map { + idx := m.GetHashCode(key) % m.hashMapNum + if idx < 0 || idx > m.hashMapNum { + return nil + } + + return &m.m[idx] +} + +func (m *MapEx) Get(key interface{}) interface{} { + mapData := m.GetMapByKey(key) + if mapData == nil { + return nil + } + return mapData.Get(key) +} + +func (m *MapEx) Set(key interface{}, value interface{}) { + mapData := m.GetMapByKey(key) + if mapData == nil { + return + } + + mapData.Set(key, value) +} + +func (m *MapEx) Del(key interface{}) { + + mapData := m.GetMapByKey(key) + if mapData == nil { + return + } + + mapData.Del(key) +} + +func (m *MapEx) RLockRange(f func(key interface{}, value interface{})) { + var i uint + for i = 0; i < m.hashMapNum; i++ { + m.m[i].RLockRange(f) + } + +} + +func (m *MapEx) LockRange(f func(key interface{}, value interface{})) { + var i uint + for i = 0; i < m.hashMapNum; i++ { + m.m[i].LockRange(f) + } +}