src/simulator/timer-impl.h
changeset 1943 f7f0279465d7
parent 1942 b2c1a41d591f
child 6180 cd0d8ba00e6c
equal deleted inserted replaced
1942:b2c1a41d591f 1943:f7f0279465d7
    20 #ifndef TIMER_IMPL_H
    20 #ifndef TIMER_IMPL_H
    21 #define TIMER_IMPL_H
    21 #define TIMER_IMPL_H
    22 
    22 
    23 #include "simulator.h"
    23 #include "simulator.h"
    24 #include "ns3/type-traits.h"
    24 #include "ns3/type-traits.h"
       
    25 #include "ns3/fatal-error.h"
       
    26 #include "ns3/int-to-type.h"
    25 
    27 
    26 namespace ns3 {
    28 namespace ns3 {
    27 
    29 
    28 class TimerImpl
    30 class TimerImpl
    29 {
    31 {
    45   template <typename T1, typename T2, typename T3, 
    47   template <typename T1, typename T2, typename T3, 
    46             typename T4, typename T5, typename T6>
    48             typename T4, typename T5, typename T6>
    47   void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
    49   void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
    48 
    50 
    49   virtual EventId Schedule (const Time &delay) = 0;
    51   virtual EventId Schedule (const Time &delay) = 0;
       
    52   virtual void Invoke (void) = 0;
    50 };
    53 };
    51 
    54 
    52 
    55 
    53 template <typename T1>
    56 template <typename T1>
    54 struct TimerImplOne : public TimerImpl
    57 struct TimerImplOne : public TimerImpl
    88 {
    91 {
    89   typedef typename TypeTraits<typename TypeTraits<T>::ReferencedType>::NonConstType StoredType;
    92   typedef typename TypeTraits<typename TypeTraits<T>::ReferencedType>::NonConstType StoredType;
    90   typedef const StoredType &ParameterType;
    93   typedef const StoredType &ParameterType;
    91 };
    94 };
    92 
    95 
    93 
       
    94 template <typename FN>
    96 template <typename FN>
    95 TimerImpl *
    97 TimerImpl *
    96 MakeTimerImpl (FN fn)
    98 MakeTimerImpl (FN fn)
    97 {
    99 {
    98   NS_ASSERT (TypeTraits<FN>::IsFunctionPointer);
   100   NS_ASSERT (TypeTraits<FN>::IsFunctionPointer);
   107   {
   109   {
   108     FnTimerImplZero (FN fn) 
   110     FnTimerImplZero (FN fn) 
   109       : m_fn (fn) {}
   111       : m_fn (fn) {}
   110     virtual EventId Schedule (const Time &delay) {
   112     virtual EventId Schedule (const Time &delay) {
   111       return Simulator::Schedule (delay, m_fn);
   113       return Simulator::Schedule (delay, m_fn);
       
   114     }
       
   115     virtual void Invoke (void) {
       
   116       m_fn ();
   112     }
   117     }
   113     FN m_fn;
   118     FN m_fn;
   114   } *function = new FnTimerImplZero (fn);
   119   } *function = new FnTimerImplZero (fn);
   115   return function;
   120   return function;
   116 }
   121 }
   131       m_a1 = a1;
   136       m_a1 = a1;
   132     }
   137     }
   133     virtual EventId Schedule (const Time &delay) {
   138     virtual EventId Schedule (const Time &delay) {
   134       return Simulator::Schedule (delay, m_fn, m_a1);
   139       return Simulator::Schedule (delay, m_fn, m_a1);
   135     }
   140     }
       
   141     virtual void Invoke (void) {
       
   142       m_fn (m_a1);
       
   143     }
   136     FN m_fn;
   144     FN m_fn;
   137     T1Stored m_a1;
   145     T1Stored m_a1;
   138   } *function = new FnTimerImplOne (fn);
   146   } *function = new FnTimerImplOne (fn);
   139   return function;
   147   return function;
   140 }
   148 }
   159       m_a2 = a2;
   167       m_a2 = a2;
   160     }
   168     }
   161     virtual EventId Schedule (const Time &delay) {
   169     virtual EventId Schedule (const Time &delay) {
   162       return Simulator::Schedule (delay, m_fn, m_a1, m_a2);
   170       return Simulator::Schedule (delay, m_fn, m_a1, m_a2);
   163     }
   171     }
       
   172     virtual void Invoke (void) {
       
   173       m_fn (m_a1, m_a2);
       
   174     }
   164     FN m_fn;
   175     FN m_fn;
   165     T1Stored m_a1;
   176     T1Stored m_a1;
   166     T2Stored m_a2;
   177     T2Stored m_a2;
   167   } *function = new FnTimerImplTwo (fn);
   178   } *function = new FnTimerImplTwo (fn);
   168   return function;
   179   return function;
   191       m_a2 = a2;
   202       m_a2 = a2;
   192       m_a3 = a3;
   203       m_a3 = a3;
   193     }
   204     }
   194     virtual EventId Schedule (const Time &delay) {
   205     virtual EventId Schedule (const Time &delay) {
   195       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3);
   206       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3);
       
   207     }
       
   208     virtual void Invoke (void) {
       
   209       m_fn (m_a1, m_a2, m_a3);
   196     }
   210     }
   197     FN m_fn;
   211     FN m_fn;
   198     T1Stored m_a1;
   212     T1Stored m_a1;
   199     T2Stored m_a2;
   213     T2Stored m_a2;
   200     T3Stored m_a3;
   214     T3Stored m_a3;
   229       m_a3 = a3;
   243       m_a3 = a3;
   230       m_a4 = a4;
   244       m_a4 = a4;
   231     }
   245     }
   232     virtual EventId Schedule (const Time &delay) {
   246     virtual EventId Schedule (const Time &delay) {
   233       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4);
   247       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4);
       
   248     }
       
   249     virtual void Invoke (void) {
       
   250       m_fn (m_a1, m_a2, m_a3, m_a4);
   234     }
   251     }
   235     FN m_fn;
   252     FN m_fn;
   236     T1Stored m_a1;
   253     T1Stored m_a1;
   237     T2Stored m_a2;
   254     T2Stored m_a2;
   238     T3Stored m_a3;
   255     T3Stored m_a3;
   272       m_a4 = a4;
   289       m_a4 = a4;
   273       m_a5 = a5;
   290       m_a5 = a5;
   274     }
   291     }
   275     virtual EventId Schedule (const Time &delay) {
   292     virtual EventId Schedule (const Time &delay) {
   276       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5);
   293       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5);
       
   294     }
       
   295     virtual void Invoke (void) {
       
   296       m_fn (m_a1, m_a2, m_a3, m_a4, m_a5);
   277     }
   297     }
   278     FN m_fn;
   298     FN m_fn;
   279     T1Stored m_a1;
   299     T1Stored m_a1;
   280     T2Stored m_a2;
   300     T2Stored m_a2;
   281     T3Stored m_a3;
   301     T3Stored m_a3;
   321       m_a6 = a6;
   341       m_a6 = a6;
   322     }
   342     }
   323     virtual EventId Schedule (const Time &delay) {
   343     virtual EventId Schedule (const Time &delay) {
   324       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
   344       return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
   325     }
   345     }
       
   346     virtual void Invoke (void) {
       
   347       m_fn (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
       
   348     }
   326     FN m_fn;
   349     FN m_fn;
   327     T1Stored m_a1;
   350     T1Stored m_a1;
   328     T2Stored m_a2;
   351     T2Stored m_a2;
   329     T3Stored m_a3;
   352     T3Stored m_a3;
   330     T4Stored m_a4;
   353     T4Stored m_a4;
   332     T6Stored m_a6;
   355     T6Stored m_a6;
   333   } *function = new FnTimerImplSix (fn);
   356   } *function = new FnTimerImplSix (fn);
   334   return function;
   357   return function;
   335 }
   358 }
   336 
   359 
       
   360 
       
   361 template <typename T>
       
   362 struct TimerImplMemberTraits;
       
   363 
       
   364 
       
   365 template <typename T>
       
   366 struct TimerImplMemberTraits<T *>
       
   367 {
       
   368   static T &GetReference (T *p) {
       
   369     return *p;
       
   370   }
       
   371 };
       
   372 
   337 template <typename MEM_PTR, typename OBJ_PTR>
   373 template <typename MEM_PTR, typename OBJ_PTR>
   338 TimerImpl *
   374 TimerImpl *
   339 MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr)
   375 MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr)
   340 {
   376 {
   341   NS_ASSERT (TypeTraits<MEM_PTR>::IsPointerToMember);
   377   NS_ASSERT (TypeTraits<MEM_PTR>::IsPointerToMember);
   350   {
   386   {
   351     MemFnTimerImplZero (MEM_PTR memPtr, OBJ_PTR objPtr) 
   387     MemFnTimerImplZero (MEM_PTR memPtr, OBJ_PTR objPtr) 
   352       : m_memPtr (memPtr), m_objPtr (objPtr) {}
   388       : m_memPtr (memPtr), m_objPtr (objPtr) {}
   353     virtual EventId Schedule (const Time &delay) {
   389     virtual EventId Schedule (const Time &delay) {
   354       return Simulator::Schedule (delay, m_memPtr, m_objPtr);
   390       return Simulator::Schedule (delay, m_memPtr, m_objPtr);
       
   391     }
       
   392     virtual void Invoke (void) {
       
   393       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (); 
   355     }
   394     }
   356     MEM_PTR m_memPtr;
   395     MEM_PTR m_memPtr;
   357     OBJ_PTR m_objPtr;
   396     OBJ_PTR m_objPtr;
   358   } *function = new MemFnTimerImplZero (memPtr, objPtr);
   397   } *function = new MemFnTimerImplZero (memPtr, objPtr);
   359   return function;
   398   return function;
   375       m_a1 = a1;
   414       m_a1 = a1;
   376     }
   415     }
   377     virtual EventId Schedule (const Time &delay) {
   416     virtual EventId Schedule (const Time &delay) {
   378       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1);
   417       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1);
   379     }
   418     }
       
   419     virtual void Invoke (void) {
       
   420       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1); 
       
   421     }
   380     MEM_PTR m_memPtr;
   422     MEM_PTR m_memPtr;
   381     OBJ_PTR m_objPtr;
   423     OBJ_PTR m_objPtr;
   382     T1Stored m_a1;
   424     T1Stored m_a1;
   383   } *function = new MemFnTimerImplOne (memPtr, objPtr);
   425   } *function = new MemFnTimerImplOne (memPtr, objPtr);
   384   return function;
   426   return function;
   403       m_a1 = a1;
   445       m_a1 = a1;
   404       m_a2 = a2;
   446       m_a2 = a2;
   405     }
   447     }
   406     virtual EventId Schedule (const Time &delay) {
   448     virtual EventId Schedule (const Time &delay) {
   407       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2);
   449       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2);
       
   450     }
       
   451     virtual void Invoke (void) {
       
   452       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2); 
   408     }
   453     }
   409     MEM_PTR m_memPtr;
   454     MEM_PTR m_memPtr;
   410     OBJ_PTR m_objPtr;
   455     OBJ_PTR m_objPtr;
   411     T1Stored m_a1;
   456     T1Stored m_a1;
   412     T2Stored m_a2;
   457     T2Stored m_a2;
   437       m_a2 = a2;
   482       m_a2 = a2;
   438       m_a3 = a3;
   483       m_a3 = a3;
   439     }
   484     }
   440     virtual EventId Schedule (const Time &delay) {
   485     virtual EventId Schedule (const Time &delay) {
   441       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3);
   486       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3);
       
   487     }
       
   488     virtual void Invoke (void) {
       
   489       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3); 
   442     }
   490     }
   443     MEM_PTR m_memPtr;
   491     MEM_PTR m_memPtr;
   444     OBJ_PTR m_objPtr;
   492     OBJ_PTR m_objPtr;
   445     T1Stored m_a1;
   493     T1Stored m_a1;
   446     T2Stored m_a2;
   494     T2Stored m_a2;
   476       m_a3 = a3;
   524       m_a3 = a3;
   477       m_a4 = a4;
   525       m_a4 = a4;
   478     }
   526     }
   479     virtual EventId Schedule (const Time &delay) {
   527     virtual EventId Schedule (const Time &delay) {
   480       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4);
   528       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4);
       
   529     }
       
   530     virtual void Invoke (void) {
       
   531       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4); 
   481     }
   532     }
   482     MEM_PTR m_memPtr;
   533     MEM_PTR m_memPtr;
   483     OBJ_PTR m_objPtr;
   534     OBJ_PTR m_objPtr;
   484     T1Stored m_a1;
   535     T1Stored m_a1;
   485     T2Stored m_a2;
   536     T2Stored m_a2;
   520       m_a4 = a4;
   571       m_a4 = a4;
   521       m_a5 = a5;
   572       m_a5 = a5;
   522     }
   573     }
   523     virtual EventId Schedule (const Time &delay) {
   574     virtual EventId Schedule (const Time &delay) {
   524       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5);
   575       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5);
       
   576     }
       
   577     virtual void Invoke (void) {
       
   578       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4, m_a5); 
   525     }
   579     }
   526     MEM_PTR m_memPtr;
   580     MEM_PTR m_memPtr;
   527     OBJ_PTR m_objPtr;
   581     OBJ_PTR m_objPtr;
   528     T1Stored m_a1;
   582     T1Stored m_a1;
   529     T2Stored m_a2;
   583     T2Stored m_a2;
   570       m_a6 = a6;
   624       m_a6 = a6;
   571     }
   625     }
   572     virtual EventId Schedule (const Time &delay) {
   626     virtual EventId Schedule (const Time &delay) {
   573       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
   627       return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
   574     }
   628     }
       
   629     virtual void Invoke (void) {
       
   630       (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6); 
       
   631     }
   575     MEM_PTR m_memPtr;
   632     MEM_PTR m_memPtr;
   576     OBJ_PTR m_objPtr;
   633     OBJ_PTR m_objPtr;
   577     T1Stored m_a1;
   634     T1Stored m_a1;
   578     T2Stored m_a2;
   635     T2Stored m_a2;
   579     T3Stored m_a3;
   636     T3Stored m_a3;