Example #1
0
    private void Touch(int key)
    {
        LRUCacheItem item = _dict[key];

        if (item == _head)
        {
            //do nothing
        }
        else
        {
            LRUCacheItem prev = item.previous;
            LRUCacheItem nex  = item.next;
            prev.next = nex;

            if (nex == null)
            {
                _tail = prev;
            }
            else
            {
                nex.previous = prev;
            }

            item.next      = _head;
            item.previous  = null;
            _head.previous = item;
            _head          = item;
        }
    }
 public void add(K key, V val)
 {
     if (cacheMap.Count >= capacity)
     {
         removeFirst();
     }
     LRUCacheItem<K, V> cacheItem = new LRUCacheItem<K, V>(key, val);
     LinkedListNode<LRUCacheItem<K, V>> node = new LinkedListNode<LRUCacheItem<K, V>>(cacheItem);
     lruList.AddLast(node);
     cacheMap.Add(key, node);
 }
        public void Add(K key, V val)
        {
            if (cacheMap.Count >= Capacity)
            {
                RemoveLeastRecentlyUsed();
            }
            var cacheItem = new LRUCacheItem <K, V>(key, val);
            var node      = new LinkedListNode <LRUCacheItem <K, V> >(cacheItem);

            lruList.AddLast(node);
            cacheMap.Add(key, node);
        }
Example #4
0
        public void Add(TKey key, TValue val)
        {
            if (cacheMap.Count >= capacity)
            {
                RemoveFirst();
            }

            var cacheItem = new LRUCacheItem(key, val);
            var node      = new LinkedListNode <LRUCacheItem>(cacheItem);

            lruList.AddLast(node);
            cacheMap.Add(key, node);
        }
        public void Add(K key, V val)
        {
            if (_cacheMap.Count >= capacity)
            {
                RemoveFirst();
            }

            LRUCacheItem cacheItem             = new LRUCacheItem(key, val);
            LinkedListNode <LRUCacheItem> node = new LinkedListNode <LRUCacheItem>(cacheItem);

            _lruList.AddLast(node);
            _cacheMap.Add(key, node);
        }
Example #6
0
        public void Add(TKey key, TValue val)
        {
            if (m_cacheMap.Count >= m_capacity)
            {
                var first = m_lruList.First;
                m_lruList.RemoveFirst();
                m_cacheMap.Remove(first.Value.Key);
            }

            var cacheItem = new LRUCacheItem(key, val);
            var node      = new LinkedListNode <LRUCacheItem>(cacheItem);

            m_lruList.AddLast(node);
            m_cacheMap.Add(key, node);
        }
Example #7
0
 public override void Put(TKey key, TValue value)
 {
     lock (_lockObj)
     {
         if (_cacheMap.ContainsKey(key))
         {
             return;
         }
         this.CheckSize(key, value);
         LRUCacheItem <TKey, TValue> cacheItem = new LRUCacheItem <TKey, TValue>(key, value);
         LinkedListNode <LRUCacheItem <TKey, TValue> > node =
             new LinkedListNode <LRUCacheItem <TKey, TValue> >(cacheItem);
         _lruList.AddLast(node);
         _cacheMap.Add(key, node);
     }
 }
Example #8
0
        public bool TryAdd(TKey key, TValue value)
        {
            lock (_lockObj)
            {
                CleanAbandonedItems();

                if (_cacheMap.ContainsKey(key))
                {
                    return(false);
                }
                this.CheckSize(key, value);
                LRUCacheItem <TKey, TValue> cacheItem = new LRUCacheItem <TKey, TValue>(key, value);
                LinkedListNode <LRUCacheItem <TKey, TValue> > node =
                    new LinkedListNode <LRUCacheItem <TKey, TValue> >(cacheItem);
                _lruList.AddLast(node);
                _cacheMap.Add(key, node);

                return(true);
            }
        }
Example #9
0
            public void add(K key, V val)
            {
                rwLock.EnterWriteLock();
                try
                {
                    if (cacheMap.Count >= capacity)
                    {
                        RemoveFirst();
                    }

                    LRUCacheItem <K, V> cacheItem = new LRUCacheItem <K, V>(key, val);
                    LinkedListNode <LRUCacheItem <K, V> > node = new LinkedListNode <LRUCacheItem <K, V> >(cacheItem);
                    lruList.AddLast(node);
                    cacheMap.Add(key, node);
                }
                finally
                {
                    rwLock.ExitWriteLock();
                }
            }
