Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.29 KB | None | 0 0
  1. package cache
  2.  
  3. type node struct {
  4. previous *node
  5. next *node
  6. key interface{}
  7. value interface{}
  8. }
  9.  
  10. type list struct {
  11. head *node
  12. tail *node
  13. }
  14.  
  15. func (l *list) remove(n *node) *node {
  16. prev := n.previous
  17. next := n.next
  18. if prev == nil {
  19. l.head = next
  20. } else {
  21. prev.next = next
  22. }
  23. if next == nil {
  24. l.tail = prev
  25. } else {
  26. next.previous = prev
  27. }
  28.  
  29. n.next = nil
  30. n.previous = nil
  31. return n
  32. }
  33.  
  34. func (l *list) push(n *node) {
  35. n.next = nil
  36. n.previous = nil
  37. n.next = l.head
  38. if l.head != nil {
  39. l.head.previous = n
  40. }
  41. l.head = n
  42. if l.tail == nil {
  43. l.tail = n
  44. }
  45. }
  46.  
  47. type LRU struct {
  48. lookup map[interface{}]*node
  49. size int
  50. nodes *list
  51. }
  52.  
  53. func NewLRU(size int) *LRU {
  54. return &LRU{
  55. lookup: make(map[interface{}]*node),
  56. nodes: &list{},
  57. size: size,
  58. }
  59. }
  60.  
  61. func (l *LRU) Put(key, value interface{}) {
  62. n := &node{
  63. key: key,
  64. value: value,
  65. }
  66. if oldN, ok := l.lookup[key]; ok {
  67. l.nodes.remove(oldN)
  68. l.lookup[key] = n
  69. l.nodes.push(n)
  70. return
  71. }
  72. if len(l.lookup) >= l.size {
  73. oldN := l.nodes.tail
  74. l.nodes.remove(oldN)
  75. delete(l.lookup, oldN.key)
  76. }
  77.  
  78. l.lookup[key] = n
  79. l.nodes.push(n)
  80. return
  81. }
  82.  
  83. func (l *LRU) Get(key interface{}) (interface{}, bool) {
  84. n, ok := l.lookup[key]
  85. if !ok {
  86. return nil, false
  87. }
  88.  
  89. l.nodes.remove(n)
  90. l.nodes.push(n)
  91. return n.value, true
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement