summaryrefslogtreecommitdiffstats
path: root/evict.go
diff options
context:
space:
mode:
authorMarc Pervaz Boocha <marcpervaz@qburst.com>2025-02-19 18:28:03 +0530
committerMarc Pervaz Boocha <marcpervaz@qburst.com>2025-02-19 18:28:03 +0530
commit893b439ccb9511ed4a5595bdf8048bb637da1200 (patch)
tree5885be596e283a719166ba6af9339c3095bc471d /evict.go
parentBootstraped code for housekeeping operations (diff)
downloadcache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar
cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.gz
cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.bz2
cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.lz
cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.xz
cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.zst
cache-893b439ccb9511ed4a5595bdf8048bb637da1200.zip
Added Eviction and Options setup
Diffstat (limited to 'evict.go')
-rw-r--r--evict.go123
1 files changed, 73 insertions, 50 deletions
diff --git a/evict.go b/evict.go
index 5e75342..dabbe6a 100644
--- a/evict.go
+++ b/evict.go
@@ -5,88 +5,100 @@ import "errors"
type EvictionPolicyType int
const (
- StrategyNone EvictionPolicyType = iota
- StrategyFIFO
- StrategyLRU
- StrategyLFU
+ PolicyNone EvictionPolicyType = iota
+ PolicyFIFO
+ PolicyLRU
+ PolicyLFU
+ PolicyLTR
)
-type EvictionStrategies interface {
- OnInsert(n *Node)
- OnAccess(n *Node)
- Evict() *Node
+type evictionStrategies interface {
+ OnInsert(n *node)
+ OnAccess(n *node)
+ Evict() *node
}
-type EvictionPolicy struct {
- EvictionStrategies
+type evictionPolicy struct {
+ evictionStrategies
Type EvictionPolicyType
- evict *Node
+ evict *node
}
-func (e *EvictionPolicy) SetPolicy(y EvictionPolicyType) error {
- store := map[EvictionPolicyType]func() EvictionStrategies{
- StrategyNone: func() EvictionStrategies {
- return NoneStrategies{evict: e.evict}
+func (e *evictionPolicy) SetPolicy(y EvictionPolicyType) error {
+ store := map[EvictionPolicyType]func() evictionStrategies{
+ PolicyNone: func() evictionStrategies {
+ return nonePolicy{evict: e.evict}
},
- StrategyFIFO: func() EvictionStrategies {
- return FIFOStrategies{evict: e.evict}
+ PolicyFIFO: func() evictionStrategies {
+ return fifoPolicy{evict: e.evict}
},
- StrategyLRU: func() EvictionStrategies {
- return LRUStrategies{evict: e.evict}
+ PolicyLRU: func() evictionStrategies {
+ return lruPolicy{evict: e.evict}
+ },
+ PolicyLFU: func() evictionStrategies {
+ return lfuPolicy{evict: e.evict}
},
}
factory, ok := store[y]
if !ok {
- return errors.New("Invalid Policy")
+ return errors.New("invalid olicy")
}
- e.EvictionStrategies = factory()
+ e.evictionStrategies = factory()
return nil
}
-type NoneStrategies struct {
- evict *Node
+type nonePolicy struct {
+ evict *node
}
-func (s NoneStrategies) OnInsert(node *Node) {
+func (s nonePolicy) OnInsert(node *node) {
node.EvictPrev = s.evict
node.EvictNext = node.EvictPrev.EvictNext
node.EvictNext.EvictPrev = node
node.EvictPrev.EvictNext = node
}
-func (NoneStrategies) OnAccess(n *Node) {
+func (nonePolicy) OnAccess(n *node) {
}
-func (NoneStrategies) Evict() *Node {
+func (nonePolicy) Evict() *node {
return nil
}
-type FIFOStrategies struct {
- evict *Node
+type fifoPolicy struct {
+ evict *node
}
-func (s FIFOStrategies) OnInsert(node *Node) {
+func (s fifoPolicy) OnInsert(node *node) {
node.EvictPrev = s.evict
node.EvictNext = node.EvictPrev.EvictNext
node.EvictNext.EvictPrev = node
node.EvictPrev.EvictNext = node
}
-func (FIFOStrategies) OnAccess(n *Node) {
+func (fifoPolicy) OnAccess(n *node) {
}
-func (s FIFOStrategies) Evict() *Node {
- return s.evict.EvictPrev
+func (s fifoPolicy) Evict() *node {
+ if s.evict.EvictPrev != s.evict {
+ return s.evict.EvictPrev
+ } else {
+ return nil
+ }
}
-type LRUStrategies struct {
- evict *Node
+type lruPolicy struct {
+ evict *node
}
-func (s LRUStrategies) OnInsert(node *Node) {
+func (s lruPolicy) OnInsert(node *node) {
+ node.EvictPrev = s.evict
+ node.EvictNext = node.EvictPrev.EvictNext
+ node.EvictNext.EvictPrev = node
+ node.EvictPrev.EvictNext = node
}
-func (s LRUStrategies) OnAccess(node *Node) {
+func (s lruPolicy) OnAccess(node *node) {
node.EvictNext.EvictPrev = node.EvictPrev
node.EvictPrev.EvictNext = node.EvictNext
@@ -96,36 +108,43 @@ func (s LRUStrategies) OnAccess(node *Node) {
node.EvictPrev.EvictNext = node
}
-func (s LRUStrategies) Evict() *Node {
- return s.evict.EvictPrev
+func (s lruPolicy) Evict() *node {
+ if s.evict.EvictPrev != s.evict {
+ return s.evict.EvictPrev
+ } else {
+ return nil
+ }
}
-type LFUStrategies struct {
- evict *Node
+type lfuPolicy struct {
+ evict *node
}
-func (s LFUStrategies) OnInsert(node *Node) {
+func (s lfuPolicy) OnInsert(node *node) {
node.EvictPrev = s.evict
node.EvictNext = node.EvictPrev.EvictNext
node.EvictNext.EvictPrev = node
node.EvictPrev.EvictNext = node
+ node.Access = 0
}
-func (s LFUStrategies) OnAccess(node *Node) {
- node.Access += 1
+func (s lfuPolicy) OnAccess(node *node) {
+ node.Access++
- node.EvictNext.EvictPrev = node.EvictPrev
- node.EvictPrev.EvictNext = node.EvictNext
+ for v := node.EvictPrev; v.EvictPrev != s.evict; v = v.EvictPrev {
+ if v.Access <= node.Access {
+ node.EvictNext.EvictPrev = node.EvictPrev
+ node.EvictPrev.EvictNext = node.EvictNext
- for v := node.EvictPrev; v != s.evict; v = v.EvictPrev {
- if v.Access >= node.Access {
node.EvictPrev = v
node.EvictNext = node.EvictPrev.EvictNext
node.EvictNext.EvictPrev = node
node.EvictPrev.EvictNext = node
- break
+ return
}
}
+ node.EvictNext.EvictPrev = node.EvictPrev
+ node.EvictPrev.EvictNext = node.EvictNext
node.EvictPrev = s.evict
node.EvictNext = node.EvictPrev.EvictNext
@@ -133,6 +152,10 @@ func (s LFUStrategies) OnAccess(node *Node) {
node.EvictPrev.EvictNext = node
}
-func (s LFUStrategies) Evict() *Node {
- return s.evict.EvictPrev
+func (s lfuPolicy) Evict() *node {
+ if s.evict.EvictPrev != s.evict {
+ return s.evict.EvictPrev
+ } else {
+ return nil
+ }
}