Implemented lrucache
This commit is contained in:
parent
c0293f8599
commit
d543ebc174
1 changed files with 64 additions and 2 deletions
|
@ -2,6 +2,68 @@
|
||||||
|
|
||||||
package lrucache
|
package lrucache
|
||||||
|
|
||||||
func New(cap int) Cache {
|
import (
|
||||||
panic("implement me")
|
"container/list"
|
||||||
|
)
|
||||||
|
|
||||||
|
type cacheEntry struct {
|
||||||
|
key int
|
||||||
|
value int
|
||||||
|
}
|
||||||
|
|
||||||
|
type lrucache struct {
|
||||||
|
cap int
|
||||||
|
data map[int]*list.Element
|
||||||
|
recentEntries *list.List
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *lrucache) isFull() bool {
|
||||||
|
return c.recentEntries.Len() == c.cap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *lrucache) Get(key int) (int, bool) {
|
||||||
|
e, ok := c.data[key]
|
||||||
|
if !ok {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
entry := c.recentEntries.Remove(e).(cacheEntry)
|
||||||
|
c.data[key] = c.recentEntries.PushBack(entry)
|
||||||
|
return entry.value, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *lrucache) Set(key int, value int) {
|
||||||
|
if c.cap == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
e, ok := c.data[key]
|
||||||
|
if ok {
|
||||||
|
c.recentEntries.Remove(e)
|
||||||
|
c.data[key] = c.recentEntries.PushBack(cacheEntry{key, value})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if c.isFull() {
|
||||||
|
removed := c.recentEntries.Remove(c.recentEntries.Front()).(cacheEntry)
|
||||||
|
delete(c.data, removed.key)
|
||||||
|
}
|
||||||
|
c.data[key] = c.recentEntries.PushBack(cacheEntry{key, value})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *lrucache) Range(f func(key, value int) bool) {
|
||||||
|
for e := c.recentEntries.Front(); e != nil; e = e.Next() {
|
||||||
|
entry := e.Value.(cacheEntry)
|
||||||
|
if !f(entry.key, entry.value) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *lrucache) Clear() {
|
||||||
|
for k := range c.data {
|
||||||
|
delete(c.data, k)
|
||||||
|
}
|
||||||
|
c.recentEntries.Init()
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(cap int) Cache {
|
||||||
|
return &lrucache{cap, make(map[int]*list.Element), list.New()}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue