use the abstract base of CallbackTraceSource to avoid pushing too much code in the header
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sun, 12 Aug 2007 18:27:52 +0200
changeset 1345 eb06ae6eb180
parent 1344 2e0770120285
child 1346 47de68729c86
use the abstract base of CallbackTraceSource to avoid pushing too much code in the header
src/core/composite-trace-resolver.cc
src/core/composite-trace-resolver.h
--- a/src/core/composite-trace-resolver.cc	Sun Aug 12 18:27:30 2007 +0200
+++ b/src/core/composite-trace-resolver.cc	Sun Aug 12 18:27:52 2007 +0200
@@ -64,6 +64,115 @@
 }
 
 void 
+CompositeTraceResolver::Add (std::string name,
+                             FVTraceSourceBase &trace)
+{
+  DoAddFV (name, trace, TraceContext ());
+}
+
+
+void 
+CompositeTraceResolver::DoAddFV (std::string name,
+                               FVTraceSourceBase &trace, 
+                               const TraceContext &context)
+{
+  class FVCompositeItem : public CompositeItem
+  {
+  public:
+    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
+    {if (subpath == "") {trace->AddCallback (cb, context);}}
+    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
+    {if (subpath == "") {trace->RemoveCallback (cb);}}
+
+    FVTraceSourceBase *trace;
+  } *item = new FVCompositeItem ();
+  item->name = name;
+  item->context = context;
+  item->trace = &trace;
+  AddItem (item);
+}
+
+void 
+CompositeTraceResolver::Add (std::string name,
+                             UVTraceSourceBase &trace)
+{
+  DoAddUV (name, trace, TraceContext ());
+}
+
+
+void 
+CompositeTraceResolver::DoAddUV (std::string name,
+                                 UVTraceSourceBase &trace,
+                                 const TraceContext &context)
+{
+  class UVCompositeItem : public CompositeItem
+  {
+  public:
+    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
+    {if (subpath == "") {trace->AddCallback (cb, context);}}
+    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
+    {if (subpath == "") {trace->RemoveCallback (cb);}}
+
+    UVTraceSourceBase *trace;
+  } *item = new UVCompositeItem ();
+  item->name = name;
+  item->context = context;
+  item->trace = &trace;
+  AddItem (item);
+}
+
+void
+CompositeTraceResolver::Add (std::string name,
+                             SVTraceSourceBase &trace)
+{
+  DoAddSV (name, trace, TraceContext ());
+}
+void
+CompositeTraceResolver::DoAddSV (std::string name,
+                                 SVTraceSourceBase &trace, 
+                                 const TraceContext &context)
+{
+  class SVCompositeItem : public CompositeItem
+  {
+  public:
+    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
+    {if (subpath == "") {trace->AddCallback (cb, context);}}
+    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
+    {if (subpath == "") {trace->RemoveCallback (cb);}}
+
+    SVTraceSourceBase *trace;
+  } *item = new SVCompositeItem ();
+  item->name = name;
+  item->context = context;
+  item->trace = &trace;
+  AddItem (item);
+}
+
+void 
+CompositeTraceResolver::DoAddCallback (std::string name,
+                                       CallbackTraceSourceBase &trace, 
+                                       const TraceContext &context)
+{
+  class CallbackCompositeItem : public CompositeItem
+  {
+  public:
+    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
+    {if (subpath == "") {trace->AddCallback (cb, context);}}
+    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
+    {if (subpath == "") {trace->RemoveCallback (cb);}}
+
+    CallbackTraceSourceBase *trace;
+  } *item = new CallbackCompositeItem ();
+  item->name = name;
+  item->context = context;
+  item->trace = &trace;
+  AddItem (item);
+}
+
+
+
+
+void 
 CompositeTraceResolver::AddChild (std::string name, Ptr<Object> child)
 {
   DoAddChild (name, child, TraceContext ());
@@ -229,18 +338,22 @@
 public:
   enum Sources {
     DOUBLEA,
-    DOUBLEB
+    DOUBLEB,
+    UINT16_T
   };
   static uint16_t GetUid (void) 
   {static uint16_t uid = AllocateUid<TraceSourceTest> ("TraceSourceTest"); return uid;}
   void Print (std::ostream &os)
   {os << "tracesource=";
     if (m_sources == DOUBLEA) {os << "doubleA";}
-    else if (m_sources == DOUBLEB) {os << "doubleB";}}
+    else if (m_sources == DOUBLEB) {os << "doubleB";}
+    else if (m_sources == UINT16_T) {os << "uint16_t";}
+  }
   TraceSourceTest () : m_sources (TraceSourceTest::DOUBLEA) {}
   TraceSourceTest (enum Sources sources) :m_sources (sources) {}
