Beispiel #1
0
 /// <summary>
 /// Removes the block.
 /// </summary>
 /// <param name="block">The block.</param>
 public void RemoveBlock(CacheBlock <TKey, TValue> block)
 {
     lock (Blocks)
     {
         Blocks.Remove(block.Key);
     }
 }
Beispiel #2
0
        /// <summary>
        /// Adds the specified key.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public CacheBlock <TKey, TValue> Add(TKey key, TValue value)
        {
            lock (this.Blocks)
            {
                if (this.Blocks.Count >= this.BlockSetCapacity)
                {
                    this.RemoveFirst();
                }

                if (this.Blocks.ContainsKey(key))
                {
                    var r = this.Blocks[key];

                    this.lruList.Remove(r);
                    //this.lruList.AddLast(r);
                    this.Blocks.Remove(key);
                }

                CacheBlock <TKey, TValue> cacheItem = new CacheBlock <TKey, TValue>(key, value);
                LinkedListNode <CacheBlock <TKey, TValue> > node = new LinkedListNode <CacheBlock <TKey, TValue> >(cacheItem);
                this.lruList.AddLast(node);
                this.Blocks.Add(key, cacheItem);

                return(cacheItem);
            }
        }
        /// <summary>
        /// Returns the value and also a flag indicating if given key is present or not and a default value if not key not found
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public bool TryGetValue(TKey key, out TValue value)
        {
            value = default(TValue);

            lock (this.BlockSetsLookup)
            {
                CacheBlockSet <TKey, TValue> node = null;

                CacheBlock <TKey, TValue> mblock = null;

                foreach (var set in BlockSetsLookup.Values)
                {
                    foreach (var block in set.Blocks)
                    {
                        if (block.Key.Equals(key))
                        {
                            node = set;

                            mblock = block.Value;
                            break;
                        }
                    }
                }

                if (mblock != null)
                {
                    TValue blockvalue = default(TValue);

                    if (node.TryGetValue(key, out blockvalue))
                    {
                        node.TryGetValue(key, out blockvalue);

                        value = blockvalue;

                        var lrublock = this.lruList.Find(mblock);

                        this.lruList.Remove(lrublock);
                        this.lruList.AddLast(lrublock);
                        return(true);
                    }
                }

                value = default(TValue);
                return(false);
            }
        }
        /// <summary>
        /// Adds the block set to cache.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="value">The value.</param>
        /// <param name="blockSet">The block set.</param>
        private void AddBlockSetToCache(TKey key, TValue value, CacheBlockSet <TKey, TValue> blockSet)
        {
            CacheBlock <TKey, TValue> cacheItem = null;

            if (blockSet != null)
            {
                cacheItem = blockSet.Add(key, value);
            }

            var blocksets = BlockSetsLookup.Values;

            if (!blocksets.Any(a => a.Blocks.Any(b => b.Key.Equals(key))))
            {
                BlockSetsLookup.Add(key, blockSet);
            }

            this.lruList.AddLast(cacheItem);
        }