|
9 | 9 | import Foundation
|
10 | 10 |
|
11 | 11 | public class LRUCache<KeyType: Hashable> {
|
12 |
| - private let maxSize: Int |
13 |
| - private var cache: [KeyType: Any] = [:] |
14 |
| - private var priority: LinkedList<KeyType> = LinkedList<KeyType>() |
15 |
| - private var key2node: [KeyType: LinkedList<KeyType>.LinkedListNode<KeyType>] = [:] |
16 |
| - |
17 |
| - public init(_ maxSize: Int) { |
18 |
| - self.maxSize = maxSize |
| 12 | + private let maxSize: Int |
| 13 | + private var cache: [KeyType: Any] = [:] |
| 14 | + private var priority: LinkedList<KeyType> = LinkedList<KeyType>() |
| 15 | + private var key2node: [KeyType: LinkedList<KeyType>.LinkedListNode<KeyType>] = [:] |
| 16 | + |
| 17 | + public init(_ maxSize: Int) { |
| 18 | + self.maxSize = maxSize |
| 19 | + } |
| 20 | + |
| 21 | + public func get(_ key: KeyType) -> Any? { |
| 22 | + guard let val = cache[key] else { |
| 23 | + return nil |
19 | 24 | }
|
20 |
| - |
21 |
| - public func get(_ key: KeyType) -> Any? { |
22 |
| - guard let val = cache[key] else { |
23 |
| - return nil |
24 |
| - } |
25 |
| - |
26 |
| - remove(key) |
27 |
| - insert(key, val: val) |
28 |
| - |
29 |
| - return val |
| 25 | + |
| 26 | + remove(key) |
| 27 | + insert(key, val: val) |
| 28 | + |
| 29 | + return val |
| 30 | + } |
| 31 | + |
| 32 | + public func set(_ key: KeyType, val: Any) { |
| 33 | + if cache[key] != nil { |
| 34 | + remove(key) |
| 35 | + } else if priority.count >= maxSize, let keyToRemove = priority.last?.value { |
| 36 | + remove(keyToRemove) |
30 | 37 | }
|
31 |
| - |
32 |
| - public func set(_ key: KeyType, val: Any) { |
33 |
| - if cache[key] != nil { |
34 |
| - remove(key) |
35 |
| - } else if priority.count >= maxSize, let keyToRemove = priority.last?.value { |
36 |
| - remove(keyToRemove) |
37 |
| - } |
38 |
| - |
39 |
| - insert(key, val: val) |
40 |
| - } |
41 |
| - |
42 |
| - private func remove(_ key: KeyType) { |
43 |
| - cache.removeValue(forKey: key) |
44 |
| - guard let node = key2node[key] else { |
45 |
| - return |
46 |
| - } |
47 |
| - priority.remove(node: node) |
48 |
| - key2node.removeValue(forKey: key) |
| 38 | + |
| 39 | + insert(key, val: val) |
| 40 | + } |
| 41 | + |
| 42 | + private func remove(_ key: KeyType) { |
| 43 | + cache.removeValue(forKey: key) |
| 44 | + guard let node = key2node[key] else { |
| 45 | + return |
49 | 46 | }
|
50 |
| - |
51 |
| - private func insert(_ key: KeyType, val: Any) { |
52 |
| - cache[key] = val |
53 |
| - priority.insert(key, atIndex: 0) |
54 |
| - guard let first = priority.first else { |
55 |
| - return |
56 |
| - } |
57 |
| - key2node[key] = first |
| 47 | + priority.remove(node: node) |
| 48 | + key2node.removeValue(forKey: key) |
| 49 | + } |
| 50 | + |
| 51 | + private func insert(_ key: KeyType, val: Any) { |
| 52 | + cache[key] = val |
| 53 | + priority.insert(key, atIndex: 0) |
| 54 | + guard let first = priority.first else { |
| 55 | + return |
58 | 56 | }
|
| 57 | + key2node[key] = first |
| 58 | + } |
59 | 59 | }
|
0 commit comments