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); }
protected override bool OnGetIndex(TKey key, out int index) { if (ValueStorage.TryGetValue(key, out var node)) { index = node.Slot; return(true); } index = -1; return(false); }
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); } }
public bool TryGetState <TState>(out TState value) => stateStorage.TryGetValue(stateId, out value);