private void RemoveNode(LFUCacheBucket node) { if (head == node) { head = node.NextBucket; } else { node.PrevBucket.NextBucket = node.NextBucket; } if (node.NextBucket != null) { node.NextBucket.PrevBucket = node.PrevBucket; } }
private void IncreaseAccessCount(int key) { LFUCacheBucket node = keyNodeDict[key]; node.Keys.Remove(key); if (node.NextBucket == null) { LFUCacheBucket temp = new LFUCacheBucket(node.AccessCount + 1); temp.Keys.Add(key); temp.PrevBucket = node; node.NextBucket = temp; keyNodeDict[key] = temp; } else if (node.NextBucket.AccessCount == node.AccessCount + 1) { node.NextBucket.Keys.Add(key); keyNodeDict[key] = node.NextBucket; } else { LFUCacheBucket temp = new LFUCacheBucket(node.AccessCount + 1); temp.Keys.Add(key); temp.NextBucket = node.NextBucket; if (node.NextBucket != null) { node.NextBucket.PrevBucket = temp; } node.NextBucket = temp; temp.PrevBucket = node; keyNodeDict[key] = temp; } if (!node.Keys.Any()) { this.RemoveNode(node); } }
private void AddNewKeyToNode(int key) { if (head == null) { head = new LFUCacheBucket(); head.Keys.Add(key); } else if (head.AccessCount == 0) { head.Keys.Add(key); } else { LFUCacheBucket node = new LFUCacheBucket(); node.Keys.Add(key); head.PrevBucket = node; node.NextBucket = head; head = node; } keyNodeDict[key] = head; }