/// <summary>
        /// Add element to cache
        /// </summary>
        /// <param name="tag">The tag.</param>
        /// <param name="value">The value.</param>
        public void Add(int tag, TValue value)
        {
            if (nodePointer.ContainsKey(tag))
            {
                MoveToFront(nodePointer[tag]);
            }
            else
            {
                CacheNode <TValue> newNode = new CacheNode <TValue>(tag, value);

                if (Count == m_cacheSize)
                {
                    ReplaceRecentlyUsed(newNode);
                }
                else
                {
                    AddToFront(newNode);
                }

                nodePointer.Add(tag, newNode);
            }
        }
 /// <summary>
 /// Replaces the recently used.
 /// </summary>
 /// <param name="node">The node.</param>
 protected abstract void ReplaceRecentlyUsed(CacheNode <TValue> node);
 private void MoveToFront(CacheNode <TValue> node)
 {
     node.Previous.Next = node.Next;
     node.Next.Previous = node.Previous;
     AddToFront(node);
 }