diff -r 447453a55597 src/core/callback-trace-source.h --- a/src/core/callback-trace-source.h Fri Jan 11 12:58:21 2008 +0000 +++ b/src/core/callback-trace-source.h Fri Jan 11 19:09:18 2008 +0000 @@ -23,12 +23,19 @@ #define CALLBACK_TRACE_H #include +#include #include "callback.h" #include "fatal-error.h" #include "trace-context.h" #include "trace-source.h" namespace ns3 { + +class CallbackTraceSourceBase : public TraceSource +{ +public: + virtual const std::type_info& GetCallbackType () const = 0; +}; /** * \brief log arbitrary number of parameters to a matching ns3::Callback @@ -39,12 +46,18 @@ namespace ns3 { */ template -class CallbackTraceSource : public TraceSource { +class CallbackTraceSource : public CallbackTraceSourceBase { public: + + typedef Callback CallbackType; + CallbackTraceSource (); virtual void AddCallback (CallbackBase const & callback, TraceContext const & context); virtual void RemoveCallback (CallbackBase const & callback); virtual void ConnectPrinter (std::ostream &os, const TraceContext &context); + virtual const std::type_info& GetCallbackType () const { + return typeid (CallbackType); + } void operator() (void) const; void operator() (T1 a1) const; void operator() (T1 a1, T2 a2) const; @@ -52,7 +65,7 @@ public: void operator() (T1 a1, T2 a2, T3 a3, T4 a4) const; private: - typedef std::list > CallbackList; + typedef std::list CallbackList; TraceContext m_context; CallbackList m_callbackList; }; diff -r 447453a55597 src/core/composite-trace-resolver.cc --- a/src/core/composite-trace-resolver.cc Fri Jan 11 12:58:21 2008 +0000 +++ b/src/core/composite-trace-resolver.cc Fri Jan 11 19:09:18 2008 +0000 @@ -105,7 +105,7 @@ CompositeTraceResolver::DoAddSource (std path.append (this->name); TraceContext ctx = context; ctx.Union (this->context); - collection->AddUnique (path, ctx, this->doc); + collection->AddUnique (path, ctx, this->doc, GetCallbackType ()); } virtual void TraceAll (std::ostream &os, const TraceContext &context) { @@ -115,6 +115,20 @@ CompositeTraceResolver::DoAddSource (std } TraceSource *trace; TraceDoc doc; + + const std::type_info* GetCallbackType () + { + const CallbackTraceSourceBase *callbackSource = + dynamic_cast (trace); + if (callbackSource == NULL) + { + return NULL; + } + else + { + return &callbackSource->GetCallbackType (); + } + } } *item = new SourceResolveItem (); item->name = name; item->context = context; @@ -438,7 +452,7 @@ bool bool CompositeTraceResolverTest::RunTests (void) { - bool ok = true; + bool result = true; CallbackTraceSource traceDoubleA; CallbackTraceSource traceDoubleB; @@ -453,19 +467,37 @@ CompositeTraceResolverTest::RunTests (vo resolver.Connect ("/*", MakeCallback (&CompositeTraceResolverTest::TraceDouble, this), TraceContext ()); + { + TraceResolver::SourceCollection collection; + resolver.CollectSources ("/*", context, &collection); + + int numSources = 0; + for (TraceResolver::SourceCollection::Iterator source = collection.Begin (); + source != collection.End (); source++) + { + NS_TEST_ASSERT (source->callbackType != NULL); + if (source->callbackType != NULL) + { + numSources++; + NS_TEST_ASSERT (*source->callbackType == typeid (Callback)); + } + } + NS_TEST_ASSERT (numSources > 0); + } + m_gotDoubleA = false; m_gotDoubleB = false; traceDoubleA (0); if (!m_gotDoubleA || m_gotDoubleB) { - ok = false; + result = false; } m_gotDoubleA = false; traceDoubleA (0); traceDoubleB (0); if (!m_gotDoubleA || !m_gotDoubleB) { - ok = false; + result = false; } m_gotDoubleA = false; m_gotDoubleB = false; @@ -478,7 +510,7 @@ CompositeTraceResolverTest::RunTests (vo traceDoubleB (0); if (m_gotDoubleA || m_gotDoubleB) { - ok = false; + result = false; } resolver.Connect ("/trace-double-a", @@ -489,7 +521,7 @@ CompositeTraceResolverTest::RunTests (vo traceDoubleB (0); if (!m_gotDoubleA || m_gotDoubleB) { - ok = false; + result = false; } resolver.Disconnect ("/trace-double-a", MakeCallback (&CompositeTraceResolverTest::TraceDouble, this)); @@ -502,7 +534,7 @@ CompositeTraceResolverTest::RunTests (vo traceDoubleB (0); if (!m_gotDoubleA || m_gotDoubleB) { - ok = false; + result = false; } resolver.Disconnect ("/trace-double-a", MakeCallback (&CompositeTraceResolverTest::TraceDouble, this)); @@ -515,7 +547,7 @@ CompositeTraceResolverTest::RunTests (vo traceDoubleB (0); if (!m_gotDoubleA || !m_gotDoubleB) { - ok = false; + result = false; } resolver.Disconnect ("/trace-double-a", MakeCallback (&CompositeTraceResolverTest::TraceDouble, this)); @@ -525,7 +557,7 @@ CompositeTraceResolverTest::RunTests (vo traceDoubleB (0); if (m_gotDoubleA || !m_gotDoubleB) { - ok = false; + result = false; } @@ -537,7 +569,7 @@ CompositeTraceResolverTest::RunTests (vo traceDoubleB (0); if (m_gotDoubleA || m_gotDoubleB) { - ok = false; + result = false; } resolver.Add ("subresolver", @@ -549,7 +581,7 @@ CompositeTraceResolverTest::RunTests (vo m_traceInt (1); if (!m_gotInt) { - ok = false; + result = false; } resolver.Disconnect ("/subresolver/trace-int", @@ -558,7 +590,7 @@ CompositeTraceResolverTest::RunTests (vo m_traceInt (1); if (m_gotInt) { - ok = false; + result = false; } resolver.Connect ("/*/trace-int", @@ -567,7 +599,7 @@ CompositeTraceResolverTest::RunTests (vo m_traceInt (1); if (!m_gotInt) { - ok = false; + result = false; } resolver.Disconnect ("/subresolver/trace-int", @@ -576,7 +608,7 @@ CompositeTraceResolverTest::RunTests (vo m_traceInt (1); if (m_gotInt) { - ok = false; + result = false; } SVTraceSource source; @@ -584,7 +616,7 @@ CompositeTraceResolverTest::RunTests (vo resolver.AddSource ("uint16_t", TraceDoc ("test source"), source, TraceSourceTest (TraceSourceTest::UINT16_T)); - return ok; + return result; } static CompositeTraceResolverTest g_compositeTraceResolverTest; diff -r 447453a55597 src/core/trace-resolver.cc --- a/src/core/trace-resolver.cc Fri Jan 11 12:58:21 2008 +0000 +++ b/src/core/trace-resolver.cc Fri Jan 11 19:09:18 2008 +0000 @@ -78,7 +78,8 @@ void void TraceResolver::SourceCollection::AddUnique (std::string path, const TraceContext &context, - const TraceDoc &doc) + const TraceDoc &doc, + const std::type_info *callbackType) { for (SourceVector::const_iterator i = m_sources.begin (); i != m_sources.end (); i++) { @@ -92,6 +93,7 @@ TraceResolver::SourceCollection::AddUniq source.path = path; source.context = context; source.doc = doc; + source.callbackType = callbackType; m_sources.push_back (source); } TraceResolver::SourceCollection::Iterator diff -r 447453a55597 src/core/trace-resolver.h --- a/src/core/trace-resolver.h Fri Jan 11 12:58:21 2008 +0000 +++ b/src/core/trace-resolver.h Fri Jan 11 19:09:18 2008 +0000 @@ -23,6 +23,7 @@ #include #include +#include #include "trace-context.h" #include "trace-doc.h" @@ -93,11 +94,16 @@ public: * Document the signature of this trace source */ TraceDoc doc; + /** + * Type info of the Callback, or NULL if it's not a callback source + */ + const std::type_info *callbackType; }; typedef std::vector::const_iterator Iterator; void AddUnique (std::string path, const TraceContext &context, - const TraceDoc &doc); + const TraceDoc &doc, + const std::type_info *callbackType); /** * \returns an iterator which points to the first element of the set of