src/simulator/simulator.h
changeset 1008 6f2ea723a1db
parent 963 3a7a66d1942c
child 1010 3a252ceeac44
equal deleted inserted replaced
1007:3838d8b043c0 1008:6f2ea723a1db
   568 private:
   568 private:
   569   Simulator ();
   569   Simulator ();
   570   ~Simulator ();
   570   ~Simulator ();
   571 
   571 
   572   template <typename T, typename OBJ>
   572   template <typename T, typename OBJ>
   573   static EventImpl *MakeEvent (void (T::*mem_ptr) (void), OBJ obj);
   573   static Ptr<EventImpl> MakeEvent (void (T::*mem_ptr) (void), OBJ obj);
   574   template <typename T, typename OBJ, 
   574   template <typename T, typename OBJ, 
   575             typename U1,
   575             typename U1,
   576             typename T1>
   576             typename T1>
   577   static EventImpl *MakeEvent (void (T::*mem_ptr) (U1), OBJ obj, T1 a1);
   577   static Ptr<EventImpl> MakeEvent (void (T::*mem_ptr) (U1), OBJ obj, T1 a1);
   578   template <typename T, typename OBJ, 
   578   template <typename T, typename OBJ, 
   579             typename U1, typename U2,
   579             typename U1, typename U2,
   580             typename T1, typename T2>
   580             typename T1, typename T2>
   581   static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2);
   581   static Ptr<EventImpl> MakeEvent (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2);
   582   template <typename T, typename OBJ, 
   582   template <typename T, typename OBJ, 
   583             typename U1, typename U2, typename U3,
   583             typename U1, typename U2, typename U3,
   584             typename T1, typename T2, typename T3>
   584             typename T1, typename T2, typename T3>
   585   static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3);
   585   static Ptr<EventImpl> MakeEvent (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3);
   586   template <typename T, typename OBJ, 
   586   template <typename T, typename OBJ, 
   587             typename U1, typename U2, typename U3, typename U4,
   587             typename U1, typename U2, typename U3, typename U4,
   588             typename T1, typename T2, typename T3, typename T4>
   588             typename T1, typename T2, typename T3, typename T4>
   589   static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
   589   static Ptr<EventImpl> MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
   590   template <typename T, typename OBJ, 
   590   template <typename T, typename OBJ, 
   591             typename U1, typename U2, typename U3, typename U4, typename U5,
   591             typename U1, typename U2, typename U3, typename U4, typename U5,
   592             typename T1, typename T2, typename T3, typename T4, typename T5>
   592             typename T1, typename T2, typename T3, typename T4, typename T5>
   593   static EventImpl *MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj, 
   593   static Ptr<EventImpl> MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj, 
   594                                T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   594                                T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   595   static EventImpl *MakeEvent (void (*f) (void));
   595   static Ptr<EventImpl> MakeEvent (void (*f) (void));
   596   template <typename U1, 
   596   template <typename U1, 
   597             typename T1>
   597             typename T1>
   598   static EventImpl *MakeEvent (void (*f) (U1), T1 a1);
   598   static Ptr<EventImpl> MakeEvent (void (*f) (U1), T1 a1);
   599   template <typename U1, typename U2, 
   599   template <typename U1, typename U2, 
   600             typename T1, typename T2>
   600             typename T1, typename T2>
   601   static EventImpl *MakeEvent (void (*f) (U1,U2), T1 a1, T2 a2);
   601   static Ptr<EventImpl> MakeEvent (void (*f) (U1,U2), T1 a1, T2 a2);
   602   template <typename U1, typename U2, typename U3,
   602   template <typename U1, typename U2, typename U3,
   603             typename T1, typename T2, typename T3>
   603             typename T1, typename T2, typename T3>
   604   static EventImpl *MakeEvent (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
   604   static Ptr<EventImpl> MakeEvent (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3);
   605   template <typename U1, typename U2, typename U3, typename U4,
   605   template <typename U1, typename U2, typename U3, typename U4,
   606             typename T1, typename T2, typename T3, typename T4>
   606             typename T1, typename T2, typename T3, typename T4>
   607   static EventImpl *MakeEvent (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
   607   static Ptr<EventImpl> MakeEvent (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
   608   template <typename U1, typename U2, typename U3, typename U4, typename U5,
   608   template <typename U1, typename U2, typename U3, typename U4, typename U5,
   609             typename T1, typename T2, typename T3, typename T4, typename T5>
   609             typename T1, typename T2, typename T3, typename T4, typename T5>
   610   static EventImpl *MakeEvent (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   610   static Ptr<EventImpl> MakeEvent (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   611 
   611 
   612   static SimulatorPrivate *GetPriv (void);
   612   static SimulatorPrivate *GetPriv (void);
   613   static EventId Schedule (Time const &time, EventImpl *event);
   613   static EventId Schedule (Time const &time, Ptr<EventImpl> event);
   614   static EventId ScheduleDestroy (EventImpl *event);
   614   static EventId ScheduleDestroy (Ptr<EventImpl> event);
   615   static EventId ScheduleNow (EventImpl *event);
   615   static EventId ScheduleNow (Ptr<EventImpl> event);
   616   static SimulatorPrivate *m_priv;
   616   static SimulatorPrivate *m_priv;
   617 };
   617 };
   618 
   618 
   619 /**
   619 /**
   620  * \brief create an ns3::Time instance which contains the
   620  * \brief create an ns3::Time instance which contains the
   648     return *p;
   648     return *p;
   649   }
   649   }
   650 };
   650 };
   651 
   651 
   652 template <typename T, typename OBJ>
   652 template <typename T, typename OBJ>
   653 EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (void), OBJ obj) 
   653 Ptr<EventImpl> Simulator::MakeEvent (void (T::*mem_ptr) (void), OBJ obj) 
   654 {
   654 {
   655   // zero argument version
   655   // zero argument version
   656   class EventMemberImpl0 : public EventImpl {
   656   class EventMemberImpl0 : public EventImpl {
   657   public:
   657   public:
   658     typedef void (T::*F)(void);
   658     typedef void (T::*F)(void);
   665     virtual void Notify (void) { 
   665     virtual void Notify (void) { 
   666       (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (); 
   666       (EventMemberImplObjTraits<OBJ>::GetReference (m_obj).*m_function) (); 
   667     }
   667     }
   668     OBJ m_obj;
   668     OBJ m_obj;
   669     F m_function;
   669     F m_function;
   670   } *ev = new EventMemberImpl0 (obj, mem_ptr);
   670   } * ev = new EventMemberImpl0 (obj, mem_ptr);
   671   return ev;
   671   return Ptr<EventImpl> (ev, false);
   672 }
   672 }
   673 
   673 
   674 
   674 
   675 template <typename T, typename OBJ, 
   675 template <typename T, typename OBJ, 
   676           typename U1,
   676           typename U1,
   677           typename T1>
   677           typename T1>
   678 EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1), OBJ obj, T1 a1)
   678 Ptr<EventImpl> Simulator::MakeEvent (void (T::*mem_ptr) (U1), OBJ obj, T1 a1)
   679 {
   679 {
   680   // one argument version
   680   // one argument version
   681   class EventMemberImpl1 : public EventImpl {
   681   class EventMemberImpl1 : public EventImpl {
   682   public:
   682   public:
   683     typedef void (T::*F)(U1);
   683     typedef void (T::*F)(U1);
   694     }
   694     }
   695     OBJ m_obj;
   695     OBJ m_obj;
   696     F m_function;
   696     F m_function;
   697     typename TypeTraits<T1>::ReferencedType m_a1;
   697     typename TypeTraits<T1>::ReferencedType m_a1;
   698   } *ev = new EventMemberImpl1 (obj, mem_ptr, a1);
   698   } *ev = new EventMemberImpl1 (obj, mem_ptr, a1);
   699   return ev;
   699   return Ptr<EventImpl> (ev, false);
   700 }
   700 }
   701 
   701 
   702 template <typename T, typename OBJ, 
   702 template <typename T, typename OBJ, 
   703           typename U1, typename U2,
   703           typename U1, typename U2,
   704           typename T1, typename T2>
   704           typename T1, typename T2>
   705 EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2) 
   705 Ptr<EventImpl> Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2), OBJ obj, T1 a1, T2 a2) 
   706 {
   706 {
   707   // two argument version
   707   // two argument version
   708   class EventMemberImpl2 : public EventImpl {
   708   class EventMemberImpl2 : public EventImpl {
   709   public:
   709   public:
   710     typedef void (T::*F)(U1, U2);
   710     typedef void (T::*F)(U1, U2);
   724     OBJ m_obj;
   724     OBJ m_obj;
   725     F m_function;
   725     F m_function;
   726     typename TypeTraits<T1>::ReferencedType m_a1;
   726     typename TypeTraits<T1>::ReferencedType m_a1;
   727     typename TypeTraits<T2>::ReferencedType m_a2;
   727     typename TypeTraits<T2>::ReferencedType m_a2;
   728   } *ev = new EventMemberImpl2 (obj, mem_ptr, a1, a2);
   728   } *ev = new EventMemberImpl2 (obj, mem_ptr, a1, a2);
   729   return ev;
   729   return Ptr<EventImpl> (ev, false);
   730 }
   730 }
   731 
   731 
   732 template <typename T, typename OBJ, 
   732 template <typename T, typename OBJ, 
   733           typename U1, typename U2, typename U3,
   733           typename U1, typename U2, typename U3,
   734           typename T1, typename T2, typename T3>
   734           typename T1, typename T2, typename T3>
   735 EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3) 
   735 Ptr<EventImpl> Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3), OBJ obj, T1 a1, T2 a2, T3 a3) 
   736 {
   736 {
   737   // three argument version
   737   // three argument version
   738   class EventMemberImpl3 : public EventImpl {
   738   class EventMemberImpl3 : public EventImpl {
   739   public:
   739   public:
   740     typedef void (T::*F)(U1,U2,U3);
   740     typedef void (T::*F)(U1,U2,U3);
   756     F m_function;
   756     F m_function;
   757     typename TypeTraits<T1>::ReferencedType m_a1;
   757     typename TypeTraits<T1>::ReferencedType m_a1;
   758     typename TypeTraits<T2>::ReferencedType m_a2;
   758     typename TypeTraits<T2>::ReferencedType m_a2;
   759     typename TypeTraits<T3>::ReferencedType m_a3;
   759     typename TypeTraits<T3>::ReferencedType m_a3;
   760   } *ev = new EventMemberImpl3 (obj, mem_ptr, a1, a2, a3);
   760   } *ev = new EventMemberImpl3 (obj, mem_ptr, a1, a2, a3);
   761   return ev;
   761   return Ptr<EventImpl> (ev, false);
   762 }
   762 }
   763 
   763 
   764 template <typename T, typename OBJ, 
   764 template <typename T, typename OBJ, 
   765           typename U1, typename U2, typename U3, typename U4,
   765           typename U1, typename U2, typename U3, typename U4,
   766           typename T1, typename T2, typename T3, typename T4>
   766           typename T1, typename T2, typename T3, typename T4>
   767 EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4) 
   767 Ptr<EventImpl> Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4), OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4) 
   768 {
   768 {
   769   // four argument version
   769   // four argument version
   770   class EventMemberImpl4 : public EventImpl {
   770   class EventMemberImpl4 : public EventImpl {
   771   public:
   771   public:
   772     typedef void (T::*F)(U1, U2, U3, U4);
   772     typedef void (T::*F)(U1, U2, U3, U4);
   790     typename TypeTraits<T1>::ReferencedType m_a1;
   790     typename TypeTraits<T1>::ReferencedType m_a1;
   791     typename TypeTraits<T2>::ReferencedType m_a2;
   791     typename TypeTraits<T2>::ReferencedType m_a2;
   792     typename TypeTraits<T3>::ReferencedType m_a3;
   792     typename TypeTraits<T3>::ReferencedType m_a3;
   793     typename TypeTraits<T4>::ReferencedType m_a4;
   793     typename TypeTraits<T4>::ReferencedType m_a4;
   794   } *ev = new EventMemberImpl4 (obj, mem_ptr, a1, a2, a3, a4);
   794   } *ev = new EventMemberImpl4 (obj, mem_ptr, a1, a2, a3, a4);
   795   return ev;
   795   return Ptr<EventImpl> (ev, false);
   796 }
   796 }
   797 
   797 
   798 template <typename T, typename OBJ, 
   798 template <typename T, typename OBJ, 
   799           typename U1, typename U2, typename U3, typename U4, typename U5,
   799           typename U1, typename U2, typename U3, typename U4, typename U5,
   800           typename T1, typename T2, typename T3, typename T4, typename T5>
   800           typename T1, typename T2, typename T3, typename T4, typename T5>
   801 EventImpl *Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj, 
   801 Ptr<EventImpl> Simulator::MakeEvent (void (T::*mem_ptr) (U1,U2,U3,U4,U5), OBJ obj, 
   802                                  T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) 
   802                                  T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) 
   803 {
   803 {
   804   // five argument version
   804   // five argument version
   805   class EventMemberImpl5 : public EventImpl {
   805   class EventMemberImpl5 : public EventImpl {
   806   public:
   806   public:
   827     typename TypeTraits<T2>::ReferencedType m_a2;
   827     typename TypeTraits<T2>::ReferencedType m_a2;
   828     typename TypeTraits<T3>::ReferencedType m_a3;
   828     typename TypeTraits<T3>::ReferencedType m_a3;
   829     typename TypeTraits<T4>::ReferencedType m_a4;
   829     typename TypeTraits<T4>::ReferencedType m_a4;
   830     typename TypeTraits<T5>::ReferencedType m_a5;
   830     typename TypeTraits<T5>::ReferencedType m_a5;
   831   } *ev = new EventMemberImpl5 (obj, mem_ptr, a1, a2, a3, a4, a5);
   831   } *ev = new EventMemberImpl5 (obj, mem_ptr, a1, a2, a3, a4, a5);
   832   return ev;
   832   return Ptr<EventImpl> (ev, false);
   833 }
   833 }
   834 
   834 
   835 template <typename U1, typename T1>
   835 template <typename U1, typename T1>
   836 EventImpl *Simulator::MakeEvent (void (*f) (U1), T1 a1) 
   836 Ptr<EventImpl> Simulator::MakeEvent (void (*f) (U1), T1 a1) 
   837 {
   837 {
   838   // one arg version
   838   // one arg version
   839   class EventFunctionImpl1 : public EventImpl {
   839   class EventFunctionImpl1 : public EventImpl {
   840   public:
   840   public:
   841     typedef void (*F)(U1);
   841     typedef void (*F)(U1);
   850     virtual void Notify (void) { 
   850     virtual void Notify (void) { 
   851       (*m_function) (m_a1);
   851       (*m_function) (m_a1);
   852     }
   852     }
   853     F m_function;
   853     F m_function;
   854     typename TypeTraits<T1>::ReferencedType m_a1;
   854     typename TypeTraits<T1>::ReferencedType m_a1;
   855   } *ev = new EventFunctionImpl1(f, a1);
   855   } *ev = new EventFunctionImpl1 (f, a1);
   856   return ev;
   856   return Ptr<EventImpl> (ev, false);
   857 }
   857 }
   858 
   858 
   859 template <typename U1, typename U2, typename T1, typename T2>
   859 template <typename U1, typename U2, typename T1, typename T2>
   860 EventImpl *Simulator::MakeEvent (void (*f) (U1,U2), T1 a1, T2 a2) 
   860 Ptr<EventImpl> Simulator::MakeEvent (void (*f) (U1,U2), T1 a1, T2 a2) 
   861 {
   861 {
   862   // two arg version
   862   // two arg version
   863   class EventFunctionImpl2 : public EventImpl {
   863   class EventFunctionImpl2 : public EventImpl {
   864   public:
   864   public:
   865     typedef void (*F)(U1, U2);
   865     typedef void (*F)(U1, U2);
   877     }
   877     }
   878     F m_function;
   878     F m_function;
   879     typename TypeTraits<T1>::ReferencedType m_a1;
   879     typename TypeTraits<T1>::ReferencedType m_a1;
   880     typename TypeTraits<T2>::ReferencedType m_a2;
   880     typename TypeTraits<T2>::ReferencedType m_a2;
   881   } *ev = new EventFunctionImpl2 (f, a1, a2);
   881   } *ev = new EventFunctionImpl2 (f, a1, a2);
   882   return ev;
   882   return Ptr<EventImpl> (ev, false);
   883 }
   883 }
   884 
   884 
   885 template <typename U1, typename U2, typename U3,
   885 template <typename U1, typename U2, typename U3,
   886           typename T1, typename T2, typename T3>
   886           typename T1, typename T2, typename T3>
   887 EventImpl *Simulator::MakeEvent (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
   887 Ptr<EventImpl> Simulator::MakeEvent (void (*f) (U1,U2,U3), T1 a1, T2 a2, T3 a3)
   888 {
   888 {
   889   // three arg version
   889   // three arg version
   890   class EventFunctionImpl3 : public EventImpl {
   890   class EventFunctionImpl3 : public EventImpl {
   891   public:
   891   public:
   892     typedef void (*F)(U1, U2, U3);
   892     typedef void (*F)(U1, U2, U3);
   906     F m_function;
   906     F m_function;
   907     typename TypeTraits<T1>::ReferencedType m_a1;
   907     typename TypeTraits<T1>::ReferencedType m_a1;
   908     typename TypeTraits<T2>::ReferencedType m_a2;
   908     typename TypeTraits<T2>::ReferencedType m_a2;
   909     typename TypeTraits<T3>::ReferencedType m_a3;
   909     typename TypeTraits<T3>::ReferencedType m_a3;
   910   } *ev = new EventFunctionImpl3 (f, a1, a2, a3);
   910   } *ev = new EventFunctionImpl3 (f, a1, a2, a3);
   911   return ev;
   911   return Ptr<EventImpl> (ev, false);
   912 }
   912 }
   913 
   913 
   914 template <typename U1, typename U2, typename U3, typename U4,
   914 template <typename U1, typename U2, typename U3, typename U4,
   915           typename T1, typename T2, typename T3, typename T4>
   915           typename T1, typename T2, typename T3, typename T4>
   916 EventImpl *Simulator::MakeEvent (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4) 
   916 Ptr<EventImpl> Simulator::MakeEvent (void (*f) (U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4) 
   917 {
   917 {
   918   // four arg version
   918   // four arg version
   919   class EventFunctionImpl4 : public EventImpl {
   919   class EventFunctionImpl4 : public EventImpl {
   920   public:
   920   public:
   921     typedef void (*F)(U1, U2, U3, U4);
   921     typedef void (*F)(U1, U2, U3, U4);
   937     typename TypeTraits<T1>::ReferencedType m_a1;
   937     typename TypeTraits<T1>::ReferencedType m_a1;
   938     typename TypeTraits<T2>::ReferencedType m_a2;
   938     typename TypeTraits<T2>::ReferencedType m_a2;
   939     typename TypeTraits<T3>::ReferencedType m_a3;
   939     typename TypeTraits<T3>::ReferencedType m_a3;
   940     typename TypeTraits<T4>::ReferencedType m_a4;
   940     typename TypeTraits<T4>::ReferencedType m_a4;
   941   } *ev = new EventFunctionImpl4 (f, a1, a2, a3, a4);
   941   } *ev = new EventFunctionImpl4 (f, a1, a2, a3, a4);
   942   return ev;
   942   return Ptr<EventImpl> (ev, false);
   943 }
   943 }
   944 
   944 
   945 template <typename U1, typename U2, typename U3, typename U4, typename U5,
   945 template <typename U1, typename U2, typename U3, typename U4, typename U5,
   946           typename T1, typename T2, typename T3, typename T4, typename T5>
   946           typename T1, typename T2, typename T3, typename T4, typename T5>
   947 EventImpl *Simulator::MakeEvent (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) 
   947 Ptr<EventImpl> Simulator::MakeEvent (void (*f) (U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) 
   948 {
   948 {
   949   // five arg version
   949   // five arg version
   950   class EventFunctionImpl5 : public EventImpl {
   950   class EventFunctionImpl5 : public EventImpl {
   951   public:
   951   public:
   952     typedef void (*F)(U1,U2,U3,U4,U5);
   952     typedef void (*F)(U1,U2,U3,U4,U5);
   970     typename TypeTraits<T2>::ReferencedType m_a2;
   970     typename TypeTraits<T2>::ReferencedType m_a2;
   971     typename TypeTraits<T3>::ReferencedType m_a3;
   971     typename TypeTraits<T3>::ReferencedType m_a3;
   972     typename TypeTraits<T4>::ReferencedType m_a4;
   972     typename TypeTraits<T4>::ReferencedType m_a4;
   973     typename TypeTraits<T5>::ReferencedType m_a5;
   973     typename TypeTraits<T5>::ReferencedType m_a5;
   974   } *ev = new EventFunctionImpl5 (f, a1, a2, a3, a4, a5);
   974   } *ev = new EventFunctionImpl5 (f, a1, a2, a3, a4, a5);
   975   return ev; 
   975   return Ptr<EventImpl> (ev, false);
   976 }
   976 }
   977 
   977 
   978 template <typename T, typename OBJ>
   978 template <typename T, typename OBJ>
   979 EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (void), OBJ obj) 
   979 EventId Simulator::Schedule (Time const &time, void (T::*mem_ptr) (void), OBJ obj) 
   980 {
   980 {