Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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;
        }