HFish/core/protocol/memcache/LinkedHashMap/linked_hashmap.go
2019-08-14 10:12:33 +08:00

86 lines
1.6 KiB
Go

package LinkedHashMap
import (
"sync"
)
type LinkedHashMapNode struct {
linklistNode *LinkListNode
val interface{}
}
type LinkedHashMap struct {
linklist *LinkList
hashmap map[string]interface{}
mutex *sync.RWMutex
}
func NewLinkedHashMap() *LinkedHashMap {
return &LinkedHashMap{
linklist: NewLinkList(),
hashmap: make(map[string]interface{}),
mutex: &sync.RWMutex{},
}
}
func (this *LinkedHashMap) Lock() {
this.mutex.Lock()
}
func (this *LinkedHashMap) Unlock() {
this.mutex.Unlock()
}
func (this *LinkedHashMap) RLock() {
this.mutex.RLock()
}
func (this *LinkedHashMap) RUnlock() {
this.mutex.RUnlock()
}
func (this *LinkedHashMap) Add(key string, val interface{}) bool {
_, isExists := this.hashmap[key]
if isExists {
return false
}
linkListNode := this.linklist.AddToTail(key)
this.hashmap[key] = &LinkedHashMapNode{
linklistNode: linkListNode,
val: val,
}
return true
}
func (this *LinkedHashMap) Get(key string) interface{} {
originLinkedHashMapNode, isExists := this.hashmap[key]
if !isExists {
return nil
}
return (originLinkedHashMapNode.(*LinkedHashMapNode)).val
}
func (this *LinkedHashMap) Len() int {
return len(this.hashmap)
}
func (this *LinkedHashMap) Remove(key string) (bool, interface{}) {
originLinkedHashMapNode, isExists := this.hashmap[key]
if !isExists {
return false, nil
}
linkedHashMapNode := originLinkedHashMapNode.(*LinkedHashMapNode)
delete(this.hashmap, key)
this.linklist.RemoveNode(linkedHashMapNode.linklistNode)
return true, linkedHashMapNode.val
}
func (this *LinkedHashMap) GetLinkList() *LinkList {
return this.linklist
}