-  bool IsDoubleA (void) {return m_sources == TraceSourceTest::DOUBLEA;}
-  bool IsDoubleB (void) {return m_sources == TraceSourceTest::DOUBLEB;}
+  bool IsDoubleA (void) const {return m_sources == TraceSourceTest::DOUBLEA;}
+  bool IsDoubleB (void) const {return m_sources == TraceSourceTest::DOUBLEB;}
+  bool IsUint16 (void) const {return m_sources == TraceSourceTest::UINT16_T;}
 private:
   enum TraceSourceTest::Sources m_sources;
 };
@@ -462,7 +575,9 @@
       ok = false;
     }
 
+  SVTraceSource<uint16_t> source;
 
+  resolver.Add ("uint16_t", source, TraceSourceTest (TraceSourceTest::UINT16_T));
   
 
   return ok;
--- a/src/core/composite-trace-resolver.h	Sun Aug 12 18:27:30 2007 +0200
+++ b/src/core/composite-trace-resolver.h	Sun Aug 12 18:27:52 2007 +0200
@@ -52,11 +52,9 @@
    * resolution. The TraceContext of this trace source will also
    * be automatically extended to contain the input context.
    */
-  template <typename T1, typename T2,
-            typename T3, typename T4,
-            typename T>
+  template <typename T>
   void Add (std::string name,
-            CallbackTraceSource<T1,T2,T3,T4> &trace, T const &context);
+            CallbackTraceSourceBase &trace, T const &context);
   /**
    * \param name name of trace source
    * \param trace a signed variable trace source
@@ -69,7 +67,7 @@
    */
   template <typename T>
   void Add (std::string name,
-            SVTraceSource<T> &trace, T const &context);
+            SVTraceSourceBase &trace, T const &context);
   /**
    * \param name name of trace source
    * \param trace an unsigned variable trace source
@@ -82,7 +80,7 @@
    */
   template <typename T>
   void Add (std::string name,
-            UVTraceSource<T> &trace, T const &context);
+            UVTraceSourceBase &trace, T const &context);
   /**
    * \param name name of trace source
    * \param trace a floating-point variable trace source
@@ -95,7 +93,49 @@
    */
   template <typename T>
   void Add (std::string name,
-            FVTraceSource<T> &trace, T const &context);
+            FVTraceSourceBase &trace, T const &context);
+  /**
+   * \param name name of trace source
+   * \param trace a callback trace source
+   *
+   * Add a callback trace source in this resolver. This trace
+   * source will match the name specified during namespace 
+   * resolution.
+   */
+  template <typename T1, typename T2,
+            typename T3, typename T4>
+  void Add (std::string name,
+            CallbackTraceSource<T1,T2,T3,T4> &trace);
+  /**
+   * \param name name of trace source
+   * \param trace a signed variable trace source
+   *
+   * Add a signed variable trace source in this resolver. 
+   * This trace source will match the name specified during namespace 
+   * resolution.
+   */
+  void Add (std::string name,
+            SVTraceSourceBase &trace);
+  /**
+   * \param name name of trace source
+   * \param trace an unsigned variable trace source
+   *
+   * Add an unsigned variable trace source in this resolver. 
+   * This trace source will match the name specified during namespace 
+   * resolution.
+   */
+  void Add (std::string name,
+            UVTraceSourceBase &trace);
+  /**
+   * \param name name of trace source
+   * \param trace a floating-point variable trace source
+   *
+   * Add a floating-point variable trace source in this resolver. 
+   * This trace source will match the name specified during namespace 
+   * resolution.
+   */
+  void Add (std::string name,
+            FVTraceSourceBase &trace);
   /**
    * \param name name of child trace resolver
    * \param createResolver a trace resolver constructor
@@ -155,6 +195,19 @@
                                       const TraceContext &context, 
                                       enum Operation op);
   void DoAddChild (std::string name, Ptr<Object> child, const TraceContext &context);
+  void DoAddCallback (std::string name,
+                      CallbackTraceSourceBase &trace,
+                      const TraceContext &context);
+  void DoAddSV (std::string name,
+                SVTraceSourceBase &trace, 
+                const TraceContext &context);
+  void DoAddUV (std::string name,
+                UVTraceSourceBase &trace,
+                const TraceContext &context);
+  void DoAddFV (std::string name,
+                FVTraceSourceBase &trace,
+                const TraceContext &context);
+
 
   CompositeTraceResolver::TraceItems m_items;
   Ptr<TraceResolver> m_parent;
@@ -166,88 +219,51 @@
 
 
 
-template <typename T1, typename T2,
-          typename T3, typename T4,
-          typename T>
+template <typename T>
 void 
 CompositeTraceResolver::Add (std::string name,
-                             CallbackTraceSource<T1,T2,T3,T4> &trace, 
+                             CallbackTraceSourceBase &trace, 
                              T const &context)
 {
-  class CallbackCompositeItem : public CompositeItem
-  {
-  public:
-    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
-    {if (subpath == "") {trace->AddCallback (cb, context);}}
-    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
-    {if (subpath == "") {trace->RemoveCallback (cb);}}
+  TraceContext ctx;
+  ctx.Add (context);
+  DoAddCallback (name, trace, ctx);  
+}
+template <typename T1, typename T2,
+          typename T3, typename T4>
+void 
+CompositeTraceResolver::Add (std::string name,
+                             CallbackTraceSource<T1,T2,T3,T4> &trace)
+{
+  DoAddCallback (name, trace, TraceContext ());
+}
 
-    CallbackTraceSource<T1,T2,T3,T4> *trace;
-  } *item = new CallbackCompositeItem ();
-  item->name = name;
-  item->context.Add (context);
-  item->trace = &trace;
-  AddItem (item);
+template <typename T>
+void 
+CompositeTraceResolver::Add (std::string name,
+                             SVTraceSourceBase &trace, T const &context)
+{
+  TraceContext ctx;
+  ctx.Add (context);
+  DoAddSV (name, trace, ctx);  
 }
 template <typename T>
 void 
 CompositeTraceResolver::Add (std::string name,
-                             SVTraceSource<T> &trace, T const &context)
+                             UVTraceSourceBase &trace, T const &context)
 {
-  class SVCompositeItem : public CompositeItem
-  {
-  public:
-    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
-    {if (subpath == "") {trace->AddCallback (cb, context);}}
-    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
-    {if (subpath == "") {trace->RemoveCallback (cb);}}
-
-    SVTraceSource<T> *trace;
-  } *item = new SVCompositeItem ();
-  item->name = name;
-  item->context.Add (context);
-  item->trace = &trace;
-  AddItem (item);
+  TraceContext ctx;
+  ctx.Add (context);
+  DoAddUV (name, trace, ctx);
 }
 template <typename T>
 void 
 CompositeTraceResolver::Add (std::string name,
-                             UVTraceSource<T> &trace, T const &context)
+                             FVTraceSourceBase &trace, T const &context)
 {
-  class UVCompositeItem : public CompositeItem
-  {
-  public:
-    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
-    {if (subpath == "") {trace->AddCallback (cb, context);}}
-    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
-    {if (subpath == "") {trace->RemoveCallback (cb);}}
-
-    UVTraceSource<T> *trace;
-  } *item = new UVCompositeItem ();
-  item->name = name;
-  item->context.Add (context);
-  item->trace = &trace;
-  AddItem (item);
-}
-template <typename T>
-void 
-CompositeTraceResolver::Add (std::string name,
-                             FVTraceSource<T> &trace, T const &context)
-{
-  class FVCompositeItem : public CompositeItem
-  {
-  public:
-    virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
-    {if (subpath == "") {trace->AddCallback (cb, context);}}
-    virtual void Disconnect (std::string subpath, const CallbackBase &cb)
-    {if (subpath == "") {trace->RemoveCallback (cb);}}
-
-    FVTraceSource<T> *trace;
-  } *item = new FVCompositeItem ();
-  item->name = name;
-  item->context.Add (context);
-  item->trace = &trace;
-  AddItem (item);
+  TraceContext ctx;
+  ctx.Add (context);
+  DoAddFV (name, trace, ctx);
 }
 
 template <typename ITERATOR, typename INDEX>