//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ using System; using System.Collections; using System.Collections.Concurrent; using System.Linq; using System.Text; using System.Threading; namespace System.ServiceModel.Dispatcher { class NameValueCache { // The NameValueCache implements a structure that uses a dictionary to map objects to // indices of an array of cache entries. This allows us to store the cache entries in // the order in which they were added to the cache, and yet still lookup any cache entry. // The eviction policy of the cache is to evict the least-recently-added cache entry. // Using a pointer to the next available cache entry in the array, we can always be sure // that the given entry is the oldest entry. Hashtable cache; string[] currentKeys; int nextAvailableCacheIndex; object cachelock; internal const int maxNumberofEntriesInCache = 16; public NameValueCache() : this(maxNumberofEntriesInCache) { } public NameValueCache(int maxCacheEntries) { cache = new Hashtable(); currentKeys = new string[maxCacheEntries]; cachelock = new object(); } public T Lookup(string key) { return (T)cache[key]; } public void AddOrUpdate(string key, T value) { lock (cache) { if (!cache.ContainsKey(key)) { if (!String.IsNullOrEmpty(currentKeys[nextAvailableCacheIndex])) { cache.Remove(currentKeys[nextAvailableCacheIndex]); } currentKeys[nextAvailableCacheIndex] = key; nextAvailableCacheIndex = ++nextAvailableCacheIndex % currentKeys.Length; } cache[key] = value; } } } }