add an IntegerTraceSource which behaves just like an Integer.
--- a/src/core/attribute-test.cc Thu Feb 21 21:57:38 2008 +0100
+++ b/src/core/attribute-test.cc Thu Feb 21 23:15:00 2008 +0100
@@ -8,6 +8,7 @@
#include "random-variable.h"
#include "double.h"
#include "object-vector.h"
+#include "integer-trace-source.h"
namespace ns3 {
@@ -94,6 +95,15 @@
MakeObjectVectorAccessor (&AttributeObjectTest::DoGetVectorN,
&AttributeObjectTest::DoGetVector),
MakeObjectVectorChecker ())
+ .AddAttribute ("IntegerTraceSource1", "help text",
+ Integer (-2),
+ MakeIntegerTraceSourceAccessor (&AttributeObjectTest::m_intSrc1),
+ MakeIntegerChecker<int8_t> ())
+ .AddAttribute ("IntegerTraceSource2", "help text",
+ Integer (-2),
+ MakeIntegerTraceSourceAccessor (&AttributeObjectTest::DoSetIntSrc,
+ &AttributeObjectTest::DoGetIntSrc),
+ MakeIntegerChecker<int8_t> ())
;
return tid;
@@ -125,6 +135,12 @@
Ptr<Derived> DoGetVector (uint32_t i) const {
return m_vector2[i];
}
+ void DoSetIntSrc (int8_t v) {
+ m_intSrc2 = v;
+ }
+ int8_t DoGetIntSrc (void) const {
+ return m_intSrc2;
+ }
bool m_boolTestA;
bool m_boolTest;
Ptr<Derived> m_derived;
@@ -137,6 +153,8 @@
RandomVariable m_random;
std::vector<Ptr<Derived> > m_vector1;
std::vector<Ptr<Derived> > m_vector2;
+ IntegerTraceSource<int8_t> m_intSrc1;
+ IntegerTraceSource<int8_t> m_intSrc2;
};
@@ -347,6 +365,26 @@
boolV = p->GetAttribute ("TestBoolName");
NS_TEST_ASSERT_EQUAL (boolV, Boolean (false));
+ Integer i = p->GetAttribute ("IntegerTraceSource1");
+ NS_TEST_ASSERT_EQUAL (i.Get (), -2);
+ NS_TEST_ASSERT (p->SetAttribute ("IntegerTraceSource1", Integer (+5)));
+ i = p->GetAttribute ("IntegerTraceSource1");
+ NS_TEST_ASSERT_EQUAL (i.Get (), +5);
+ NS_TEST_ASSERT (p->SetAttribute ("IntegerTraceSource1", Integer (127)));
+ NS_TEST_ASSERT (!p->SetAttribute ("IntegerTraceSource1", Integer (128)));
+ NS_TEST_ASSERT (p->SetAttribute ("IntegerTraceSource1", Integer (-128)));
+ NS_TEST_ASSERT (!p->SetAttribute ("IntegerTraceSource1", Integer (-129)));
+
+ i = p->GetAttribute ("IntegerTraceSource2");
+ NS_TEST_ASSERT_EQUAL (i.Get (), -2);
+ NS_TEST_ASSERT (p->SetAttribute ("IntegerTraceSource2", Integer (+5)));
+ i = p->GetAttribute ("IntegerTraceSource2");
+ NS_TEST_ASSERT_EQUAL (i.Get (), +5);
+ NS_TEST_ASSERT (p->SetAttribute ("IntegerTraceSource2", Integer (127)));
+ NS_TEST_ASSERT (!p->SetAttribute ("IntegerTraceSource2", Integer (128)));
+ NS_TEST_ASSERT (p->SetAttribute ("IntegerTraceSource2", Integer (-128)));
+ NS_TEST_ASSERT (!p->SetAttribute ("IntegerTraceSource2", Integer (-129)));
+
return result;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/event-trace-source.cc Thu Feb 21 23:15:00 2008 +0100
@@ -0,0 +1,100 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "event-trace-source.h"
+
+#ifdef RUN_SELF_TESTS
+
+#include "test.h"
+
+namespace ns3 {
+
+class EventTraceSourceTest : public Test
+{
+public:
+ EventTraceSourceTest ();
+ virtual ~EventTraceSourceTest ();
+ virtual bool RunTests (void);
+private:
+ void CbOne (uint8_t a, double b);
+ void CbTwo (uint8_t a, double b);
+
+ bool m_one;
+ bool m_two;
+};
+
+EventTraceSourceTest::EventTraceSourceTest ()
+ : Test ("EventTraceSource")
+{}
+EventTraceSourceTest::~EventTraceSourceTest ()
+{}
+void
+EventTraceSourceTest::CbOne (uint8_t a, double b)
+{
+ m_one = true;
+}
+void
+EventTraceSourceTest::CbTwo (uint8_t a, double b)
+{
+ m_two = true;
+}
+bool
+EventTraceSourceTest::RunTests (void)
+{
+ bool result = true;
+
+ EventTraceSource<uint8_t,double> trace;
+ trace.AddCallback (MakeCallback (&EventTraceSourceTest::CbOne, this));
+ trace.AddCallback (MakeCallback (&EventTraceSourceTest::CbTwo, this));
+ m_one = false;
+ m_two = false;
+ trace (1, 2);
+ NS_TEST_ASSERT (m_one);
+ NS_TEST_ASSERT (m_two);
+
+ trace.RemoveCallback (MakeCallback (&EventTraceSourceTest::CbOne, this));
+ m_one = false;
+ m_two = false;
+ trace (1, 2);
+ NS_TEST_ASSERT (!m_one);
+ NS_TEST_ASSERT (m_two);
+ trace.RemoveCallback (MakeCallback (&EventTraceSourceTest::CbTwo, this));
+ m_one = false;
+ m_two = false;
+ trace (1, 2);
+ NS_TEST_ASSERT (!m_one);
+ NS_TEST_ASSERT (!m_two);
+
+ trace.AddCallback (MakeCallback (&EventTraceSourceTest::CbOne, this));
+ trace.AddCallback (MakeCallback (&EventTraceSourceTest::CbTwo, this));
+ m_one = false;
+ m_two = false;
+ trace (1, 2);
+ NS_TEST_ASSERT (m_one);
+ NS_TEST_ASSERT (m_two);
+
+ return result;
+}
+
+static EventTraceSourceTest g_eventTraceTest;
+
+}//namespace ns3
+
+#endif /* RUN_SELF_TESTS */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/event-trace-source.h Thu Feb 21 23:15:00 2008 +0100
@@ -0,0 +1,153 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006,2007 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef EVENT_TRACE_SOURCE_H
+#define EVENT_TRACE_SOURCE_H
+
+#include <list>
+#include "callback.h"
+
+namespace ns3 {
+
+/**
+ * \brief log arbitrary number of parameters to a matching ns3::Callback
+ * \ingroup tracing
+ *
+ * Whenever operator () is invoked on this class, the call and its arguments
+ * are forwarded to the internal matching ns3::Callback.
+ */
+template<typename T1 = empty, typename T2 = empty,
+ typename T3 = empty, typename T4 = empty>
+class EventTraceSource
+{
+public:
+ EventTraceSource ();
+ void AddCallback (const CallbackBase & callback);
+ void RemoveCallback (const CallbackBase & callback);
+ void operator() (void) const;
+ void operator() (T1 a1) const;
+ void operator() (T1 a1, T2 a2) const;
+ void operator() (T1 a1, T2 a2, T3 a3) const;
+ void operator() (T1 a1, T2 a2, T3 a3, T4 a4) const;
+
+private:
+ typedef std::list<Callback<void,T1,T2,T3,T4> > CallbackList;
+ CallbackList m_callbackList;
+};
+
+} // namespace ns3
+
+// implementation below.
+
+namespace ns3 {
+
+
+template<typename T1, typename T2,
+ typename T3, typename T4>
+EventTraceSource<T1,T2,T3,T4>::EventTraceSource ()
+ : m_callbackList ()
+{}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::AddCallback (const CallbackBase & callback)
+{
+ Callback<void,T1,T2,T3,T4> cb;
+ cb.Assign (callback);
+ m_callbackList.push_back (cb);
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::RemoveCallback (const CallbackBase & callback)
+{
+ for (typename CallbackList::iterator i = m_callbackList.begin ();
+ i != m_callbackList.end (); /* empty */)
+ {
+ if ((*i).IsEqual (callback))
+ {
+ i = m_callbackList.erase (i);
+ }
+ else
+ {
+ i++;
+ }
+ }
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::operator() (void) const
+{
+ for (typename CallbackList::const_iterator i = m_callbackList.begin ();
+ i != m_callbackList.end (); i++)
+ {
+ (*i) ();
+ }
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::operator() (T1 a1) const
+{
+ for (typename CallbackList::const_iterator i = m_callbackList.begin ();
+ i != m_callbackList.end (); i++)
+ {
+ (*i) (a1);
+ }
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::operator() (T1 a1, T2 a2) const
+{
+ for (typename CallbackList::const_iterator i = m_callbackList.begin ();
+ i != m_callbackList.end (); i++)
+ {
+ (*i) (a1, a2);
+ }
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::operator() (T1 a1, T2 a2, T3 a3) const
+{
+ for (typename CallbackList::const_iterator i = m_callbackList.begin ();
+ i != m_callbackList.end (); i++)
+ {
+ (*i) (a1, a2, a3);
+ }
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
+EventTraceSource<T1,T2,T3,T4>::operator() (T1 a1, T2 a2, T3 a3, T4 a4) const
+{
+ for (typename CallbackList::const_iterator i = m_callbackList.begin ();
+ i != m_callbackList.end (); i++)
+ {
+ (*i) (a1, a2, a3, a4);
+ }
+}
+
+}//namespace ns3
+
+#endif /* CALLBACK_TRACE_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/integer-trace-source.h Thu Feb 21 23:15:00 2008 +0100
@@ -0,0 +1,237 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2006,2008 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef INTEGER_TRACE_SOURCE_H
+#define INTEGER_TRACE_SOURCE_H
+
+#include <stdint.h>
+#include "event-trace-source.h"
+#include "integer.h"
+
+namespace ns3 {
+
+class IntegerTraceSourceBase
+{
+public:
+ typedef EventTraceSource<int64_t, int64_t> ChangeNotifyCallback;
+
+ IntegerTraceSourceBase () {}
+ IntegerTraceSourceBase (const IntegerTraceSourceBase &o) {}
+ IntegerTraceSourceBase &operator = (const IntegerTraceSourceBase &o) {
+ return *this;
+ }
+
+ void AddCallback (const CallbackBase & callback) {
+ m_callback.AddCallback (callback);
+ }
+ void RemoveCallback (const CallbackBase & callback) {
+ m_callback.RemoveCallback (callback);
+ }
+protected:
+ void Notify (int64_t oldVal, int64_t newVal) {
+ if (oldVal != newVal)
+ {
+ m_callback (oldVal, newVal);
+ }
+ }
+private:
+ ChangeNotifyCallback m_callback;
+};
+
+#if 0
+template <typename T>
+class UIntegerTraceSource;
+#endif
+
+
+template <typename T>
+class IntegerTraceSource : public IntegerTraceSourceBase {
+public:
+ IntegerTraceSource ()
+ : m_var (0)
+ {}
+ IntegerTraceSource (T const &var)
+ : m_var (var)
+ {}
+
+ IntegerTraceSource &operator = (IntegerTraceSource const &o) {
+ Set (o.Get ());
+ return *this;
+ }
+ template <typename TT>
+ IntegerTraceSource &operator = (IntegerTraceSource<TT> const &o) {
+ Set (o.Get ());
+ return *this;
+ }
+#if 0
+ template <typename TT>
+ IntegerTraceSource &operator = (UintegerTraceSource<TT> const &o) {
+ Set (o.Get ());
+ return *this;
+ }
+#endif
+ IntegerTraceSource &operator++ () {
+ Set (Get () + 1);
+ return *this;
+ }
+ IntegerTraceSource &operator-- () {
+ Set (Get () - 1);
+ return *this;
+ }
+ IntegerTraceSource operator++ (int) {
+ IntegerTraceSource old (*this);
+ ++*this;
+ return old;
+ }
+ IntegerTraceSource operator-- (int) {
+ IntegerTraceSource old (*this);
+ --*this;
+ return old;
+ }
+ operator T () const {
+ return Get ();
+ }
+ void Set (T var) {
+ Notify (m_var, var);
+ m_var = var;
+ }
+ T Get (void) const {
+ return m_var;
+ }
+
+ IntegerTraceSource (Integer value)
+ : m_var (value.Get ()) {}
+ operator Integer () const {
+ return Integer (m_var);
+ }
+
+private:
+ T m_var;
+};
+
+template <typename T1>
+Ptr<const AttributeAccessor> MakeIntegerTraceSourceAccessor (T1 a1)
+{
+ return MakeAccessorHelper<IntegerValue> (a1);
+}
+template <typename T1, typename T2>
+Ptr<const AttributeAccessor> MakeIntegerTraceSourceAccessor (T1 a1, T2 a2)
+{
+ return MakeAccessorHelper<IntegerValue> (a1, a2);
+}
+
+
+template <typename T>
+IntegerTraceSource<T> &operator += (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () + rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator -= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () - rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator *= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () * rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator /= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () / rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator <<= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () << rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator >>= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () >> rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator &= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () & rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator |= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () | rhs.Get ());
+ return lhs;
+}
+template <typename T>
+IntegerTraceSource<T> &operator ^= (IntegerTraceSource<T> &lhs, IntegerTraceSource<T> const &rhs) {
+ lhs.Set (lhs.Get () ^ rhs.Get ());
+ return lhs;
+}
+
+
+template <typename T, typename U>
+IntegerTraceSource<T> &operator += (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () + rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator -= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () - rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator *= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () * rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator /= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () / rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator <<= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () << rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator >>= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () >> rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator &= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () & rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator |= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () | rhs);
+ return lhs;
+}
+template <typename T, typename U>
+IntegerTraceSource<T> &operator ^= (IntegerTraceSource<T> &lhs, U const &rhs) {
+ lhs.Set (lhs.Get () ^ rhs);
+ return lhs;
+}
+
+} // namespace ns3
+
+#endif /* INTEGER_TRACE_SOURCE_H */
--- a/src/core/wscript Thu Feb 21 21:57:38 2008 +0100
+++ b/src/core/wscript Thu Feb 21 23:15:00 2008 +0100
@@ -63,6 +63,7 @@
'object-factory.cc',
'object-vector.cc',
'initial-value.cc',
+ 'event-trace-source.cc',
]
if sys.platform == 'win32':
@@ -117,5 +118,6 @@
'object-factory.h',
'attribute-helper.h',
'initial-value.h',
+ 'event-trace-source.h',
]