changeset 1008 | 6f2ea723a1db |
parent 963 | 3a7a66d1942c |
child 1010 | 3a252ceeac44 |
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 { |