A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
timer-impl.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007 INRIA
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 #ifndef TIMER_IMPL_H
21 #define TIMER_IMPL_H
22 
23 #include "simulator.h"
24 #include "type-traits.h"
25 #include "fatal-error.h"
26 #include "int-to-type.h"
27 
28 namespace ns3 {
29 
30 class TimerImpl
31 {
32 public:
33  virtual ~TimerImpl ()
34  {
35  }
36 
37  template <typename T1>
38  void SetArgs (T1 a1);
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,
44  typename T4>
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);
52 
53  virtual EventId Schedule (const Time &delay) = 0;
54  virtual void Invoke (void) = 0;
55 };
56 
57 
58 template <typename T1>
59 struct TimerImplOne : public TimerImpl
60 {
61  virtual void SetArguments (T1 a1) = 0;
62 };
63 template <typename T1, typename T2>
64 struct TimerImplTwo : public TimerImpl
65 {
66  virtual void SetArguments (T1 a1,T2 a2) = 0;
67 };
68 template <typename T1, typename T2, typename T3>
69 struct TimerImplThree : public TimerImpl
70 {
71  virtual void SetArguments (T1 a1,T2 a2,T3 a3) = 0;
72 };
73 template <typename T1, typename T2, typename T3, typename T4>
74 struct TimerImplFour : public TimerImpl
75 {
76  virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4) = 0;
77 };
78 template <typename T1, typename T2, typename T3, typename T4, typename T5>
79 struct TimerImplFive : public TimerImpl
80 {
81  virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5) = 0;
82 };
83 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
84 struct TimerImplSix : public TimerImpl
85 {
86  virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5, T6 a6) = 0;
87 };
88 
89 
90 
91 template <typename T>
93 {
95  typedef const StoredType &ParameterType;
96 };
97 
98 template <typename FN>
99 TimerImpl *
101 {
104 }
105 
106 template <typename FN>
107 TimerImpl *
109 {
110  struct FnTimerImplZero : public TimerImpl
111  {
112  FnTimerImplZero (FN fn)
113  : m_fn (fn)
114  {
115  }
116  virtual EventId Schedule (const Time &delay)
117  {
118  return Simulator::Schedule (delay, m_fn);
119  }
120  virtual void Invoke (void)
121  {
122  m_fn ();
123  }
124  FN m_fn;
125  } *function = new FnTimerImplZero (fn);
126  return function;
127 }
128 
129 template <typename FN>
130 TimerImpl *
132 {
134  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
135  typedef typename TimerTraits<T1>::StoredType T1Stored;
136 
137  struct FnTimerImplOne : public TimerImplOne<T1Parameter>
138  {
139  FnTimerImplOne (FN fn)
140  : m_fn (fn)
141  {
142  }
143  virtual void SetArguments (T1Parameter a1)
144  {
145  m_a1 = a1;
146  }
147  virtual EventId Schedule (const Time &delay)
148  {
149  return Simulator::Schedule (delay, m_fn, m_a1);
150  }
151  virtual void Invoke (void)
152  {
153  m_fn (m_a1);
154  }
155  FN m_fn;
156  T1Stored m_a1;
157  } *function = new FnTimerImplOne (fn);
158  return function;
159 }
160 
161 template <typename FN>
162 TimerImpl *
164 {
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;
171 
172  struct FnTimerImplTwo : public TimerImplTwo<T1Parameter,T2Parameter>
173  {
174  FnTimerImplTwo (FN fn)
175  : m_fn (fn)
176  {
177  }
178  virtual void SetArguments (T1Parameter a1, T2Parameter a2)
179  {
180  m_a1 = a1;
181  m_a2 = a2;
182  }
183  virtual EventId Schedule (const Time &delay)
184  {
185  return Simulator::Schedule (delay, m_fn, m_a1, m_a2);
186  }
187  virtual void Invoke (void)
188  {
189  m_fn (m_a1, m_a2);
190  }
191  FN m_fn;
192  T1Stored m_a1;
193  T2Stored m_a2;
194  } *function = new FnTimerImplTwo (fn);
195  return function;
196 }
197 
198 template <typename FN>
199 TimerImpl *
201 {
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;
211 
212  struct FnTimerImplThree : public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
213  {
214  FnTimerImplThree (FN fn)
215  : m_fn (fn)
216  {
217  }
218  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3)
219  {
220  m_a1 = a1;
221  m_a2 = a2;
222  m_a3 = a3;
223  }
224  virtual EventId Schedule (const Time &delay)
225  {
226  return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3);
227  }
228  virtual void Invoke (void)
229  {
230  m_fn (m_a1, m_a2, m_a3);
231  }
232  FN m_fn;
233  T1Stored m_a1;
234  T2Stored m_a2;
235  T3Stored m_a3;
236  } *function = new FnTimerImplThree (fn);
237  return function;
238 }
239 
240 template <typename FN>
241 TimerImpl *
243 {
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;
256 
257  struct FnTimerImplFour : public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
258  {
259  FnTimerImplFour (FN fn)
260  : m_fn (fn)
261  {
262  }
263  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4)
264  {
265  m_a1 = a1;
266  m_a2 = a2;
267  m_a3 = a3;
268  m_a4 = a4;
269  }
270  virtual EventId Schedule (const Time &delay)
271  {
272  return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4);
273  }
274  virtual void Invoke (void)
275  {
276  m_fn (m_a1, m_a2, m_a3, m_a4);
277  }
278  FN m_fn;
279  T1Stored m_a1;
280  T2Stored m_a2;
281  T3Stored m_a3;
282  T4Stored m_a4;
283  } *function = new FnTimerImplFour (fn);
284  return function;
285 }
286 
287 template <typename FN>
288 TimerImpl *
290 {
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;
306 
307  struct FnTimerImplFive : public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
308  {
309  FnTimerImplFive (FN fn)
310  : m_fn (fn)
311  {
312  }
313  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5)
314  {
315  m_a1 = a1;
316  m_a2 = a2;
317  m_a3 = a3;
318  m_a4 = a4;
319  m_a5 = a5;
320  }
321  virtual EventId Schedule (const Time &delay)
322  {
323  return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5);
324  }
325  virtual void Invoke (void)
326  {
327  m_fn (m_a1, m_a2, m_a3, m_a4, m_a5);
328  }
329  FN m_fn;
330  T1Stored m_a1;
331  T2Stored m_a2;
332  T3Stored m_a3;
333  T4Stored m_a4;
334  T5Stored m_a5;
335  } *function = new FnTimerImplFive (fn);
336  return function;
337 }
338 
339 template <typename FN>
340 TimerImpl *
342 {
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;
361 
362  struct FnTimerImplSix : public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
363  {
364  FnTimerImplSix (FN fn)
365  : m_fn (fn)
366  {
367  }
368  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4, T5Parameter a5, T6Parameter a6)
369  {
370  m_a1 = a1;
371  m_a2 = a2;
372  m_a3 = a3;
373  m_a4 = a4;
374  m_a5 = a5;
375  m_a6 = a6;
376  }
377  virtual EventId Schedule (const Time &delay)
378  {
379  return Simulator::Schedule (delay, m_fn, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
380  }
381  virtual void Invoke (void)
382  {
383  m_fn (m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
384  }
385  FN m_fn;
386  T1Stored m_a1;
387  T2Stored m_a2;
388  T3Stored m_a3;
389  T4Stored m_a4;
390  T5Stored m_a5;
391  T6Stored m_a6;
392  } *function = new FnTimerImplSix (fn);
393  return function;
394 }
395 
396 
397 template <typename T>
399 
400 
401 template <typename T>
403 {
404  static T &GetReference (T *p)
405  {
406  return *p;
407  }
408 };
409 
410 template <typename MEM_PTR, typename OBJ_PTR>
411 TimerImpl *
412 MakeTimerImpl (MEM_PTR memPtr, OBJ_PTR objPtr)
413 {
416 }
417 
418 template <typename MEM_PTR, typename OBJ_PTR>
419 TimerImpl *
420 MakeTimerImpl (IntToType<0>, MEM_PTR memPtr, OBJ_PTR objPtr)
421 {
422  struct MemFnTimerImplZero : public TimerImpl
423  {
424  MemFnTimerImplZero (MEM_PTR memPtr, OBJ_PTR objPtr)
425  : m_memPtr (memPtr),
426  m_objPtr (objPtr)
427  {
428  }
429  virtual EventId Schedule (const Time &delay)
430  {
431  return Simulator::Schedule (delay, m_memPtr, m_objPtr);
432  }
433  virtual void Invoke (void)
434  {
435  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)();
436  }
437  MEM_PTR m_memPtr;
438  OBJ_PTR m_objPtr;
439  } *function = new MemFnTimerImplZero (memPtr, objPtr);
440  return function;
441 }
442 
443 template <typename MEM_PTR, typename OBJ_PTR>
444 TimerImpl *
445 MakeTimerImpl (IntToType<1>, MEM_PTR memPtr, OBJ_PTR objPtr)
446 {
448  typedef typename TimerTraits<T1>::ParameterType T1Parameter;
449  typedef typename TimerTraits<T1>::StoredType T1Stored;
450 
451  struct MemFnTimerImplOne : public TimerImplOne<T1Parameter>
452  {
453  MemFnTimerImplOne (MEM_PTR memPtr, OBJ_PTR objPtr)
454  : m_memPtr (memPtr),
455  m_objPtr (objPtr)
456  {
457  }
458  virtual void SetArguments (T1Parameter a1)
459  {
460  m_a1 = a1;
461  }
462  virtual EventId Schedule (const Time &delay)
463  {
464  return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1);
465  }
466  virtual void Invoke (void)
467  {
468  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1);
469  }
470  MEM_PTR m_memPtr;
471  OBJ_PTR m_objPtr;
472  T1Stored m_a1;
473  } *function = new MemFnTimerImplOne (memPtr, objPtr);
474  return function;
475 }
476 
477 template <typename MEM_PTR, typename OBJ_PTR>
478 TimerImpl *
479 MakeTimerImpl (IntToType<2>, MEM_PTR memPtr, OBJ_PTR objPtr)
480 {
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;
487 
488  struct MemFnTimerImplTwo : public TimerImplTwo<T1Parameter,T2Parameter>
489  {
490  MemFnTimerImplTwo (MEM_PTR memPtr, OBJ_PTR objPtr)
491  : m_memPtr (memPtr),
492  m_objPtr (objPtr)
493  {
494  }
495  virtual void SetArguments (T1Parameter a1, T2Parameter a2)
496  {
497  m_a1 = a1;
498  m_a2 = a2;
499  }
500  virtual EventId Schedule (const Time &delay)
501  {
502  return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2);
503  }
504  virtual void Invoke (void)
505  {
506  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2);
507  }
508  MEM_PTR m_memPtr;
509  OBJ_PTR m_objPtr;
510  T1Stored m_a1;
511  T2Stored m_a2;
512  } *function = new MemFnTimerImplTwo (memPtr, objPtr);
513  return function;
514 }
515 
516 template <typename MEM_PTR, typename OBJ_PTR>
517 TimerImpl *
518 MakeTimerImpl (IntToType<3>, MEM_PTR memPtr, OBJ_PTR objPtr)
519 {
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;
529 
530  struct MemFnTimerImplThree : public TimerImplThree<T1Parameter,T2Parameter,T3Parameter>
531  {
532  MemFnTimerImplThree (MEM_PTR memPtr, OBJ_PTR objPtr)
533  : m_memPtr (memPtr),
534  m_objPtr (objPtr)
535  {
536  }
537  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3)
538  {
539  m_a1 = a1;
540  m_a2 = a2;
541  m_a3 = a3;
542  }
543  virtual EventId Schedule (const Time &delay)
544  {
545  return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3);
546  }
547  virtual void Invoke (void)
548  {
549  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3);
550  }
551  MEM_PTR m_memPtr;
552  OBJ_PTR m_objPtr;
553  T1Stored m_a1;
554  T2Stored m_a2;
555  T3Stored m_a3;
556  } *function = new MemFnTimerImplThree (memPtr, objPtr);
557  return function;
558 }
559 
560 template <typename MEM_PTR, typename OBJ_PTR>
561 TimerImpl *
562 MakeTimerImpl (IntToType<4>, MEM_PTR memPtr, OBJ_PTR objPtr)
563 {
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;
576 
577  struct MemFnTimerImplFour : public TimerImplFour<T1Parameter,T2Parameter,T3Parameter,T4Parameter>
578  {
579  MemFnTimerImplFour (MEM_PTR memPtr, OBJ_PTR objPtr)
580  : m_memPtr (memPtr),
581  m_objPtr (objPtr)
582  {
583  }
584  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4)
585  {
586  m_a1 = a1;
587  m_a2 = a2;
588  m_a3 = a3;
589  m_a4 = a4;
590  }
591  virtual EventId Schedule (const Time &delay)
592  {
593  return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4);
594  }
595  virtual void Invoke (void)
596  {
597  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3, m_a4);
598  }
599  MEM_PTR m_memPtr;
600  OBJ_PTR m_objPtr;
601  T1Stored m_a1;
602  T2Stored m_a2;
603  T3Stored m_a3;
604  T4Stored m_a4;
605  } *function = new MemFnTimerImplFour (memPtr, objPtr);
606  return function;
607 }
608 
609 template <typename MEM_PTR, typename OBJ_PTR>
610 TimerImpl *
611 MakeTimerImpl (IntToType<5>, MEM_PTR memPtr, OBJ_PTR objPtr)
612 {
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;
628 
629  struct MemFnTimerImplFive : public TimerImplFive<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter>
630  {
631  MemFnTimerImplFive (MEM_PTR memPtr, OBJ_PTR objPtr)
632  : m_memPtr (memPtr),
633  m_objPtr (objPtr)
634  {
635  }
636  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5)
637  {
638  m_a1 = a1;
639  m_a2 = a2;
640  m_a3 = a3;
641  m_a4 = a4;
642  m_a5 = a5;
643  }
644  virtual EventId Schedule (const Time &delay)
645  {
646  return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5);
647  }
648  virtual void Invoke (void)
649  {
650  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3, m_a4, m_a5);
651  }
652  MEM_PTR m_memPtr;
653  OBJ_PTR m_objPtr;
654  T1Stored m_a1;
655  T2Stored m_a2;
656  T3Stored m_a3;
657  T4Stored m_a4;
658  T5Stored m_a5;
659  } *function = new MemFnTimerImplFive (memPtr, objPtr);
660  return function;
661 }
662 
663 template <typename MEM_PTR, typename OBJ_PTR>
664 TimerImpl *
665 MakeTimerImpl (IntToType<6>, MEM_PTR memPtr, OBJ_PTR objPtr)
666 {
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;
685 
686  struct MemFnTimerImplSix : public TimerImplSix<T1Parameter,T2Parameter,T3Parameter,T4Parameter,T5Parameter,T6Parameter>
687  {
688  MemFnTimerImplSix (MEM_PTR memPtr, OBJ_PTR objPtr)
689  : m_memPtr (memPtr),
690  m_objPtr (objPtr)
691  {
692  }
693  virtual void SetArguments (T1Parameter a1, T2Parameter a2, T3Parameter a3, T4Parameter a4,T5Parameter a5,T6Parameter a6)
694  {
695  m_a1 = a1;
696  m_a2 = a2;
697  m_a3 = a3;
698  m_a4 = a4;
699  m_a5 = a5;
700  m_a6 = a6;
701  }
702  virtual EventId Schedule (const Time &delay)
703  {
704  return Simulator::Schedule (delay, m_memPtr, m_objPtr, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
705  }
706  virtual void Invoke (void)
707  {
708  (TimerImplMemberTraits<OBJ_PTR>::GetReference (m_objPtr).*m_memPtr)(m_a1, m_a2, m_a3, m_a4, m_a5, m_a6);
709  }
710  MEM_PTR m_memPtr;
711  OBJ_PTR m_objPtr;
712  T1Stored m_a1;
713  T2Stored m_a2;
714  T3Stored m_a3;
715  T4Stored m_a4;
716  T5Stored m_a5;
717  T6Stored m_a6;
718  } *function = new MemFnTimerImplSix (memPtr, objPtr);
719  return function;
720 }
721 
722 
723 template <typename T1>
724 void
726 {
727  typedef struct TimerImplOne<
728  typename TimerTraits<T1>::ParameterType
729  > TimerImplBase;
730  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
731  if (impl == 0)
732  {
733  NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
734  return;
735  }
736  impl->SetArguments (a1);
737 }
738 
739 template <typename T1, typename T2>
740 void
741 TimerImpl::SetArgs (T1 a1, T2 a2)
742 {
743  typedef struct TimerImplTwo<
744  typename TimerTraits<T1>::ParameterType,
745  typename TimerTraits<T2>::ParameterType
746  > TimerImplBase;
747  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
748  if (impl == 0)
749  {
750  NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
751  return;
752  }
753  impl->SetArguments (a1, a2);
754 }
755 
756 template <typename T1, typename T2, typename T3>
757 void
758 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3)
759 {
760  typedef struct TimerImplThree<
761  typename TimerTraits<T1>::ParameterType,
762  typename TimerTraits<T2>::ParameterType,
763  typename TimerTraits<T3>::ParameterType
764  > TimerImplBase;
765  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
766  if (impl == 0)
767  {
768  NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
769  return;
770  }
771  impl->SetArguments (a1, a2, a3);
772 }
773 
774 template <typename T1, typename T2, typename T3, typename T4>
775 void
776 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4)
777 {
778  typedef struct TimerImplFour<
779  typename TimerTraits<T1>::ParameterType,
780  typename TimerTraits<T2>::ParameterType,
781  typename TimerTraits<T3>::ParameterType,
782  typename TimerTraits<T4>::ParameterType
783  > TimerImplBase;
784  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
785  if (impl == 0)
786  {
787  NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
788  return;
789  }
790  impl->SetArguments (a1, a2, a3, a4);
791 }
792 
793 template <typename T1, typename T2, typename T3, typename T4, typename T5>
794 void
795 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
796 {
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
803  > TimerImplBase;
804  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
805  if (impl == 0)
806  {
807  NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
808  return;
809  }
810  impl->SetArguments (a1, a2, a3, a4, a5);
811 }
812 
813 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
814 void
815 TimerImpl::SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
816 {
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
824  > TimerImplBase;
825  TimerImplBase *impl = dynamic_cast<TimerImplBase *> (this);
826  if (impl == 0)
827  {
828  NS_FATAL_ERROR ("You tried to set Timer arguments incompatible with its function.");
829  return;
830  }
831  impl->SetArguments (a1, a2, a3, a4, a5, a6);
832 }
833 
834 } // namespace ns3
835 
836 #endif /* TIMER_IMPL_H */
virtual void SetArguments(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)=0
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
TypeTraits< typename TypeTraits< T >::ReferencedType >::NonConstType StoredType
Definition: timer-impl.h:94
#define NS_ASSERT(condition)
Definition: assert.h:64
virtual void SetArguments(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)=0
virtual void SetArguments(T1 a1, T2 a2)=0
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Definition: simulator.h:824
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
const StoredType & ParameterType
Definition: timer-impl.h:95
This trivial template is extremely useful, as explained in "Modern C++ Design", p29, section 2.4, "Mapping Integral Constants to Types".
Definition: int-to-type.h:12
virtual ~TimerImpl()
Definition: timer-impl.h:33
virtual void SetArguments(T1 a1, T2 a2, T3 a3)=0
virtual EventId Schedule(const Time &delay)=0
virtual void SetArguments(T1 a1)=0
an identifier for simulation events.
Definition: event-id.h:46
Type trait reference values.
Definition: type-traits.h:6
TimerImpl * MakeTimerImpl(FN fn)
Definition: timer-impl.h:100
virtual void SetArguments(T1 a1, T2 a2, T3 a3, T4 a4)=0
virtual void Invoke(void)=0
void SetArgs(T1 a1)
Definition: timer-impl.h:725