00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TIMER_IMPL_H
00021 #define TIMER_IMPL_H
00022
00023 #include "simulator.h"
00024 #include "ns3/type-traits.h"
00025 #include "ns3/fatal-error.h"
00026 #include "ns3/int-to-type.h"
00027
00028 namespace ns3 {
00029
00030 class TimerImpl
00031 {
00032 public:
00033 virtual ~TimerImpl () {}
00034
00035 template <typename T1>
00036 void SetArgs (T1 a1);
00037 template <typename T1, typename T2>
00038 void SetArgs (T1 a1, T2 a2);
00039 template <typename T1, typename T2, typename T3>
00040 void SetArgs (T1 a1, T2 a2, T3 a3);
00041 template <typename T1, typename T2, typename T3,
00042 typename T4>
00043 void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4);
00044 template <typename T1, typename T2, typename T3,
00045 typename T4, typename T5>
00046 void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
00047 template <typename T1, typename T2, typename T3,
00048 typename T4, typename T5, typename T6>
00049 void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
00050
00051 virtual EventId Schedule (const Time &delay) = 0;
00052 virtual void Invoke (void) = 0;
00053 };
00054
00055
00056 template <typename T1>
00057 struct TimerImplOne : public TimerImpl
00058 {
00059 virtual void SetArguments (T1 a1) = 0;
00060 };
00061 template <typename T1, typename T2>
00062 struct TimerImplTwo : public TimerImpl
00063 {
00064 virtual void SetArguments (T1 a1,T2 a2) = 0;
00065 };
00066 template <typename T1, typename T2, typename T3>
00067 struct TimerImplThree : public TimerImpl
00068 {
00069 virtual void SetArguments (T1 a1,T2 a2,T3 a3) = 0;
00070 };
00071 template <typename T1, typename T2, typename T3, typename T4>
00072 struct TimerImplFour : public TimerImpl
00073 {
00074 virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4) = 0;
00075 };
00076 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00077 struct TimerImplFive : public TimerImpl
00078 {
00079 virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5) = 0;
00080 };
00081 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
00082 struct TimerImplSix : public TimerImpl
00083 {
00084 virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5, T6 a6) = 0;
00085 };
00086
00087
00088
00089 template <typename T>
00090 struct TimerTraits
00091 {
00092 typedef typename TypeTraits<typename TypeTraits<T>::ReferencedType>::NonConstType StoredType;
00093 typedef const StoredType &ParameterType;
00094 };
00095
00096 template <typename FN>
00097 TimerImpl *
00098 MakeTimerImpl (FN fn)
00099 {
00100 NS_ASSERT (TypeTraits<FN>::IsFunctionPointer);
00101 return MakeTimerImpl (IntToType<TypeTraits<FN>::FunctionPointerTraits::nArgs> (), fn);
00102 }
00103
00104 template <typename FN>
00105 TimerImpl *
00106 MakeTimerImpl (IntToType<0>, FN fn)
00107 {
00108 struct FnTimerImplZero : public TimerImpl
00109 {
00110 FnTimerImplZero (FN fn)
00111 : m_fn (fn) {}
00112 virtual EventId Schedule (const Time &delay) {
00113 return Simulator::Schedule (delay, m_fn);
00114 }
00115 virtual void Invoke (void) {
00116 m_fn ();
00117 }
00118 FN m_fn;
00119 } *function = new FnTimerImplZero (fn);
00120 return function;
00121 }
00122
00123 template <typename FN>
00124 TimerImpl *
00125 MakeTimerImpl (IntToType<1>, FN fn)
00126 {
00127 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
00128 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00129 typedef typename TimerTraits<T1>::StoredType T1Stored;
00130
00131 struct FnTimerImplOne : public TimerImplOne<T1Parameter>
00132 {
00133 FnTimerImplOne (FN fn)
00134 : m_fn (fn) {}
00135 virtual void SetArguments (T1Parameter a1) {
00136 m_a1 = a1;
00137 }
00138 virtual EventId Schedule (const Time &delay) {
00139 return Simulator::Schedule (delay, m_fn, m_a1);
00140 }
00141 virtual void Invoke (void) {
00142 m_fn (m_a1);
00143 }
00144 FN m_fn;
00145 T1Stored m_a1;
00146 } *function = new FnTimerImplOne (fn);
00147 return function;
00148 }
00149
00150 template <typename FN>
00151 TimerImpl *
00152 MakeTimerImpl (IntToType<2>, FN fn)
00153 {
00154 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
00155 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00156 typedef typename TimerTraits<T1>::StoredType T1Stored;
00157 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
00158 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00159 typedef typename TimerTraits<T2>::StoredType T2Stored;
00160
00161 struct FnTimerImplTwo : public TimerImplTwo<T1Parameter,T2Parameter>
00162 {
00163 FnTimerImplTwo (FN fn)
00164 : m_fn (fn) {}
00165 virtual void SetArguments (T1Parameter a1, T2Parameter a2) {
00166 m_a1 = a1;
00167 m_a2 = a2;
00168 }
00169 virtual EventId Schedule (const Time &delay) {
00170 return Simulator::Schedule (delay, m_fn, m_a1, m_a2);
00171 }
00172 virtual void Invoke (void) {
00173 m_fn (m_a1, m_a2);
00174 }
00175 FN m_fn;
00176 T1Stored m_a1;
00177 T2Stored m_a2;
00178 } *function = new FnTimerImplTwo (fn);
00179 return function;
00180 }
00181
00182 template <typename FN>
00183 TimerImpl *
00184 MakeTimerImpl (IntToType<3>, FN fn)
00185 {
00186 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
00187 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00188 typedef typename TimerTraits<T1>::StoredType T1Stored;
00189 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
00190 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00191 typedef typename TimerTraits<T2>::StoredType T2Stored;
00192 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
00193 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00194 typedef typename TimerTraits<T3>::StoredType T3Stored;
00195
00196 struct FnTimerImplThree : public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
00197 {
00198 FnTimerImplThree (FN fn)
00199 : m_fn (fn) {}
00200 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3) {
00201 m_a1 = a1;
00202 m_a2 = a2;
00203 m_a3 = a3;
00204 }
00205 virtual EventId Schedule (const Time &delay) {
00206 return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3);
00207 }
00208 virtual void Invoke (void) {
00209 m_fn (m_a1, m_a2, m_a3);
00210 }
00211 FN m_fn;
00212 T1Stored m_a1;
00213 T2Stored m_a2;
00214 T3Stored m_a3;
00215 } *function = new FnTimerImplThree (fn);
00216 return function;
00217 }
00218
00219 template <typename FN>
00220 TimerImpl *
00221 MakeTimerImpl (IntToType<4>, FN fn)
00222 {
00223 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
00224 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00225 typedef typename TimerTraits<T1>::StoredType T1Stored;
00226 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
00227 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00228 typedef typename TimerTraits<T2>::StoredType T2Stored;
00229 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
00230 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00231 typedef typename TimerTraits<T3>::StoredType T3Stored;
00232 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg4Type T4;
00233 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
00234 typedef typename TimerTraits<T4>::StoredType T4Stored;
00235
00236 struct FnTimerImplFour : public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
00237 {
00238 FnTimerImplFour (FN fn)
00239 : m_fn (fn) {}
00240 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4) {
00241 m_a1 = a1;
00242 m_a2 = a2;
00243 m_a3 = a3;
00244 m_a4 = a4;
00245 }
00246 virtual EventId Schedule (const Time &delay) {
00247 return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4);
00248 }
00249 virtual void Invoke (void) {
00250 m_fn (m_a1, m_a2, m_a3, m_a4);
00251 }
00252 FN m_fn;
00253 T1Stored m_a1;
00254 T2Stored m_a2;
00255 T3Stored m_a3;
00256 T4Stored m_a4;
00257 } *function = new FnTimerImplFour (fn);
00258 return function;
00259 }
00260
00261 template <typename FN>
00262 TimerImpl *
00263 MakeTimerImpl (IntToType<5>, FN fn)
00264 {
00265 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
00266 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00267 typedef typename TimerTraits<T1>::StoredType T1Stored;
00268 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
00269 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00270 typedef typename TimerTraits<T2>::StoredType T2Stored;
00271 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
00272 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00273 typedef typename TimerTraits<T3>::StoredType T3Stored;
00274 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg4Type T4;
00275 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
00276 typedef typename TimerTraits<T4>::StoredType T4Stored;
00277 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg5Type T5;
00278 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
00279 typedef typename TimerTraits<T5>::StoredType T5Stored;
00280
00281 struct FnTimerImplFive : public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
00282 {
00283 FnTimerImplFive (FN fn)
00284 : m_fn (fn) {}
00285 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5) {
00286 m_a1 = a1;
00287 m_a2 = a2;
00288 m_a3 = a3;
00289 m_a4 = a4;
00290 m_a5 = a5;
00291 }
00292 virtual EventId Schedule (const Time &delay) {
00293 return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5);
00294 }
00295 virtual void Invoke (void) {
00296 m_fn (m_a1, m_a2, m_a3, m_a4, m_a5);
00297 }
00298 FN m_fn;
00299 T1Stored m_a1;
00300 T2Stored m_a2;
00301 T3Stored m_a3;
00302 T4Stored m_a4;
00303 T5Stored m_a5;
00304 } *function = new FnTimerImplFive (fn);
00305 return function;
00306 }
00307
00308 template <typename FN>
00309 TimerImpl *
00310 MakeTimerImpl (IntToType<6>, FN fn)
00311 {
00312 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg1Type T1;
00313 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00314 typedef typename TimerTraits<T1>::StoredType T1Stored;
00315 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg2Type T2;
00316 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00317 typedef typename TimerTraits<T2>::StoredType T2Stored;
00318 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg3Type T3;
00319 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00320 typedef typename TimerTraits<T3>::StoredType T3Stored;
00321 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg4Type T4;
00322 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
00323 typedef typename TimerTraits<T4>::StoredType T4Stored;
00324 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg5Type T5;
00325 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
00326 typedef typename TimerTraits<T5>::StoredType T5Stored;
00327 typedef typename TypeTraits<FN>::FunctionPointerTraits::Arg6Type T6;
00328 typedef typename TimerTraits<T6>::ParameterType T6Parameter;
00329 typedef typename TimerTraits<T6>::StoredType T6Stored;
00330
00331 struct FnTimerImplSix : public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
00332 {
00333 FnTimerImplSix (FN fn)
00334 : m_fn (fn) {}
00335 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5, T6Parameter a6) {
00336 m_a1 = a1;
00337 m_a2 = a2;
00338 m_a3 = a3;
00339 m_a4 = a4;
00340 m_a5 = a5;
00341 m_a6 = a6;
00342 }
00343 virtual EventId Schedule (const Time &delay) {
00344 return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
00345 }
00346 virtual void Invoke (void) {
00347 m_fn (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
00348 }
00349 FN m_fn;
00350 T1Stored m_a1;
00351 T2Stored m_a2;
00352 T3Stored m_a3;
00353 T4Stored m_a4;
00354 T5Stored m_a5;
00355 T6Stored m_a6;
00356 } *function = new FnTimerImplSix (fn);
00357 return function;
00358 }
00359
00360
00361 template <typename T>
00362 struct TimerImplMemberTraits;
00363
00364
00365 template <typename T>
00366 struct TimerImplMemberTraits<T *>
00367 {
00368 static T &GetReference (T *p) {
00369 return *p;
00370 }
00371 };
00372
00373 template <typename MEM_PTR, typename OBJ_PTR>
00374 TimerImpl *
00375 MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr)
00376 {
00377 NS_ASSERT (TypeTraits<MEM_PTR>::IsPointerToMember);
00378 return MakeTimerImpl (IntToType<TypeTraits<MEM_PTR>::PointerToMemberTraits::nArgs> () , memPtr, objPtr);
00379 }
00380
00381 template <typename MEM_PTR, typename OBJ_PTR>
00382 TimerImpl *
00383 MakeTimerImpl (IntToType<0>, MEM_PTR memPtr, OBJ_PTR objPtr)
00384 {
00385 struct MemFnTimerImplZero : public TimerImpl
00386 {
00387 MemFnTimerImplZero (MEM_PTR memPtr, OBJ_PTR objPtr)
00388 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00389 virtual EventId Schedule (const Time &delay) {
00390 return Simulator::Schedule (delay, m_memPtr, m_objPtr);
00391 }
00392 virtual void Invoke (void) {
00393 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) ();
00394 }
00395 MEM_PTR m_memPtr;
00396 OBJ_PTR m_objPtr;
00397 } *function = new MemFnTimerImplZero (memPtr, objPtr);
00398 return function;
00399 }
00400
00401 template <typename MEM_PTR, typename OBJ_PTR>
00402 TimerImpl *
00403 MakeTimerImpl (IntToType<1>, MEM_PTR memPtr, OBJ_PTR objPtr)
00404 {
00405 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
00406 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00407 typedef typename TimerTraits<T1>::StoredType T1Stored;
00408
00409 struct MemFnTimerImplOne : public TimerImplOne<T1Parameter>
00410 {
00411 MemFnTimerImplOne (MEM_PTR memPtr, OBJ_PTR objPtr)
00412 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00413 virtual void SetArguments (T1Parameter a1) {
00414 m_a1 = a1;
00415 }
00416 virtual EventId Schedule (const Time &delay) {
00417 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1);
00418 }
00419 virtual void Invoke (void) {
00420 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1);
00421 }
00422 MEM_PTR m_memPtr;
00423 OBJ_PTR m_objPtr;
00424 T1Stored m_a1;
00425 } *function = new MemFnTimerImplOne (memPtr, objPtr);
00426 return function;
00427 }
00428
00429 template <typename MEM_PTR, typename OBJ_PTR>
00430 TimerImpl *
00431 MakeTimerImpl (IntToType<2>, MEM_PTR memPtr, OBJ_PTR objPtr)
00432 {
00433 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
00434 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00435 typedef typename TimerTraits<T1>::StoredType T1Stored;
00436 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
00437 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00438 typedef typename TimerTraits<T2>::StoredType T2Stored;
00439
00440 struct MemFnTimerImplTwo : public TimerImplTwo<T1Parameter,T2Parameter>
00441 {
00442 MemFnTimerImplTwo (MEM_PTR memPtr, OBJ_PTR objPtr)
00443 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00444 virtual void SetArguments (T1Parameter a1, T2Parameter a2) {
00445 m_a1 = a1;
00446 m_a2 = a2;
00447 }
00448 virtual EventId Schedule (const Time &delay) {
00449 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2);
00450 }
00451 virtual void Invoke (void) {
00452 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2);
00453 }
00454 MEM_PTR m_memPtr;
00455 OBJ_PTR m_objPtr;
00456 T1Stored m_a1;
00457 T2Stored m_a2;
00458 } *function = new MemFnTimerImplTwo (memPtr, objPtr);
00459 return function;
00460 }
00461
00462 template <typename MEM_PTR, typename OBJ_PTR>
00463 TimerImpl *
00464 MakeTimerImpl (IntToType<3>, MEM_PTR memPtr, OBJ_PTR objPtr)
00465 {
00466 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
00467 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00468 typedef typename TimerTraits<T1>::StoredType T1Stored;
00469 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
00470 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00471 typedef typename TimerTraits<T2>::StoredType T2Stored;
00472 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
00473 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00474 typedef typename TimerTraits<T3>::StoredType T3Stored;
00475
00476 struct MemFnTimerImplThree : public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
00477 {
00478 MemFnTimerImplThree (MEM_PTR memPtr, OBJ_PTR objPtr)
00479 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00480 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3) {
00481 m_a1 = a1;
00482 m_a2 = a2;
00483 m_a3 = a3;
00484 }
00485 virtual EventId Schedule (const Time &delay) {
00486 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3);
00487 }
00488 virtual void Invoke (void) {
00489 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3);
00490 }
00491 MEM_PTR m_memPtr;
00492 OBJ_PTR m_objPtr;
00493 T1Stored m_a1;
00494 T2Stored m_a2;
00495 T3Stored m_a3;
00496 } *function = new MemFnTimerImplThree (memPtr, objPtr);
00497 return function;
00498 }
00499
00500 template <typename MEM_PTR, typename OBJ_PTR>
00501 TimerImpl *
00502 MakeTimerImpl (IntToType<4>, MEM_PTR memPtr, OBJ_PTR objPtr)
00503 {
00504 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
00505 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00506 typedef typename TimerTraits<T1>::StoredType T1Stored;
00507 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
00508 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00509 typedef typename TimerTraits<T2>::StoredType T2Stored;
00510 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
00511 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00512 typedef typename TimerTraits<T3>::StoredType T3Stored;
00513 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg4Type T4;
00514 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
00515 typedef typename TimerTraits<T4>::StoredType T4Stored;
00516
00517 struct MemFnTimerImplFour : public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
00518 {
00519 MemFnTimerImplFour (MEM_PTR memPtr, OBJ_PTR objPtr)
00520 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00521 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4) {
00522 m_a1 = a1;
00523 m_a2 = a2;
00524 m_a3 = a3;
00525 m_a4 = a4;
00526 }
00527 virtual EventId Schedule (const Time &delay) {
00528 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4);
00529 }
00530 virtual void Invoke (void) {
00531 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4);
00532 }
00533 MEM_PTR m_memPtr;
00534 OBJ_PTR m_objPtr;
00535 T1Stored m_a1;
00536 T2Stored m_a2;
00537 T3Stored m_a3;
00538 T4Stored m_a4;
00539 } *function = new MemFnTimerImplFour (memPtr, objPtr);
00540 return function;
00541 }
00542
00543 template <typename MEM_PTR, typename OBJ_PTR>
00544 TimerImpl *
00545 MakeTimerImpl (IntToType<5>, MEM_PTR memPtr, OBJ_PTR objPtr)
00546 {
00547 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
00548 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00549 typedef typename TimerTraits<T1>::StoredType T1Stored;
00550 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
00551 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00552 typedef typename TimerTraits<T2>::StoredType T2Stored;
00553 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
00554 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00555 typedef typename TimerTraits<T3>::StoredType T3Stored;
00556 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg4Type T4;
00557 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
00558 typedef typename TimerTraits<T4>::StoredType T4Stored;
00559 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg5Type T5;
00560 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
00561 typedef typename TimerTraits<T5>::StoredType T5Stored;
00562
00563 struct MemFnTimerImplFive : public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
00564 {
00565 MemFnTimerImplFive (MEM_PTR memPtr, OBJ_PTR objPtr)
00566 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00567 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5) {
00568 m_a1 = a1;
00569 m_a2 = a2;
00570 m_a3 = a3;
00571 m_a4 = a4;
00572 m_a5 = a5;
00573 }
00574 virtual EventId Schedule (const Time &delay) {
00575 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5);
00576 }
00577 virtual void Invoke (void) {
00578 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4, m_a5);
00579 }
00580 MEM_PTR m_memPtr;
00581 OBJ_PTR m_objPtr;
00582 T1Stored m_a1;
00583 T2Stored m_a2;
00584 T3Stored m_a3;
00585 T4Stored m_a4;
00586 T5Stored m_a5;
00587 } *function = new MemFnTimerImplFive (memPtr, objPtr);
00588 return function;
00589 }
00590
00591 template <typename MEM_PTR, typename OBJ_PTR>
00592 TimerImpl *
00593 MakeTimerImpl (IntToType<6>, MEM_PTR memPtr, OBJ_PTR objPtr)
00594 {
00595 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg1Type T1;
00596 typedef typename TimerTraits<T1>::ParameterType T1Parameter;
00597 typedef typename TimerTraits<T1>::StoredType T1Stored;
00598 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg2Type T2;
00599 typedef typename TimerTraits<T2>::ParameterType T2Parameter;
00600 typedef typename TimerTraits<T2>::StoredType T2Stored;
00601 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg3Type T3;
00602 typedef typename TimerTraits<T3>::ParameterType T3Parameter;
00603 typedef typename TimerTraits<T3>::StoredType T3Stored;
00604 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg4Type T4;
00605 typedef typename TimerTraits<T4>::ParameterType T4Parameter;
00606 typedef typename TimerTraits<T4>::StoredType T4Stored;
00607 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg5Type T5;
00608 typedef typename TimerTraits<T5>::ParameterType T5Parameter;
00609 typedef typename TimerTraits<T5>::StoredType T5Stored;
00610 typedef typename TypeTraits<MEM_PTR>::PointerToMemberTraits::Arg6Type T6;
00611 typedef typename TimerTraits<T6>::ParameterType T6Parameter;
00612 typedef typename TimerTraits<T6>::StoredType T6Stored;
00613
00614 struct MemFnTimerImplSix : public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
00615 {
00616 MemFnTimerImplSix (MEM_PTR memPtr, OBJ_PTR objPtr)
00617 : m_memPtr (memPtr), m_objPtr (objPtr) {}
00618 virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5,T6Parameter a6) {
00619 m_a1 = a1;
00620 m_a2 = a2;
00621 m_a3 = a3;
00622 m_a4 = a4;
00623 m_a5 = a5;
00624 m_a6 = a6;
00625 }
00626 virtual EventId Schedule (const Time &delay) {
00627 return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
00628 }
00629 virtual void Invoke (void) {
00630 (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr) (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
00631 }
00632 MEM_PTR m_memPtr;
00633 OBJ_PTR m_objPtr;
00634 T1Stored m_a1;
00635 T2Stored m_a2;
00636 T3Stored m_a3;
00637 T4Stored m_a4;
00638 T5Stored m_a5;
00639 T6Stored m_a6;
00640 } *function = new MemFnTimerImplSix (memPtr, objPtr);
00641 return function;
00642 }
00643
00644
00645 template <typename T1>
00646 void
00647 TimerImpl::SetArgs (T1 a1)
00648 {
00649 typedef struct TimerImplOne<
00650 typename TimerTraits<T1>::ParameterType
00651 > TimerImplBase;
00652 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
00653 if (impl == 0)
00654 {
00655 NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
00656 return;
00657 }
00658 impl->SetArguments (a1);
00659 }
00660
00661 template <typename T1, typename T2>
00662 void
00663 TimerImpl::SetArgs (T1 a1, T2 a2)
00664 {
00665 typedef struct TimerImplTwo<
00666 typename TimerTraits<T1>::ParameterType,
00667 typename TimerTraits<T2>::ParameterType
00668 > TimerImplBase;
00669 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
00670 if (impl == 0)
00671 {
00672 NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
00673 return;
00674 }
00675 impl->SetArguments (a1, a2);
00676 }
00677
00678 template <typename T1, typename T2, typename T3>
00679 void
00680 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3)
00681 {
00682 typedef struct TimerImplThree<
00683 typename TimerTraits<T1>::ParameterType,
00684 typename TimerTraits<T2>::ParameterType,
00685 typename TimerTraits<T3>::ParameterType
00686 > TimerImplBase;
00687 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
00688 if (impl == 0)
00689 {
00690 NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
00691 return;
00692 }
00693 impl->SetArguments (a1, a2, a3);
00694 }
00695
00696 template <typename T1, typename T2, typename T3, typename T4>
00697 void
00698 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4)
00699 {
00700 typedef struct TimerImplFour<
00701 typename TimerTraits<T1>::ParameterType,
00702 typename TimerTraits<T2>::ParameterType,
00703 typename TimerTraits<T3>::ParameterType,
00704 typename TimerTraits<T4>::ParameterType
00705 > TimerImplBase;
00706 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
00707 if (impl == 0)
00708 {
00709 NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
00710 return;
00711 }
00712 impl->SetArguments (a1, a2, a3, a4);
00713 }
00714
00715 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00716 void
00717 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
00718 {
00719 typedef struct TimerImplFive<
00720 typename TimerTraits<T1>::ParameterType,
00721 typename TimerTraits<T2>::ParameterType,
00722 typename TimerTraits<T3>::ParameterType,
00723 typename TimerTraits<T4>::ParameterType,
00724 typename TimerTraits<T5>::ParameterType
00725 > TimerImplBase;
00726 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
00727 if (impl == 0)
00728 {
00729 NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
00730 return;
00731 }
00732 impl->SetArguments (a1, a2, a3, a4, a5);
00733 }
00734
00735 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
00736 void
00737 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
00738 {
00739 typedef struct TimerImplSix<
00740 typename TimerTraits<T1>::ParameterType,
00741 typename TimerTraits<T2>::ParameterType,
00742 typename TimerTraits<T3>::ParameterType,
00743 typename TimerTraits<T4>::ParameterType,
00744 typename TimerTraits<T5>::ParameterType,
00745 typename TimerTraits<T6>::ParameterType
00746 > TimerImplBase;
00747 TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
00748 if (impl == 0)
00749 {
00750 NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
00751 return;
00752 }
00753 impl->SetArguments (a1, a2, a3, a4, a5, a6);
00754 }
00755
00756 }
00757
00758 #endif