src/core/trace-context-element.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 27 Aug 2007 14:59:50 +0200
changeset 1364 7866d4dd9e64
parent 1334 e8e07f44359f
child 1385 e971ab85fd0d
permissions -rw-r--r--
add TraceContextElement::GetName method
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
#ifndef TRACE_CONTEXT_ELEMENT_H
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
#define TRACE_CONTEXT_ELEMENT_H
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
#include <string>
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
#include <vector>
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
#define NS_TRACE_CONTEXT_ELEMENT_ENSURE_REGISTERED(x)          \
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
namespace {						       \
1236
cfa5e0b39281 rework the NS_XX_ENSURE_REGISTERED macros and make sure we typecheck the input to TraceContext::Add and TraceContext::Get methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1235
diff changeset
     9
static class thisisaveryverylongclassname ##x		       \
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
  {							       \
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
  public:						       \
1236
cfa5e0b39281 rework the NS_XX_ENSURE_REGISTERED macros and make sure we typecheck the input to TraceContext::Add and TraceContext::Get methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1235
diff changeset
    12
    thisisaveryverylongclassname ##x ()			       \
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
      { uint32_t uid; uid = x::GetUid ();}		       \
1236
cfa5e0b39281 rework the NS_XX_ENSURE_REGISTERED macros and make sure we typecheck the input to TraceContext::Add and TraceContext::Get methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1235
diff changeset
    14
  } g_thisisanotherveryveryverylongname ##x ;		       \
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
}
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
namespace ns3 {
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
1254
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    19
/**
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    20
 * \brief an item stored in a TraceContext
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    21
 *
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    22
 * To store trace context information in a TraceContext instance,
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    23
 * users must subclass this base class and store subclass instances
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    24
 * in a TraceContext with TraceContext::Add.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    25
 *
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    26
 * Each subclass should define and implement:
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    27
 *   - a public default constructor: it is used by the internals
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    28
 *     of the implementation of TraceContext.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    29
 *   - a public destructor: it is also used by the internals of
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    30
 *     the implementation of TraceContext.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    31
 *   - a public static method named GetUid which returns a 16 bit 
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    32
 *     integer. The integer returned from this method should be
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    33
 *     allocated with the protected AllocatedUid method.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    34
 *   - a public Print method: this method is used by the 
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    35
 *     TraceContext::Print method to print the content of each
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    36
 *     of the trace context element stored in the trace context.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    37
 *     This method takes a c++ output stream and argument and is
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    38
 *     expected to write an ascii string describing its content
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    39
 *     in this output stream.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    40
 *
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    41
 * A typical subclass should look like this:
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    42
 * \code
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    43
 * class MyContext : public TraceContextElement
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    44
 * {
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    45
 * public:
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    46
 *   // the _required_ public API
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    47
 *   static uint16_t GetUid (void);
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    48
 *   MyContext ();
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    49
 *   ~MyContext ();
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    50
 *   void Print (std::ostream &os) const;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    51
 *
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    52
 *   // the user-specific API to manipulate the context.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    53
 *   void SetData (uint8_t data);
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    54
 *   uint8_t GetData (void) const;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    55
 * private:
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    56
 *   uint8_t m_myContextData;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    57
 * };
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    58
 *
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    59
 * uint16_t 
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    60
 * MyContext::GetUid (void)
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    61
 * {
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    62
 *   static uint16_t uid = AllocateUid<MyContext> ("MyContext");
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    63
 *   return uid;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    64
 * }
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    65
 * MyContext::MyContext ()
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    66
 * {}
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    67
 * MyContext::~MyContext ()
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    68
 * {}
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    69
 * void 
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    70
 * MyContext::Print (std::ostream &os) const
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    71
 * {
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    72
 *   os << "mycontext=" << (uint32_t) m_myContextData;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    73
 * }
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    74
 * void 
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    75
 * MyContext::SetData (uint8_t data)
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    76
 * {
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    77
 *   m_myContextData = data;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    78
 * }
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    79
 * uint8_t 
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    80
 * MyContext::GetData (void) const
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    81
 * {
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    82
 *   return m_myContextData;
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    83
 * }
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    84
 * \endcode
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    85
 */
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
class TraceContextElement
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
{
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
protected:
1254
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    89
  /**
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    90
   * \param name a string which uniquely identifies the type
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    91
   *        of the subclass which is calling this method.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    92
   * \returns a unique 32 bit integer associated to the
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    93
   *          input string.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    94
   *
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    95
   * Subclasses are expected to call this method from their
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    96
   * public static GetUid method.
75d1b34e5c5c doxygen API documentation for TraceContextElement base class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    97
   */
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
  template <typename T>
1235
dc52ea3507ff TraceContextElement::Register -> TraceContextElement::AllocateUid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1227
diff changeset
    99
  static uint16_t AllocateUid (std::string name);
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
};
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
} // namespace ns3
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
namespace ns3 {
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
/**
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
 * \brief a registry of TraceContextElement subclasses
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
 * \internal
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
 */
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
class ElementRegistry
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
{
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
public:
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
  template <typename T>
1235
dc52ea3507ff TraceContextElement::Register -> TraceContextElement::AllocateUid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1227
diff changeset
   114
  static uint16_t AllocateUid (std::string name);
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
  static uint32_t GetSize (uint16_t uid);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
  static void Print (uint16_t uid, uint8_t *instance, std::ostream &os);
1364
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   118
  static std::string GetName (uint16_t uid);
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
  static void Destroy (uint16_t uid, uint8_t *instance);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
private:
1364
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   121
  typedef std::string (*GetNameCb) (void);
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
  typedef void (*PrintCb) (uint8_t *instance, std::ostream &os);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
  typedef void (*DestroyCb) (uint8_t *instance);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
  struct Info {
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
    uint32_t size;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
    std::string uidString;
1364
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   127
    GetNameCb getName;
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
    PrintCb print;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
    DestroyCb destroy;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
  };
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
  typedef std::vector<struct Info> InfoVector;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
  static InfoVector *GetInfoVector (void);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
  template <typename T>
1364
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   134
  static std::string DoGetName (void);
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   135
  template <typename T>
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
  static void DoPrint (uint8_t *instance, std::ostream &os);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
  template <typename T>
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
  static void DoDestroy (uint8_t *instance);  
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
};
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
template <typename T>
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
void 
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
ElementRegistry::DoPrint (uint8_t *instance, std::ostream &os)
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
{
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
  static T obj;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
  // make sure we are aligned.
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
  memcpy ((void*)&obj, instance, sizeof (T));
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
  obj.Print (os);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
}
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
template <typename T>
1364
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   151
std::string
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   152
ElementRegistry::DoGetName (void)
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   153
{
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   154
  static T obj;
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   155
  return obj.GetName ();
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   156
}
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   157
template <typename T>
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
void 
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
ElementRegistry::DoDestroy (uint8_t *instance)
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
{
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
  static T obj;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
  // make sure we are aligned.
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
  memcpy ((void*)&obj, instance, sizeof (T));
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
  obj.~T ();
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
}
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
template <typename T>
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
uint16_t 
1235
dc52ea3507ff TraceContextElement::Register -> TraceContextElement::AllocateUid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1227
diff changeset
   169
ElementRegistry::AllocateUid (std::string name)
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
{
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
  InfoVector *vec = GetInfoVector ();
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
  uint16_t uid = 1;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
  for (InfoVector::iterator i = vec->begin (); i != vec->end (); i++)
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
    {
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
      if (i->uidString == name)
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
	{
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
	  return uid;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
	}
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
      uid++;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
    }
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
  struct Info info;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
  info.size = sizeof (T);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
  info.uidString = name;
1364
7866d4dd9e64 add TraceContextElement::GetName method
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1334
diff changeset
   184
  info.getName = &ElementRegistry::DoGetName<T>;
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
  info.print = &ElementRegistry::DoPrint<T>;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
  info.destroy = &ElementRegistry::DoDestroy<T>;
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
  vec->push_back (info);
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
  return vec->size ();
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
}
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
template <typename T>
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
uint16_t 
1235
dc52ea3507ff TraceContextElement::Register -> TraceContextElement::AllocateUid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1227
diff changeset
   195
TraceContextElement::AllocateUid (std::string name)
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
{
1235
dc52ea3507ff TraceContextElement::Register -> TraceContextElement::AllocateUid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1227
diff changeset
   197
  return ElementRegistry::AllocateUid<T> (name);
1227
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
}
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
} // namespace ns3
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
268a9fc6f4a2 work in progress towards a working trace context
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
#endif /* TRACE_CONTEXT_ELEMENT_H */