23 #include "simulator.h"
24 #include "type-traits.h"
25 #include "fatal-error.h"
26 #include "int-to-type.h"
37 template <
typename T1>
39 template <
typename T1,
typename T2>
40 void SetArgs (T1 a1, T2 a2);
41 template <
typename T1,
typename T2,
typename T3>
42 void SetArgs (T1 a1, T2 a2, T3 a3);
43 template <
typename T1,
typename T2,
typename T3,
45 void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4);
46 template <
typename T1,
typename T2,
typename T3,
47 typename T4,
typename T5>
48 void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
49 template <
typename T1,
typename T2,
typename T3,
50 typename T4,
typename T5,
typename T6>
51 void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
54 virtual void Invoke (
void) = 0;
58 template <
typename T1>
61 virtual void SetArguments (T1 a1) = 0;
63 template <
typename T1,
typename T2>
66 virtual void SetArguments (T1 a1,T2 a2) = 0;
68 template <
typename T1,
typename T2,
typename T3>
71 virtual void SetArguments (T1 a1,T2 a2,T3 a3) = 0;
73 template <
typename T1,
typename T2,
typename T3,
typename T4>
76 virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4) = 0;
78 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
81 virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5) = 0;
83 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
86 virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5, T6 a6) = 0;
95 typedef const StoredType &ParameterType;
98 template <
typename FN>
100 MakeTimerImpl (FN fn)
106 template <
typename FN>
108 MakeTimerImpl (IntToType<0>, FN fn)
110 struct FnTimerImplZero :
public TimerImpl
112 FnTimerImplZero (FN fn)
116 virtual EventId Schedule (
const Time &delay)
120 virtual void Invoke (
void)
125 } *
function =
new FnTimerImplZero (fn);
129 template <
typename FN>
131 MakeTimerImpl (IntToType<1>, FN fn)
134 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
135 typedef typename TimerTraits<T1>::StoredType T1Stored;
137 struct FnTimerImplOne :
public TimerImplOne<T1Parameter>
139 FnTimerImplOne (FN fn)
143 virtual void SetArguments (T1Parameter a1)
147 virtual EventId Schedule (
const Time &delay)
151 virtual void Invoke (
void)
157 } *
function =
new FnTimerImplOne (fn);
161 template <
typename FN>
163 MakeTimerImpl (IntToType<2>, FN fn)
166 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
167 typedef typename TimerTraits<T1>::StoredType T1Stored;
169 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
170 typedef typename TimerTraits<T2>::StoredType T2Stored;
172 struct FnTimerImplTwo :
public TimerImplTwo<T1Parameter,T2Parameter>
174 FnTimerImplTwo (FN fn)
178 virtual void SetArguments (T1Parameter a1, T2Parameter a2)
183 virtual EventId Schedule (
const Time &delay)
187 virtual void Invoke (
void)
194 } *
function =
new FnTimerImplTwo (fn);
198 template <
typename FN>
200 MakeTimerImpl (IntToType<3>, FN fn)
203 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
204 typedef typename TimerTraits<T1>::StoredType T1Stored;
206 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
207 typedef typename TimerTraits<T2>::StoredType T2Stored;
209 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
210 typedef typename TimerTraits<T3>::StoredType T3Stored;
212 struct FnTimerImplThree :
public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
214 FnTimerImplThree (FN fn)
218 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3)
224 virtual EventId Schedule (
const Time &delay)
228 virtual void Invoke (
void)
230 m_fn (m_a1, m_a2, m_a3);
236 } *
function =
new FnTimerImplThree (fn);
240 template <
typename FN>
242 MakeTimerImpl (IntToType<4>, FN fn)
245 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
246 typedef typename TimerTraits<T1>::StoredType T1Stored;
248 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
249 typedef typename TimerTraits<T2>::StoredType T2Stored;
251 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
252 typedef typename TimerTraits<T3>::StoredType T3Stored;
254 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
255 typedef typename TimerTraits<T4>::StoredType T4Stored;
257 struct FnTimerImplFour :
public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
259 FnTimerImplFour (FN fn)
263 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4)
270 virtual EventId Schedule (
const Time &delay)
274 virtual void Invoke (
void)
276 m_fn (m_a1, m_a2, m_a3, m_a4);
283 } *
function =
new FnTimerImplFour (fn);
287 template <
typename FN>
289 MakeTimerImpl (IntToType<5>, FN fn)
292 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
293 typedef typename TimerTraits<T1>::StoredType T1Stored;
295 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
296 typedef typename TimerTraits<T2>::StoredType T2Stored;
298 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
299 typedef typename TimerTraits<T3>::StoredType T3Stored;
301 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
302 typedef typename TimerTraits<T4>::StoredType T4Stored;
304 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
305 typedef typename TimerTraits<T5>::StoredType T5Stored;
307 struct FnTimerImplFive :
public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
309 FnTimerImplFive (FN fn)
313 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5)
321 virtual EventId Schedule (
const Time &delay)
325 virtual void Invoke (
void)
327 m_fn (m_a1, m_a2, m_a3, m_a4, m_a5);
335 } *
function =
new FnTimerImplFive (fn);
339 template <
typename FN>
341 MakeTimerImpl (IntToType<6>, FN fn)
344 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
345 typedef typename TimerTraits<T1>::StoredType T1Stored;
347 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
348 typedef typename TimerTraits<T2>::StoredType T2Stored;
350 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
351 typedef typename TimerTraits<T3>::StoredType T3Stored;
353 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
354 typedef typename TimerTraits<T4>::StoredType T4Stored;
356 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
357 typedef typename TimerTraits<T5>::StoredType T5Stored;
359 typedef typename TimerTraits<T6>::ParameterType T6Parameter;
360 typedef typename TimerTraits<T6>::StoredType T6Stored;
362 struct FnTimerImplSix :
public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
364 FnTimerImplSix (FN fn)
368 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5, T6Parameter a6)
377 virtual EventId Schedule (
const Time &delay)
381 virtual void Invoke (
void)
383 m_fn (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
392 } *
function =
new FnTimerImplSix (fn);
397 template <
typename T>
401 template <
typename T>
404 static T &GetReference (T *p)
410 template <
typename MEM_PTR,
typename OBJ_PTR>
412 MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr)
418 template <
typename MEM_PTR,
typename OBJ_PTR>
420 MakeTimerImpl (IntToType<0>, MEM_PTR memPtr, OBJ_PTR objPtr)
422 struct MemFnTimerImplZero :
public TimerImpl
424 MemFnTimerImplZero (MEM_PTR memPtr, OBJ_PTR objPtr)
429 virtual EventId Schedule (
const Time &delay)
433 virtual void Invoke (
void)
435 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)();
439 } *
function =
new MemFnTimerImplZero (memPtr, objPtr);
443 template <
typename MEM_PTR,
typename OBJ_PTR>
445 MakeTimerImpl (IntToType<1>, MEM_PTR memPtr, OBJ_PTR objPtr)
448 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
449 typedef typename TimerTraits<T1>::StoredType T1Stored;
451 struct MemFnTimerImplOne :
public TimerImplOne<T1Parameter>
453 MemFnTimerImplOne (MEM_PTR memPtr, OBJ_PTR objPtr)
458 virtual void SetArguments (T1Parameter a1)
462 virtual EventId Schedule (
const Time &delay)
466 virtual void Invoke (
void)
468 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1);
473 } *
function =
new MemFnTimerImplOne (memPtr, objPtr);
477 template <
typename MEM_PTR,
typename OBJ_PTR>
479 MakeTimerImpl (IntToType<2>, MEM_PTR memPtr, OBJ_PTR objPtr)
482 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
483 typedef typename TimerTraits<T1>::StoredType T1Stored;
485 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
486 typedef typename TimerTraits<T2>::StoredType T2Stored;
488 struct MemFnTimerImplTwo :
public TimerImplTwo<T1Parameter,T2Parameter>
490 MemFnTimerImplTwo (MEM_PTR memPtr, OBJ_PTR objPtr)
495 virtual void SetArguments (T1Parameter a1, T2Parameter a2)
500 virtual EventId Schedule (
const Time &delay)
504 virtual void Invoke (
void)
506 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2);
512 } *
function =
new MemFnTimerImplTwo (memPtr, objPtr);
516 template <
typename MEM_PTR,
typename OBJ_PTR>
518 MakeTimerImpl (IntToType<3>, MEM_PTR memPtr, OBJ_PTR objPtr)
521 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
522 typedef typename TimerTraits<T1>::StoredType T1Stored;
524 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
525 typedef typename TimerTraits<T2>::StoredType T2Stored;
527 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
528 typedef typename TimerTraits<T3>::StoredType T3Stored;
530 struct MemFnTimerImplThree :
public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
532 MemFnTimerImplThree (MEM_PTR memPtr, OBJ_PTR objPtr)
537 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3)
543 virtual EventId Schedule (
const Time &delay)
547 virtual void Invoke (
void)
549 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3);
556 } *
function =
new MemFnTimerImplThree (memPtr, objPtr);
560 template <
typename MEM_PTR,
typename OBJ_PTR>
562 MakeTimerImpl (IntToType<4>, MEM_PTR memPtr, OBJ_PTR objPtr)
565 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
566 typedef typename TimerTraits<T1>::StoredType T1Stored;
568 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
569 typedef typename TimerTraits<T2>::StoredType T2Stored;
571 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
572 typedef typename TimerTraits<T3>::StoredType T3Stored;
574 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
575 typedef typename TimerTraits<T4>::StoredType T4Stored;
577 struct MemFnTimerImplFour :
public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
579 MemFnTimerImplFour (MEM_PTR memPtr, OBJ_PTR objPtr)
584 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4)
591 virtual EventId Schedule (
const Time &delay)
595 virtual void Invoke (
void)
597 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3, m_a4);
605 } *
function =
new MemFnTimerImplFour (memPtr, objPtr);
609 template <
typename MEM_PTR,
typename OBJ_PTR>
611 MakeTimerImpl (IntToType<5>, MEM_PTR memPtr, OBJ_PTR objPtr)
614 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
615 typedef typename TimerTraits<T1>::StoredType T1Stored;
617 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
618 typedef typename TimerTraits<T2>::StoredType T2Stored;
620 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
621 typedef typename TimerTraits<T3>::StoredType T3Stored;
623 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
624 typedef typename TimerTraits<T4>::StoredType T4Stored;
626 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
627 typedef typename TimerTraits<T5>::StoredType T5Stored;
629 struct MemFnTimerImplFive :
public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
631 MemFnTimerImplFive (MEM_PTR memPtr, OBJ_PTR objPtr)
636 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5)
644 virtual EventId Schedule (
const Time &delay)
648 virtual void Invoke (
void)
650 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3, m_a4, m_a5);
659 } *
function =
new MemFnTimerImplFive (memPtr, objPtr);
663 template <
typename MEM_PTR,
typename OBJ_PTR>
665 MakeTimerImpl (IntToType<6>, MEM_PTR memPtr, OBJ_PTR objPtr)
668 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
669 typedef typename TimerTraits<T1>::StoredType T1Stored;
671 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
672 typedef typename TimerTraits<T2>::StoredType T2Stored;
674 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
675 typedef typename TimerTraits<T3>::StoredType T3Stored;
677 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
678 typedef typename TimerTraits<T4>::StoredType T4Stored;
680 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
681 typedef typename TimerTraits<T5>::StoredType T5Stored;
683 typedef typename TimerTraits<T6>::ParameterType T6Parameter;
684 typedef typename TimerTraits<T6>::StoredType T6Stored;
686 struct MemFnTimerImplSix :
public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
688 MemFnTimerImplSix (MEM_PTR memPtr, OBJ_PTR objPtr)
693 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5,T6Parameter a6)
702 virtual EventId Schedule (
const Time &delay)
704 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
706 virtual void Invoke (
void)
708 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
718 } *
function =
new MemFnTimerImplSix (memPtr, objPtr);
723 template <
typename T1>
725 TimerImpl::SetArgs (T1 a1)
727 typedef struct TimerImplOne<
728 typename TimerTraits<T1>::ParameterType
730 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
733 NS_FATAL_ERROR (
"You tried to set Timer arguments incompatible with its function.");
736 impl->SetArguments (a1);
739 template <
typename T1,
typename T2>
741 TimerImpl::SetArgs (T1 a1, T2 a2)
743 typedef struct TimerImplTwo<
744 typename TimerTraits<T1>::ParameterType,
745 typename TimerTraits<T2>::ParameterType
747 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
750 NS_FATAL_ERROR (
"You tried to set Timer arguments incompatible with its function.");
753 impl->SetArguments (a1, a2);
756 template <
typename T1,
typename T2,
typename T3>
758 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3)
760 typedef struct TimerImplThree<
761 typename TimerTraits<T1>::ParameterType,
762 typename TimerTraits<T2>::ParameterType,
763 typename TimerTraits<T3>::ParameterType
765 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
768 NS_FATAL_ERROR (
"You tried to set Timer arguments incompatible with its function.");
771 impl->SetArguments (a1, a2, a3);
774 template <
typename T1,
typename T2,
typename T3,
typename T4>
776 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4)
778 typedef struct TimerImplFour<
779 typename TimerTraits<T1>::ParameterType,
780 typename TimerTraits<T2>::ParameterType,
781 typename TimerTraits<T3>::ParameterType,
782 typename TimerTraits<T4>::ParameterType
784 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
787 NS_FATAL_ERROR (
"You tried to set Timer arguments incompatible with its function.");
790 impl->SetArguments (a1, a2, a3, a4);
793 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
795 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
797 typedef struct TimerImplFive<
798 typename TimerTraits<T1>::ParameterType,
799 typename TimerTraits<T2>::ParameterType,
800 typename TimerTraits<T3>::ParameterType,
801 typename TimerTraits<T4>::ParameterType,
802 typename TimerTraits<T5>::ParameterType
804 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
807 NS_FATAL_ERROR (
"You tried to set Timer arguments incompatible with its function.");
810 impl->SetArguments (a1, a2, a3, a4, a5);
813 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
815 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
817 typedef struct TimerImplSix<
818 typename TimerTraits<T1>::ParameterType,
819 typename TimerTraits<T2>::ParameterType,
820 typename TimerTraits<T3>::ParameterType,
821 typename TimerTraits<T4>::ParameterType,
822 typename TimerTraits<T5>::ParameterType,
823 typename TimerTraits<T6>::ParameterType
825 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
828 NS_FATAL_ERROR (
"You tried to set Timer arguments incompatible with its function.");
831 impl->SetArguments (a1, a2, a3, a4, a5, a6);
#define NS_ASSERT(condition)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
#define NS_FATAL_ERROR(msg)
fatal error handling
an identifier for simulation events.