Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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);
            }
        }