public void UsedKey(Key key) { if (!loadedValues.ContainsKey(key)) { return; } var ptr = lruTail; while (!ptr.Key.Equals(key)) { ptr = ptr.Previous; } if (ptr == lruTail) { return; } if (ptr == lruHead) { lruHead = ptr.Next; ptr.Next.Previous = null; } else { ptr.Next.Previous = ptr.Previous; ptr.Previous.Next = ptr.Next; } ptr.Previous = lruTail; ptr.Next = null; lruTail.Next = ptr; lruTail = ptr; }
public void UsedValue(Value value) { var ptr = lruTail; while (ptr != null && !ptr.Value.Equals(value)) { ptr = ptr.Previous; } if (ptr == null) { return; } if (ptr == lruTail) { return; } if (ptr == lruHead) { lruHead = ptr.Next; ptr.Next.Previous = null; } else { ptr.Next.Previous = ptr.Previous; ptr.Previous.Next = ptr.Next; } ptr.Previous = lruTail; ptr.Next = null; lruTail.Next = ptr; lruTail = ptr; }
void AddLoaded(Key key, Value value) { if (lruHead == null) { lruHead = lruTail = new LruPtr() { Key = key, Value = value }; loadedValues[key] = value; return; } LruPtr ptr; if (loadedValues.Count == capacity) { //Evict oldest and reuse ptr object var h = lruHead; h.Value.Dispose(); loadedValues.Remove(h.Key); lruHead = h.Next; ptr = h; ptr.Key = key; ptr.Value = value; ptr.Next = null; ptr.Previous = lruTail; } else { ptr = new LruPtr() { Key = key, Value = value, Previous = lruTail }; } lruTail.Next = ptr; lruTail = ptr; loadedValues[key] = value; }