You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by di...@apache.org on 2011/04/26 13:13:27 UTC

[Lucene.Net] svn commit: r1096727 - in /incubator/lucene.net/branches/Lucene.Net_2_9_4g: src/core/ src/core/Index/ src/core/Search/ src/core/Util/Cache/ test/core/ test/core/Util/Cache/

Author: digy
Date: Tue Apr 26 11:13:26 2011
New Revision: 1096727

URL: http://svn.apache.org/viewvc?rev=1096727&view=rev
Log:
[LUCENENET-412] SimpleLRUCache

Modified:
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/IndexWriter.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/TermInfosReader.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Search/FilterManager.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/SupportClass.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/Cache.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleLRUCache.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleMapCache.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/TestSupportClass.cs
    incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/Util/Cache/TestSimpleLRUCache.cs

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/IndexWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/IndexWriter.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/IndexWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/IndexWriter.cs Tue Apr 26 11:13:26 2011
@@ -322,7 +322,7 @@ namespace Lucene.Net.Index
 		
 		// Holds all SegmentInfo instances currently involved in
 		// merges
-        private System.Collections.Hashtable mergingSegments = new System.Collections.Hashtable();
+        private SupportClass.Set<SegmentInfo> mergingSegments = new SupportClass.Set<SegmentInfo>();
 		
 		private MergePolicy mergePolicy;
 		private MergeScheduler mergeScheduler = new ConcurrentMergeScheduler();
@@ -490,8 +490,8 @@ namespace Lucene.Net.Index
 				}
 				
 			}
-			
-			private System.Collections.IDictionary readerMap = new System.Collections.Hashtable();
+
+            private SupportClass.Dictionary<SegmentInfo, SegmentReader> readerMap = new SupportClass.Dictionary<SegmentInfo, SegmentReader>();
 			
 			/// <summary>Forcefully clear changes for the specifed segments,
 			/// and remove from the pool.   This is called on succesful merge. 
