implement TimerImpl::Invoke
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 10 Oct 2007 14:28:37 +0200
changeset 1943 f7f0279465d7
parent 1942 b2c1a41d591f
child 1944 7044c1ad1d79
implement TimerImpl::Invoke
src/simulator/timer-impl.h
--- a/src/simulator/timer-impl.h	Wed Oct 10 13:30:35 2007 +0200
+++ b/src/simulator/timer-impl.h	Wed Oct 10 14:28:37 2007 +0200
@@ -22,6 +22,8 @@
 
 #include "simulator.h"
 #include "ns3/type-traits.h"
+#include "ns3/fatal-error.h"
+#include "ns3/int-to-type.h"
 
 namespace ns3 {
 
@@ -47,6 +49,7 @@
   void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
 
   virtual EventId Schedule (const Time &delay) = 0;
+  virtual void Invoke (void) = 0;
 };
 
 
@@ -90,7 +93,6 @@
   typedef const StoredType &ParameterType;
 };
 
-
 template <typename FN>
 TimerImpl *
 MakeTimerImpl (FN fn)
@@ -110,6 +112,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn);
     }
+    virtual void Invoke (void) {
+      m_fn ();
+    }
     FN m_fn;
   } *function = new FnTimerImplZero (fn);
   return function;
@@ -133,6 +138,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn, m_a1);
     }
+    virtual void Invoke (void) {
+      m_fn (m_a1);
+    }
     FN m_fn;
     T1Stored m_a1;
   } *function = new FnTimerImplOne (fn);
@@ -161,6 +169,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn, m_a1, m_a2);
     }
+    virtual void Invoke (void) {
+      m_fn (m_a1, m_a2);
+    }
     FN m_fn;
     T1Stored m_a1;
     T2Stored m_a2;
@@ -194,6 +205,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3);
     }
+    virtual void Invoke (void) {
+      m_fn (m_a1, m_a2, m_a3);
+    }
     FN m_fn;
     T1Stored m_a1;
     T2Stored m_a2;
@@ -232,6 +246,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4);
     }
+    virtual void Invoke (void) {
+      m_fn (m_a1, m_a2, m_a3, m_a4);
+    }
     FN m_fn;
     T1Stored m_a1;
     T2Stored m_a2;
@@ -275,6 +292,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5);
     }
+    virtual void Invoke (void) {
+      m_fn (m_a1, m_a2, m_a3, m_a4, m_a5);
+    }
     FN m_fn;
     T1Stored m_a1;
     T2Stored m_a2;
@@ -323,6 +343,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
     }
+    virtual void Invoke (void) {
+      m_fn (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
+    }
     FN m_fn;
     T1Stored m_a1;
     T2Stored m_a2;
@@ -334,6 +357,19 @@
   return function;
 }
 
+
+template <typename T>
+struct TimerImplMemberTraits;
+
+
+template <typename T>
+struct TimerImplMemberTraits<T *>
+{
+  static T &GetReference (T *p) {
+    return *p;
+  }
+};
+
 template <typename MEM_PTR, typename OBJ_PTR>
 TimerImpl *
 MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr)
@@ -353,6 +389,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
   } *function = new MemFnTimerImplZero (memPtr, objPtr);
@@ -377,6 +416,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
     T1Stored m_a1;
@@ -406,6 +448,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
     T1Stored m_a1;
@@ -440,6 +485,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
     T1Stored m_a1;
@@ -479,6 +527,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
     T1Stored m_a1;
@@ -523,6 +574,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4, m_a5); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
     T1Stored m_a1;
@@ -572,6 +626,9 @@
     virtual EventId Schedule (const Time &delay) {
       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
     }
+    virtual void Invoke (void) {
+      (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6); 
+    }
     MEM_PTR m_memPtr;
     OBJ_PTR m_objPtr;
     T1Stored m_a1;