protected override void UpdateList(TKey key, ValueNode node) { var value = node.Value; var lNode = node.ListNode; if (lNode != null) { _list.Remove(lNode); ReportHit(key, value); } else { if (ValueStorage.Count > Capacity) { var lastNode = _list.Last; _list.RemoveLast(); if (ValueStorage.TryGetValue(lastNode.Value, out var oldNode)) { ValueStorage.Remove(lastNode.Value); _slots.Remove(oldNode.Slot); _availableSlots.Enqueue(oldNode.Slot); ReportDelete(lastNode.Value, oldNode.Value); } } ReportInsert(key, value); } node.ListNode = _list.AddFirst(key); }
private void ReclaimSpace() { if (ValueStorage.Count <= Capacity) { return; } if (_a1InList.Count > Kin) { var y = _a1InList.Last; _a1InList.RemoveLast(); if (ValueStorage.TryGetValue(y.Value, out var oValue)) { ValueStorage.Remove(y.Value); _slots.Remove(oValue.Slot); _availableSlots.Enqueue(oValue.Slot); CleanLists(oValue); ReportDelete(y.Value, oValue.Value); } _a1OutList.AddFirst(y.Value); if (_a1OutList.Count >= Kout) { _a1OutList.RemoveLast(); } } else if (_amList.Last != null) { var y = _amList.Last; _amList.RemoveLast(); if (ValueStorage.TryGetValue(y.Value, out var oValue)) { ValueStorage.Remove(y.Value); _slots.Remove(oValue.Slot); _availableSlots.Enqueue(oValue.Slot); CleanLists(oValue); ReportDelete(y.Value, oValue.Value); } } }
protected override void UpdateList(TKey key, ValueNode node) { var isInAm = node.ListNodeAm != null; var isInA1 = node.ListNodeA1 != null; var value = node.Value; if (isInAm) { _amList.Remove(node.ListNodeAm); ReportHit(key, value); node.ListNodeAm = _amList.AddFirst(key); } else if (isInA1) { _a1List.Remove(node.ListNodeA1); node.ListNodeA1 = null; ReportHit(key, value); node.ListNodeAm = _amList.AddFirst(key); } else { if (ValueStorage.Count > Capacity) { var list = _a1List.Count >= _threshold ? _a1List : _amList; var oNode = list.Last; if (ValueStorage.TryGetValue(oNode.Value, out var oValue)) { ValueStorage.Remove(oNode.Value); list.Remove(oNode); _slots.Remove(oValue.Slot); _availableSlots.Enqueue(oValue.Slot); ReportDelete(oNode.Value, oValue.Value); } } node.ListNodeA1 = _a1List.AddFirst(key); ReportInsert(key, value); } }