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");