src/common/composite-trace-resolver.h
changeset 345 47b41507a45a
child 393 18ed386bee75
equal deleted inserted replaced
344:b547ec7dbbc1 345:47b41507a45a
       
     1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
       
     2 /*
       
     3  * Copyright (c) 2007 INRIA
       
     4  * All rights reserved.
       
     5  *
       
     6  * This program is free software; you can redistribute it and/or modify
       
     7  * it under the terms of the GNU General Public License version 2 as
       
     8  * published by the Free Software Foundation;
       
     9  *
       
    10  * This program is distributed in the hope that it will be useful,
       
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    13  * GNU General Public License for more details.
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License
       
    16  * along with this program; if not, write to the Free Software
       
    17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    18  *
       
    19  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
       
    20  */
       
    21 #ifndef COMPOSITE_TRACE_RESOLVER_H
       
    22 #define COMPOSITE_TRACE_RESOLVER_H
       
    23 
       
    24 #include "ns3/callback.h"
       
    25 #include "trace-resolver.h"
       
    26 #include "callback-trace-source.h"
       
    27 #include "uv-trace-source.h"
       
    28 #include "sv-trace-source.h"
       
    29 #include "fv-trace-source.h"
       
    30 #include "terminal-trace-resolver.h"
       
    31 
       
    32 namespace ns3 {
       
    33 
       
    34 /**
       
    35  * \brief a helper class to aggregate contained TraceResolver and other trace sources.
       
    36  * \ingroup tracing
       
    37  */
       
    38 class CompositeTraceResolver : public TraceResolver
       
    39 {
       
    40 public:
       
    41   CompositeTraceResolver (TraceContext const &context);
       
    42   virtual ~CompositeTraceResolver ();
       
    43   /**
       
    44    * \param name name of trace source
       
    45    * \param trace a callback trace source
       
    46    * \param context the context associated to this trace source
       
    47    *
       
    48    * Add a callback trace source in this resolver. This trace
       
    49    * source will match the name specified during namespace 
       
    50    * resolution. The TraceContext of this trace source will also
       
    51    * be automatically extended to contain the input context.
       
    52    */
       
    53   template <typename T1, typename T2,
       
    54             typename T3, typename T4,
       
    55             typename T>
       
    56   void Add (std::string name,
       
    57             CallbackTraceSource<T1,T2,T3,T4> &trace, T const &context);
       
    58   /**
       
    59    * \param name name of trace source
       
    60    * \param trace a signed variable trace source
       
    61    * \param context the context associated to this trace source
       
    62    *
       
    63    * Add a signed variable trace source in this resolver. 
       
    64    * This trace source will match the name specified during namespace 
       
    65    * resolution. The TraceContext of this trace source will also
       
    66    * be automatically extended to contain the input context.
       
    67    */
       
    68   template <typename T>
       
    69   void Add (std::string name,
       
    70             SVTraceSource<T> &trace, T const &context);
       
    71   /**
       
    72    * \param name name of trace source
       
    73    * \param trace an unsigned variable trace source
       
    74    * \param context the context associated to this trace source
       
    75    *
       
    76    * Add an unsigned variable trace source in this resolver. 
       
    77    * This trace source will match the name specified during namespace 
       
    78    * resolution. The TraceContext of this trace source will also
       
    79    * be automatically extended to contain the input context.
       
    80    */
       
    81   template <typename T>
       
    82   void Add (std::string name,
       
    83             UVTraceSource<T> &trace, T const &context);
       
    84   /**
       
    85    * \param name name of trace source
       
    86    * \param trace a floating-point variable trace source
       
    87    * \param context the context associated to this trace source
       
    88    *
       
    89    * Add a floating-point variable trace source in this resolver. 
       
    90    * This trace source will match the name specified during namespace 
       
    91    * resolution. The TraceContext of this trace source will also
       
    92    * be automatically extended to contain the input context.
       
    93    */
       
    94   template <typename T>
       
    95   void Add (std::string name,
       
    96             FVTraceSource<T> &trace, T const &context);
       
    97 
       
    98   /**
       
    99    * \param name name of child trace resolver
       
   100    * \param createResolver a trace resolver constructor
       
   101    * \param context the context associated to this entry
       
   102    *
       
   103    * Add a child trace resolver to this resolver. This child
       
   104    * trace resolver will match the name specified during
       
   105    * namespace resolution. When this happens, the constructor
       
   106    * will be invoked to create the child trace resolver and
       
   107    * the associated TraceContext will be automatically extended
       
   108    * to contain the input context.
       
   109    */
       
   110   template <typename T>
       
   111   void Add (std::string name, 
       
   112             Callback<TraceResolver *,TraceContext const &> createResolver,
       
   113             T const &context);
       
   114 private:
       
   115   template <typename SOURCE, typename CONTEXT>
       
   116   void DoAddTraceSource (std::string name,
       
   117                          SOURCE &traceSource, CONTEXT const &context);
       
   118   template <typename SOURCE>
       
   119   static TraceResolver *CreateTerminalTraceResolver (SOURCE *trace, 
       
   120                                                      TraceContext const &context);
       
   121   void DoAdd (std::string name, 
       
   122               Callback<TraceResolver *,TraceContext const &> createResolver,
       
   123               TraceContext const &context);
       
   124   virtual TraceResolverList DoLookup (std::string id) const;
       
   125 
       
   126   struct CallbackTraceSourceItem
       
   127   {
       
   128     std::string name;
       
   129     Callback<TraceResolver *,TraceContext const &> createResolver;
       
   130     TraceContext context;
       
   131   };
       
   132 
       
   133   typedef std::list<struct CallbackTraceSourceItem> TraceItems;
       
   134   TraceItems m_items;
       
   135 };
       
   136 
       
   137 }//namespace ns3
       
   138 
       
   139 namespace ns3 {
       
   140 
       
   141 template <typename SOURCE, typename CONTEXT>
       
   142 void 
       
   143 CompositeTraceResolver::DoAddTraceSource (std::string name,
       
   144                                           SOURCE &traceSource, CONTEXT const &context)
       
   145 {
       
   146   TraceContext traceContext = GetContext ();
       
   147   traceContext.Add (context);
       
   148   TraceResolver *(*create) (SOURCE *trace, TraceContext const &context);
       
   149   create = &CompositeTraceResolver::CreateTerminalTraceResolver<SOURCE>;
       
   150   Callback<TraceResolver *,TraceContext const &> createResolver = 
       
   151     MakeBoundCallback (create, &traceSource);
       
   152   DoAdd (name, createResolver, traceContext);
       
   153 }
       
   154 
       
   155 template <typename SOURCE>
       
   156 TraceResolver *
       
   157 CompositeTraceResolver::CreateTerminalTraceResolver (SOURCE *traceSource, 
       
   158                                                      TraceContext const &context)
       
   159 {
       
   160   return new TerminalTraceResolver<SOURCE> (*traceSource, context);
       
   161 }
       
   162 
       
   163 
       
   164 
       
   165 
       
   166 template <typename T1, typename T2,
       
   167           typename T3, typename T4,
       
   168           typename T>
       
   169 void 
       
   170 CompositeTraceResolver::Add (std::string name,
       
   171                              CallbackTraceSource<T1,T2,T3,T4> &trace, 
       
   172                              T const &context)
       
   173 {
       
   174   DoAddTraceSource (name, trace, context);
       
   175 }
       
   176 template <typename T>
       
   177 void 
       
   178 CompositeTraceResolver::Add (std::string name,
       
   179                              SVTraceSource<T> &trace, T const &context)
       
   180 {
       
   181   DoAddTraceSource (name, trace, context);
       
   182 }
       
   183 template <typename T>
       
   184 void 
       
   185 CompositeTraceResolver::Add (std::string name,
       
   186                              UVTraceSource<T> &trace, T const &context)
       
   187 {
       
   188   DoAddTraceSource (name, trace, context);
       
   189 }
       
   190 template <typename T>
       
   191 void 
       
   192 CompositeTraceResolver::Add (std::string name,
       
   193                              FVTraceSource<T> &trace, T const &context)
       
   194 {
       
   195   DoAddTraceSource (name, trace, context);
       
   196 }
       
   197 template <typename T>
       
   198 void 
       
   199 CompositeTraceResolver::Add (std::string name, 
       
   200                              Callback<TraceResolver *,TraceContext const &> createResolver,
       
   201                              T const &context)
       
   202 {
       
   203   TraceContext traceContext = GetContext ();
       
   204   traceContext.Add (context);
       
   205   DoAdd (name, createResolver, traceContext);
       
   206 }
       
   207 
       
   208 
       
   209 }//namespace ns3
       
   210 
       
   211 #endif /* COMPOSITE_TRACE_RESOLVER_H */