@@ -502,12 +502,10 @@ namespace Lucene.Net.Index
 				{
 					if (infos == null)
 					{
-                        System.Collections.IEnumerator iter = new System.Collections.Hashtable(readerMap).GetEnumerator();
-						while (iter.MoveNext())
-						{
-							System.Collections.DictionaryEntry ent = (System.Collections.DictionaryEntry) iter.Current;
-							((SegmentReader) ent.Value).hasChanges = false;
-						}
+                        foreach (SegmentReader sr in readerMap.Values)
+                        {
+                            sr.hasChanges = false;
+                        }
 					}
 					else
 					{
@@ -515,9 +513,9 @@ namespace Lucene.Net.Index
 						for (int i = 0; i < numSegments; i++)
 						{
 							SegmentInfo info = infos.Info(i);
-							if (readerMap.Contains(info))
+							if (readerMap.ContainsKey(info))
 							{
-								((SegmentReader) readerMap[info]).hasChanges = false;
+								readerMap[info].hasChanges = false;
 							}
 						}
 					}
@@ -574,7 +572,7 @@ namespace Lucene.Net.Index
 				lock (this)
 				{
 					
-					bool pooled = readerMap.Contains(sr.GetSegmentInfo());
+					bool pooled = readerMap.ContainsKey(sr.GetSegmentInfo());
 
                     System.Diagnostics.Debug.Assert(!pooled || readerMap[sr.GetSegmentInfo()] == sr);
 
@@ -624,30 +622,27 @@ namespace Lucene.Net.Index
 			{
 				lock (this)
 				{
-                    System.Collections.IEnumerator iter = new System.Collections.Hashtable(readerMap).GetEnumerator();
-					while (iter.MoveNext())
-					{
-						System.Collections.DictionaryEntry ent = (System.Collections.DictionaryEntry) iter.Current;
-						
-						SegmentReader sr = (SegmentReader) ent.Value;
-						if (sr.hasChanges)
-						{
-							System.Diagnostics.Debug.Assert(InfoIsLive(sr.GetSegmentInfo()));
-							sr.DoCommit(null);
+                    foreach (KeyValuePair<SegmentInfo, SegmentReader> ent in new SupportClass.Dictionary<SegmentInfo, SegmentReader>(readerMap))
+                    {
+                        SegmentReader sr = ent.Value;
+                        if (sr.hasChanges)
+                        {
+                            System.Diagnostics.Debug.Assert(InfoIsLive(sr.GetSegmentInfo()));
+                            sr.DoCommit(null);
                             // Must checkpoint w/ deleter, because this
                             // segment reader will have created new _X_N.del
                             // file.
                             enclosingInstance.deleter.Checkpoint(enclosingInstance.segmentInfos, false);
-						}
+                        }
 
-                        readerMap.Remove(ent.Key); 
-						
-						// NOTE: it is allowed that this decRef does not
-						// actually close the SR; this can happen when a
-						// near real-time reader is kept open after the
-						// IndexWriter instance is closed
-						sr.DecRef();
-					}
+                        readerMap.Remove(ent.Key);
+
+                        // NOTE: it is allowed that this decRef does not
+                        // actually close the SR; this can happen when a
+                        // near real-time reader is kept open after the
+                        // IndexWriter instance is closed
+                        sr.DecRef();
+                    }
 				}
 			}
 			
@@ -657,22 +652,19 @@ namespace Lucene.Net.Index
 			{
 				lock (this)
 				{
-                    System.Collections.IEnumerator iter = new System.Collections.Hashtable(readerMap).GetEnumerator();
-					while (iter.MoveNext())
-					{
-						System.Collections.DictionaryEntry ent = (System.Collections.DictionaryEntry) iter.Current;
-						
-						SegmentReader sr = (SegmentReader) ent.Value;
-						if (sr.hasChanges)
-						{
-							System.Diagnostics.Debug.Assert(InfoIsLive(sr.GetSegmentInfo()));
-							sr.DoCommit(null);
+                    foreach (KeyValuePair<SegmentInfo, SegmentReader> ent in new SupportClass.Dictionary<SegmentInfo, SegmentReader>(readerMap))
+                    {
+                        SegmentReader sr = ent.Value;
+                        if (sr.hasChanges)
+                        {
+                            System.Diagnostics.Debug.Assert(InfoIsLive(sr.GetSegmentInfo()));
+                            sr.DoCommit(null);
                             // Must checkpoint w/ deleter, because this
                             // segment reader will have created new _X_N.del
                             // file.
                             enclosingInstance.deleter.Checkpoint(enclosingInstance.segmentInfos, false);
-						}
-					}
+                        }
+                    }
 				}
 			}
 			
@@ -738,7 +730,7 @@ namespace Lucene.Net.Index
 						readBufferSize = BufferedIndexInput.BUFFER_SIZE;
 					}
 					
-					SegmentReader sr = (SegmentReader) readerMap[info];
+					SegmentReader sr = readerMap[info];
 					if (sr == null)
 					{
 						// TODO: we may want to avoid doing this while
@@ -784,7 +776,7 @@ namespace Lucene.Net.Index
 			{
 				lock (this)
 				{
-					SegmentReader sr = (SegmentReader) readerMap[info];
+					SegmentReader sr = readerMap[info];
 					if (sr != null)
 					{
 						sr.IncRef();
@@ -5560,7 +5552,7 @@ namespace Lucene.Net.Index
                 for (int i = 0; i < count; i++)
                 {
                     SegmentInfo si = merge.segments.Info(i);
-                    mergingSegments[si] = si;
+                    mergingSegments.Add(si);
                 }
 				
 				// Merge is now registered
@@ -5745,7 +5737,7 @@ namespace Lucene.Net.Index
 				// this prevents it from getting selected for a merge
 				// after our merge is done but while we are building the
 				// CFS:
-                mergingSegments[merge.info] = merge.info;
+                mergingSegments.Add(merge.info);
 			}
 		}
 		
@@ -5966,9 +5958,7 @@ namespace Lucene.Net.Index
 			merge.readersClone = new SegmentReader[numSegments];
 			
 			bool mergeDocStores = false;
-
-            System.Collections.Hashtable dss = new System.Collections.Hashtable();
-			
+                        			
             String currentDocStoreSegment;
             lock(this) {
                 currentDocStoreSegment = docWriter.GetDocStoreSegment();
@@ -6307,7 +6297,7 @@ namespace Lucene.Net.Index
         private Dictionary<string, string> synced = new Dictionary<string, string>();
 		
 		// Files that are now being sync'd
-        private System.Collections.Hashtable syncing = new System.Collections.Hashtable();
+        private SupportClass.Set<string> syncing = new SupportClass.Set<string>();
 		
 		private bool StartSync(System.String fileName, ICollection<System.String> pending)
 		{
@@ -6317,7 +6307,7 @@ namespace Lucene.Net.Index
 				{
 					if (!syncing.Contains(fileName))
 					{
-						syncing[fileName] = fileName;
+						syncing.Add(fileName);
 						return true;
 					}
 					else
@@ -6335,7 +6325,7 @@ namespace Lucene.Net.Index
 		{
 			lock (synced)
 			{
-				System.Diagnostics.Debug.Assert(syncing.ContainsKey(fileName));
+				System.Diagnostics.Debug.Assert(syncing.Contains(fileName));
 				syncing.Remove(fileName);
 				if (success)
                     synced[fileName] = fileName;

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/TermInfosReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/TermInfosReader.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/TermInfosReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Index/TermInfosReader.cs Tue Apr 26 11:13:26 2011
@@ -19,7 +19,7 @@ using System;
 
 using Directory = Lucene.Net.Store.Directory;
 using CloseableThreadLocal = Lucene.Net.Util.CloseableThreadLocal;
-using SimpleLRUCache = Lucene.Net.Util.Cache.SimpleLRUCache;
+using SimpleLRUCache = Lucene.Net.Util.Cache.SimpleLRUCache<Lucene.Net.Index.Term,Lucene.Net.Index.TermInfo>;
 
 namespace Lucene.Net.Index
 {
@@ -53,7 +53,7 @@ namespace Lucene.Net.Index
 			internal SegmentTermEnum termEnum;
 			
 			// Used for caching the least recently looked-up Terms
-			internal Lucene.Net.Util.Cache.Cache termInfoCache;
+            internal Lucene.Net.Util.Cache.Cache<Term, TermInfo> termInfoCache;
 		}
 		
 		internal TermInfosReader(Directory dir, System.String seg, FieldInfos fis, int readBufferSize, int indexDivisor)
@@ -208,13 +208,13 @@ namespace Lucene.Net.Index
 			
 			TermInfo ti;
 			ThreadResources resources = GetThreadResources();
-			Lucene.Net.Util.Cache.Cache cache = null;
+			Lucene.Net.Util.Cache.Cache<Term,TermInfo> cache = null;
 			
 			if (useCache)
 			{
 				cache = resources.termInfoCache;
 				// check the cache first if the term was recently looked up
-				ti = (TermInfo) cache.Get(term);
+				ti = cache.Get(term);
 				if (ti != null)
 				{
 					return ti;

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Search/FilterManager.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Search/FilterManager.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Search/FilterManager.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Search/FilterManager.cs Tue Apr 26 11:13:26 2011
@@ -43,7 +43,7 @@ namespace Lucene.Net.Search
 		protected internal const long DEFAULT_CACHE_SLEEP_TIME = 1000 * 60 * 10;
 		
 		/// <summary>The cache itself </summary>
-		protected internal System.Collections.IDictionary cache;
+		protected internal IDictionary<int,FilterItem> cache;
 		/// <summary>Maximum allowed cache size </summary>
 		protected internal int cacheCleanSize;
 		/// <summary>Cache cleaning frequency </summary>
@@ -66,7 +66,7 @@ namespace Lucene.Net.Search
 		/// <summary> Sets up the FilterManager singleton.</summary>
 		protected internal FilterManager()
 		{
-			cache = new System.Collections.Hashtable();
+			cache = new SupportClass.Dictionary<int,FilterItem>();
 			cacheCleanSize = DEFAULT_CACHE_CLEAN_SIZE; // Let the cache get to 100 items
 			cleanSleepTime = DEFAULT_CACHE_SLEEP_TIME; // 10 minutes between cleanings
 			
@@ -104,16 +104,16 @@ namespace Lucene.Net.Search
 		/// </returns>
 		public virtual Filter GetFilter(Filter filter)
 		{
-			lock (cache.SyncRoot)
+			lock (cache)
 			{
 				FilterItem fi = null;
-				fi = (FilterItem) cache[(System.Int32) filter.GetHashCode()];
+				fi = cache[filter.GetHashCode()];
 				if (fi != null)
 				{
 					fi.timestamp = System.DateTime.Now.Ticks;
 					return fi.filter;
 				}
-				cache[(System.Int32) filter.GetHashCode()] = new FilterItem(this, filter);
+				cache[filter.GetHashCode()] = new FilterItem(this, filter);
 				return filter;
 			}
 		}
@@ -197,7 +197,7 @@ namespace Lucene.Net.Search
 					{
 						// empty the temporary set
 						filterItems.Clear();
-                        lock (this.manager.cache.SyncRoot)
+                        lock (this.manager.cache)
 						{
                             foreach (FilterItem item in this.manager.cache.Values)
                             {

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/SupportClass.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/SupportClass.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/SupportClass.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/SupportClass.cs Tue Apr 26 11:13:26 2011
@@ -1567,6 +1567,12 @@ public class SupportClass
             _Set.Clear();
             base.Clear();
         }
+
+        public new void Remove(T item)
+        {
+            _Set.Remove(item);
+            base.Remove(item);
+        }
     }
 
     public class Cryptography

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/Cache.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/Cache.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/Cache.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/Cache.cs Tue Apr 26 11:13:26 2011
@@ -16,36 +16,37 @@
  */
 
 using System;
+using System.Collections.Generic;
 
 namespace Lucene.Net.Util.Cache
 {
 	
 	
 	/// <summary> Base class for cache implementations.</summary>
-	public abstract class Cache
+	public abstract class Cache<K,V>
 	{
 		
 		/// <summary> Simple Cache wrapper that synchronizes all
 		/// calls that access the cache. 
 		/// </summary>
-		internal class SynchronizedCache_Renamed_Class:Cache
+		internal class SynchronizedCache_Renamed_Class<K,V>:Cache<K,V>
 		{
 			internal System.Object mutex;
-			internal Cache cache;
+			internal Cache<K,V> cache;
 			
-			internal SynchronizedCache_Renamed_Class(Cache cache)
+			internal SynchronizedCache_Renamed_Class(Cache<K,V> cache)
 			{
 				this.cache = cache;
 				this.mutex = this;
 			}
-			
-			internal SynchronizedCache_Renamed_Class(Cache cache, System.Object mutex)
+
+            internal SynchronizedCache_Renamed_Class(Cache<K, V> cache, System.Object mutex)
 			{
 				this.cache = cache;
 				this.mutex = mutex;
 			}
 			
-			public override void  Put(System.Object key, System.Object value_Renamed)
+			public override void  Put(K key, V value_Renamed)
 			{
 				lock (mutex)
 				{
@@ -53,7 +54,7 @@ namespace Lucene.Net.Util.Cache
 				}
 			}
 			
-			public override System.Object Get(System.Object key)
+			public override V Get(K key)
 			{
 				lock (mutex)
 				{
@@ -61,7 +62,7 @@ namespace Lucene.Net.Util.Cache
 				}
 			}
 			
-			public override bool ContainsKey(System.Object key)
+			public override bool ContainsKey(K key)
 			{
 				lock (mutex)
 				{
@@ -76,8 +77,8 @@ namespace Lucene.Net.Util.Cache
 					cache.Close();
 				}
 			}
-			
-			internal override Cache GetSynchronizedCache()
+
+            internal override Cache<K, V> GetSynchronizedCache()
 			{
 				return this;
 			}
@@ -87,7 +88,7 @@ namespace Lucene.Net.Util.Cache
 		/// In order to guarantee thread-safety, all access to the backed cache must
 		/// be accomplished through the returned cache.
 		/// </summary>
-		public static Cache SynchronizedCache(Cache cache)
+        public static Cache<K, V> SynchronizedCache(Cache<K, V> cache)
 		{
 			return cache.GetSynchronizedCache();
 		}
@@ -98,19 +99,19 @@ namespace Lucene.Net.Util.Cache
 		/// e. g. subclasses of {@link SynchronizedCache} or this
 		/// in case this cache is already synchronized.
 		/// </summary>
-		internal virtual Cache GetSynchronizedCache()
+        internal virtual Cache<K, V> GetSynchronizedCache()
 		{
-			return new SynchronizedCache_Renamed_Class(this);
+			return new SynchronizedCache_Renamed_Class<K,V>(this);
 		}
 		
 		/// <summary> Puts a (key, value)-pair into the cache. </summary>
-		public abstract void  Put(System.Object key, System.Object value_Renamed);
+		public abstract void  Put(K key, V value_Renamed);
 		
 		/// <summary> Returns the value for the given key. </summary>
-		public abstract System.Object Get(System.Object key);
+		public abstract V Get(K key);
 		
 		/// <summary> Returns whether the given key is in this cache. </summary>
-		public abstract bool ContainsKey(System.Object key);
+		public abstract bool ContainsKey(K key);
 		
 		/// <summary> Closes the cache.</summary>
 		public abstract void  Close();

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleLRUCache.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleLRUCache.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleLRUCache.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleLRUCache.cs Tue Apr 26 11:13:26 2011
@@ -20,7 +20,7 @@ using System.Collections.Generic;
 
 namespace Lucene.Net.Util.Cache
 {
-    public class SimpleLRUCache : SimpleMapCache
+    public class SimpleLRUCache<K, V> : SimpleMapCache<K, V>
     {
         /// <summary>
         /// The maximum number of items to cache.
@@ -30,27 +30,27 @@ namespace Lucene.Net.Util.Cache
         /// <summary>
         /// The list to efficiently maintain the LRU state.
         /// </summary>
-        private LinkedList<ListValueEntry> list;
+        private LinkedList<ListValueEntry<K, V>> list;
 
         /// <summary>
         /// The dictionary to hash into any location in the list.
         /// </summary>
-        private Dictionary<object, LinkedListNode<ListValueEntry>> lookup;
+        private Dictionary<K, LinkedListNode<ListValueEntry<K, V>>> lookup;
 
         /// <summary>
         /// The node instance to use/re-use when adding an item to the cache.
         /// </summary>
-        private LinkedListNode<ListValueEntry> openNode;
+        private LinkedListNode<ListValueEntry<K, V>> openNode;
 
         public SimpleLRUCache(int Capacity)
         {
             this.capacity = Capacity;
-            this.list = new LinkedList<ListValueEntry>();
-            this.lookup = new Dictionary<object, LinkedListNode<ListValueEntry>>(Capacity + 1);
-            this.openNode = new LinkedListNode<ListValueEntry>(new ListValueEntry(null, null));
+            this.list = new LinkedList<ListValueEntry<K, V>>();
+            this.lookup = new Dictionary<K, LinkedListNode<ListValueEntry<K, V>>>(Capacity + 1);
+            this.openNode = new LinkedListNode<ListValueEntry<K, V>>(new ListValueEntry<K, V>(default(K), default(V)));
         }
 
-        public override void Put(object Key, object Value)
+        public override void Put(K Key, V Value)
         {
             if (Get(Key) == null)
             {
@@ -71,17 +71,17 @@ namespace Lucene.Net.Util.Cache
                 else
                 {
                     // still filling the cache, create a new open node for the next time
-                    this.openNode = new LinkedListNode<ListValueEntry>(new ListValueEntry(null, null));
+                    this.openNode = new LinkedListNode<ListValueEntry<K,V>>(new ListValueEntry<K,V>(default(K), default(V)));
                 }
             }
         }
 
-        public override object Get(object Key)
+        public override V Get(K Key)
         {
-            LinkedListNode<ListValueEntry> node = null;
+            LinkedListNode<ListValueEntry<K,V>> node = null;
             if(!this.lookup.TryGetValue(Key, out node))
             {
-                return null;
+                return default(V);
             }
             this.list.Remove(node);
             this.list.AddFirst(node);
@@ -92,12 +92,12 @@ namespace Lucene.Net.Util.Cache
         /// Container to hold the key and value to aid in removal from 
         /// the <see cref="lookup"/> dictionary when an item is removed from cache.
         /// </summary>
-        class ListValueEntry
+        class ListValueEntry<K, V>
         {
-            internal object ItemValue;
-            internal object ItemKey;
+            internal V ItemValue;
+            internal K ItemKey;
 
-            internal ListValueEntry(object key, object value)
+            internal ListValueEntry(K key, V value)
             {
                 this.ItemKey = key;
                 this.ItemValue = value;

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleMapCache.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleMapCache.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleMapCache.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/core/Util/Cache/SimpleMapCache.cs Tue Apr 26 11:13:26 2011
@@ -16,6 +16,7 @@
  */
 
 using System;
+using System.Collections.Generic;
 
 namespace Lucene.Net.Util.Cache
 {
@@ -24,25 +25,25 @@ namespace Lucene.Net.Util.Cache
 	/// This cache is not synchronized, use {@link Cache#SynchronizedCache(Cache)}
 	/// if needed.
 	/// </summary>
-	public class SimpleMapCache:Cache
+    public class SimpleMapCache<K, V> : Cache<K, V>
 	{
-		internal System.Collections.IDictionary map;
+        internal SupportClass.Dictionary<K, V> map;
 		
-		public SimpleMapCache():this(new System.Collections.Hashtable())
+		public SimpleMapCache():this(new SupportClass.Dictionary<K,V>())
 		{
 		}
-		
-		public SimpleMapCache(System.Collections.IDictionary map)
+
+        public SimpleMapCache(SupportClass.Dictionary<K, V> map)
 		{
 			this.map = map;
 		}
 		
-		public override System.Object Get(System.Object key)
+		public override V Get(K key)
 		{
 			return map[key];
 		}
 		
-		public override void  Put(System.Object key, System.Object value_Renamed)
+		public override void  Put(K key, V value_Renamed)
 		{
 			map[key] = value_Renamed;
 		}
@@ -52,34 +53,34 @@ namespace Lucene.Net.Util.Cache
 			// NOOP
 		}
 		
-		public override bool ContainsKey(System.Object key)
+		public override bool ContainsKey(K key)
 		{
-			return map.Contains(key);
+			return map.ContainsKey(key);
 		}
 		
 		/// <summary> Returns a Set containing all keys in this cache.</summary>
-		public virtual System.Collections.ICollection KeySet()
+		public virtual ICollection<K> KeySet()
 		{
 			return map.Keys;
 		}
 		
-		internal override Cache GetSynchronizedCache()
+		internal override Cache<K,V> GetSynchronizedCache()
 		{
-			return new SynchronizedSimpleMapCache(this);
+			return new SynchronizedSimpleMapCache<K,V>(this);
 		}
 		
-		private class SynchronizedSimpleMapCache:SimpleMapCache
+		private class SynchronizedSimpleMapCache<K,V>:SimpleMapCache<K,V>
 		{
 			internal System.Object mutex;
-			internal SimpleMapCache cache;
+			internal SimpleMapCache<K,V> cache;
 			
-			internal SynchronizedSimpleMapCache(SimpleMapCache cache)
+			internal SynchronizedSimpleMapCache(SimpleMapCache<K,V> cache)
 			{
 				this.cache = cache;
 				this.mutex = this;
 			}
 			
-			public override void  Put(System.Object key, System.Object value_Renamed)
+			public override void  Put(K key, V value_Renamed)
 			{
 				lock (mutex)
 				{
@@ -87,7 +88,7 @@ namespace Lucene.Net.Util.Cache
 				}
 			}
 			
-			public override System.Object Get(System.Object key)
+			public override V Get(K key)
 			{
 				lock (mutex)
 				{
@@ -95,7 +96,7 @@ namespace Lucene.Net.Util.Cache
 				}
 			}
 			
-			public override bool ContainsKey(System.Object key)
+			public override bool ContainsKey(K key)
 			{
 				lock (mutex)
 				{
@@ -111,7 +112,7 @@ namespace Lucene.Net.Util.Cache
 				}
 			}
 			
-			public override System.Collections.ICollection KeySet()
+			public override ICollection<K> KeySet()
 			{
 				lock (mutex)
 				{
@@ -119,7 +120,7 @@ namespace Lucene.Net.Util.Cache
 				}
 			}
 			
-			internal override Cache GetSynchronizedCache()
+			internal override Cache<K,V> GetSynchronizedCache()
 			{
 				return this;
 			}

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/TestSupportClass.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/TestSupportClass.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/TestSupportClass.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/TestSupportClass.cs Tue Apr 26 11:13:26 2011
@@ -864,7 +864,7 @@ namespace Lucene.Net._SupportClass
         [Test]
         public void Test()
         {
-            Lucene.Net.Util.Cache.SimpleLRUCache cache = new Lucene.Net.Util.Cache.SimpleLRUCache(3);
+            Lucene.Net.Util.Cache.SimpleLRUCache<string,string> cache = new Lucene.Net.Util.Cache.SimpleLRUCache<string,string>(3);
             cache.Put("a", "a");
             cache.Put("b", "b");
             cache.Put("c", "c");

Modified: incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/Util/Cache/TestSimpleLRUCache.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/Util/Cache/TestSimpleLRUCache.cs?rev=1096727&r1=1096726&r2=1096727&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/Util/Cache/TestSimpleLRUCache.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net_2_9_4g/test/core/Util/Cache/TestSimpleLRUCache.cs Tue Apr 26 11:13:26 2011
@@ -34,43 +34,43 @@ namespace Lucene.Net.Util.Cache
 			int n = 100;
 			System.Object dummy = new System.Object();
 			
-			Cache cache = new SimpleLRUCache(n);
+			Cache<int,object> cache = new SimpleLRUCache<int,object>(n);
 			
 			for (int i = 0; i < n; i++)
 			{
-				cache.Put((System.Object) i, dummy);
+				cache.Put( i, dummy);
 			}
 			
 			// access every 2nd item in cache
 			for (int i = 0; i < n; i += 2)
 			{
-				Assert.IsNotNull(cache.Get((System.Object) i));
+				Assert.IsNotNull(cache.Get(i));
 			}
 			
 			// add n/2 elements to cache, the ones that weren't
 			// touched in the previous loop should now be thrown away
 			for (int i = n; i < n + (n / 2); i++)
 			{
-				cache.Put((System.Object) i, dummy);
+				cache.Put(i, dummy);
 			}
 			
 			// access every 4th item in cache
 			for (int i = 0; i < n; i += 4)
 			{
-				Assert.IsNotNull(cache.Get((System.Object) i));
+				Assert.IsNotNull(cache.Get(i));
 			}
 			
 			// add 3/4n elements to cache, the ones that weren't
 			// touched in the previous loops should now be thrown away
 			for (int i = n; i < n + (n * 3 / 4); i++)
 			{
-				cache.Put((System.Object) i, dummy);
+				cache.Put(i, dummy);
 			}
 			
 			// access every 4th item in cache
 			for (int i = 0; i < n; i += 4)
 			{
-				Assert.IsNotNull(cache.Get((System.Object) i));
+				Assert.IsNotNull(cache.Get(i));
 			}
 		}
 	}