Example #10
0
        public void Set(K key, V val)
        {
            lock (this)
            {
                LinkedListNode <LRUCacheItem> node;
                if (_cacheMap.TryGetValue(key, out node))
                {
                    _lruList.Remove(node);
                    _cacheMap.Remove(key);
                }

                if (_cacheMap.Count >= _capacity)
                {
                    RemoveFirst();
                }

                var cacheItem = new LRUCacheItem(key, val);
                node = new LinkedListNode <LRUCacheItem>(cacheItem);
                _lruList.AddLast(node);
                _cacheMap.Add(key, node);
            }
        }
Example #11
0
        public void Add(K key, V val)
        {
            if (cacheMap.TryGetValue(key, out LinkedListNode <LRUCacheItem> _))
            {
                return;
            }

            if (cacheMap.Count >= capacity)
            {
                // Remove from LRUPriority
                LinkedListNode <LRUCacheItem> first = lruList.First;
                lruList.RemoveFirst();

                // Remove from cache
                cacheMap.Remove(first.Value.key);
            }

            LRUCacheItem cacheItem             = new LRUCacheItem(key, val);
            LinkedListNode <LRUCacheItem> node = new LinkedListNode <LRUCacheItem>(cacheItem);

            lruList.AddLast(node);
            cacheMap.Add(key, node);
        }
Example #12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="discaredKey"></param>
        /// <param name="discardedValue"></param>
        /// <returns></returns>
        public bool AddDiscard(Key key, Value value, out Key discaredKey, out Value discardedValue)
        {
            bool retValue = false;

            if (cacheMap.Count >= capacity)
            {
                retValue = true;
                Discard(out discaredKey, out discardedValue);
            }
            else
            {
                retValue       = false;
                discardedValue = default(Value);
                discaredKey    = default(Key);
            }

            var cacheItem = new LRUCacheItem(key, value);
            var node      = new LinkedListNode <LRUCacheItem>(cacheItem);

            lruList.AddLast(node);
            cacheMap.Add(key, node);

            return(retValue);
        }
Example #13
0
        public void Add(K key, V val, out V removed)
        {
            lock (_lruList)
            {
                removed = default(V);
                if (_cacheMap.Count >= _capacity)
                {
                    removed = RemoveFirst();
                }

                LRUCacheItem <K, V> cacheItem = new LRUCacheItem <K, V>(key, val);
                LinkedListNode <LRUCacheItem <K, V> > node = new LinkedListNode <LRUCacheItem <K, V> >(cacheItem);
                _lruList.AddLast(node);

                if (!_cacheMap.ContainsKey(key))
                {
                    _cacheMap.Add(key, node);
                }
                else
                {
                    _cacheMap[key] = node;
                }
            }
        }
Example #14
0
        public override bool Equals(object obj)
        {
            LRUCacheItem <TKey, TValue> item = obj as LRUCacheItem <TKey, TValue>;

            return(item != null && Key.Equals(item.Key));
        }
Example #15
0
    public void Put(int key, int value)
    {
        if (_dict.ContainsKey(key))
        {
            //Set instead of insert
            _dict[key].value = value;

            Touch(key);
            return;
        }


        if (_currentCount < _capacity)
        {
            //add to the Doubly linked list
            LRUCacheItem item = new LRUCacheItem();
            item.key      = key;
            item.value    = value;
            item.next     = null; //by default
            item.previous = null; //by default

            _dict.Add(key, item);

            if (_head == null)
            {
                //very very first item
                _head = item;
                _tail = item;
            }
            else
            {
                //add to the front
                item.next      = _head;
                _head.previous = item;
                _head          = item;
            }

            _currentCount++;
        }
        else
        {
            //Reached Capacity
            //find the least recent used item
            int tailkey = _tail.key;
            //remove it from Doubly Linked List
            LRUCacheItem prev = _tail.previous;
            if (prev != null)
            {
                prev.next = null;
                _tail     = prev;
            }
            else
            {
                //to handle 1 capacity
                _tail = null;
            }


            //remove it from dict
            _dict.Remove(tailkey);
            _currentCount--;

            //try again
            Put(key, value);
        }
    }
Example #16
0
 private async void HandleRemovedItem(LRUCacheItem <string, string> ci)
 {
     await CacheManager.TryDeleteAsync(MediaLRUCache.RemoveLengthPrefixFromLocalFilePath(ci.value));
 }