Exemple #1
0
        private void MakeSpace()
        {
            if (_count == 0)
            {
                return;
            }

            var remove = _makeSpaceBy;

            if (_count < remove)
            {
                remove = _count;
            }

            var prev = _head._prev;

            for (var i = 0; i < remove; i++)
            {
                _removeItem((T)prev);
                prev = prev._prev;
            }

            _count -= remove;

            if (_count == 0)
            {
                _head = null;
            }
            else
            {
                prev._next  = _head;
                _head._prev = prev;
            }
        }
Exemple #2
0
 private void InitHead(LruCacheNode item)
 {
     _count     = 1;
     item._next = item;
     item._prev = item;
     _head      = item;
 }
Exemple #3
0
 public void Remove(LruCacheNode item)
 {
     if (item._next == item)
     {
         _head = null;
     }
     else
     {
         item._next._prev = item._prev;
         item._prev._next = item._next;
         if (_head == item)
         {
             _head = item._next;
         }
     }
     _count--;
     _removeItem((T)item);
 }
Exemple #4
0
        public void Use(T item)
        {
            if (_head == item)
            {
                return;
            }

            if (_head == null)
            {
                InitHead(item);
                return;
            }

            if (item._next != null)
            {
                item._next._prev = item._prev;
                item._prev._next = item._next;
            }
            else
            {
                if (_count >= _maxCount)
                {
                    MakeSpace();
                    if (_head == null)
                    {
                        InitHead(item);
                        return;
                    }
                }

                _count++;
            }

            item._next        = _head;
            item._prev        = _head._prev;
            _head._prev._next = item;
            _head._prev       = item;
            _head             = item;
        }