add an IntegerTraceSource which behaves just like an Integer.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 21 Feb 2008 23:15:00 +0100
changeset 2462 93028d4474ba
parent 2461 a48106d6f3b4
child 2463 c77e43117673
add an IntegerTraceSource which behaves just like an Integer.
src/core/attribute-test.cc
src/core/event-trace-source.cc
src/core/event-trace-source.h
src/core/integer-trace-source.h
src/core/wscript
--- 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',
         ]