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

Reply via email to