You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by ni...@apache.org on 2005/01/28 21:48:47 UTC

cvs commit: logging-log4net/src/ObjectRenderer RendererMap.cs

nicko       2005/01/28 12:48:47

  Modified:    src/ObjectRenderer RendererMap.cs
  Log:
  Added cache map to RenderMap to hold the renderer for queried types
  
  Revision  Changes    Path
  1.9       +30 -16    logging-log4net/src/ObjectRenderer/RendererMap.cs
  
  Index: RendererMap.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/ObjectRenderer/RendererMap.cs,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- RendererMap.cs	17 Jan 2005 20:18:46 -0000	1.8
  +++ RendererMap.cs	28 Jan 2005 20:48:47 -0000	1.9
  @@ -42,6 +42,8 @@
   		#region Member Variables
   
   		private System.Collections.Hashtable m_map;
  +		private System.Collections.Hashtable m_cache = new System.Collections.Hashtable();
  +
   		private static IObjectRenderer s_defaultRenderer = new DefaultRenderer();
   
   		#endregion
  @@ -77,6 +79,13 @@
   		/// </remarks>
   		public string FindAndRender(object obj)
   		{
  +			// Optimisation for strings
  +			string strData = obj as String;
  +			if (strData != null)
  +			{
  +				return strData;
  +			}
  +
   			StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
   			FindAndRender(obj, stringWriter);
   			return stringWriter.ToString();
  @@ -198,27 +207,29 @@
   
   			IObjectRenderer result = null;
   
  -			for(Type cur = type; cur != null; cur = cur.BaseType)
  +			// Check cache
  +			result = (IObjectRenderer)m_cache[type];
  +
  +			if (result == null)
   			{
  -				// Look for the specific type in the map
  -				result = (IObjectRenderer)m_map[cur];
  -				if (result != null) 
  +				for(Type cur = type; cur != null; cur = cur.BaseType)
   				{
  -					break;
  +					// Search the type's interfaces
  +					result = SearchTypeAndInterfaces(cur);
  +					if (result != null)
  +					{
  +						break;
  +					}
   				}
   
  -				// Search the type's interfaces
  -				result = SearchInterfaces(cur);
  -				if (result != null)
  +				// if not set then use the default renderer
  +				if (result == null)
   				{
  -					break;
  +					result = s_defaultRenderer;
   				}
  -			}
   
  -			// if not set then use the default renderer
  -			if (result == null)
  -			{
  -				result = s_defaultRenderer;
  +				// Add to cache
  +				m_cache[type] = result;
   			}
   
   			return result;
  @@ -229,7 +240,7 @@
   		/// </summary>
   		/// <param name="type">the type to lookup the renderer for</param>
   		/// <returns>the renderer for the specified type</returns>
  -		private IObjectRenderer SearchInterfaces(Type type) 
  +		private IObjectRenderer SearchTypeAndInterfaces(Type type) 
   		{
   			IObjectRenderer r = (IObjectRenderer)m_map[type];
   			if (r != null) 
  @@ -240,7 +251,7 @@
   			{
   				foreach(Type t in type.GetInterfaces())
   				{
  -					r = SearchInterfaces(t);
  +					r = SearchTypeAndInterfaces(t);
   					if (r != null)
   					{
   						return r; 
  @@ -277,6 +288,7 @@
   		public void Clear() 
   		{
   			m_map.Clear();
  +			m_cache.Clear();
   		}
   
   		/// <summary>
  @@ -293,6 +305,8 @@
   		/// </remarks>
   		public void Put(Type typeToRender, IObjectRenderer renderer) 
   		{
  +			m_cache.Clear();
  +
   			if (typeToRender == null)
   			{
   				throw new ArgumentNullException("typeToRender");