A Discrete-Event Network Simulator
API
callback.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2005,2006 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 
21 #ifndef CALLBACK_H
22 #define CALLBACK_H
23 
24 #include "ptr.h"
25 #include "fatal-error.h"
26 #include "empty.h"
27 #include "type-traits.h"
28 #include "attribute.h"
29 #include "attribute-helper.h"
30 #include "simple-ref-count.h"
31 #include <typeinfo>
32 
39 namespace ns3 {
40 
41 // Define the doxygen subgroups all at once,
42 // since the implementations are interleaved.
43 
112 template <typename T>
114 
121 template <typename T>
122 struct CallbackTraits<T *>
123 {
128  static T & GetReference (T * const p)
129  {
130  return *p;
131  }
132 };
133 
139 class CallbackImplBase : public SimpleRefCount<CallbackImplBase>
140 {
141 public:
143  virtual ~CallbackImplBase () {}
150  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
152  virtual std::string GetTypeid (void) const = 0;
153 
154 protected:
159  static std::string Demangle (const std::string& mangled);
167  template <typename T>
168  static std::string GetCppTypeid (void)
169  {
170  std::string typeName;
171  try
172  {
173  typeName = typeid (T).name ();
174  typeName = Demangle (typeName);
175  }
176  catch (const std::bad_typeid &e)
177  {
178  typeName = e.what ();
179  }
180  return typeName;
181  }
182 };
183 
188 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
190 
198 template <typename R>
200 public:
201  virtual ~CallbackImpl () {}
202  virtual R operator() (void) = 0;
203  virtual std::string GetTypeid (void) const
204  {
205  return DoGetTypeid ();
206  }
207  static std::string DoGetTypeid (void)
208  {
209  static std::string id = "CallbackImpl<" +
210  GetCppTypeid<R> () +
211  ">";
212  return id;
213  }
214 };
216 template <typename R, typename T1>
218 public:
219  virtual ~CallbackImpl () {}
220  virtual R operator() (T1) = 0;
221  virtual std::string GetTypeid (void) const
222  {
223  return DoGetTypeid ();
224  }
225  static std::string DoGetTypeid (void)
226  {
227  static std::string id = "CallbackImpl<" +
228  GetCppTypeid<R> () + "," +
229  GetCppTypeid<T1> () +
230  ">";
231  return id;
232  }
233 };
235 template <typename R, typename T1, typename T2>
237 public:
238  virtual ~CallbackImpl () {}
239  virtual R operator() (T1, T2) = 0;
240  virtual std::string GetTypeid (void) const
241  {
242  return DoGetTypeid ();
243  }
244  static std::string DoGetTypeid (void)
245  {
246  static std::string id = "CallbackImpl<" +
247  GetCppTypeid<R> () + "," +
248  GetCppTypeid<T1> () + "," +
249  GetCppTypeid<T2> () +
250  ">";
251  return id;
252  }
253 };
255 template <typename R, typename T1, typename T2, typename T3>
257 public:
258  virtual ~CallbackImpl () {}
259  virtual R operator() (T1, T2, T3) = 0;
260  virtual std::string GetTypeid (void) const
261  {
262  return DoGetTypeid ();
263  }
264  static std::string DoGetTypeid (void)
265  {
266  static std::string id = "CallbackImpl<" +
267  GetCppTypeid<R> () + "," +
268  GetCppTypeid<T1> () + "," +
269  GetCppTypeid<T2> () + "," +
270  GetCppTypeid<T3> () +
271  ">";
272  return id;
273  }
274 };
276 template <typename R, typename T1, typename T2, typename T3, typename T4>
277 class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
278 public:
279  virtual ~CallbackImpl () {}
280  virtual R operator() (T1, T2, T3, T4) = 0;
281  virtual std::string GetTypeid (void) const
282  {
283  return DoGetTypeid ();
284  }
285  static std::string DoGetTypeid (void)
286  {
287  static std::string id = "CallbackImpl<" +
288  GetCppTypeid<R> () + "," +
289  GetCppTypeid<T1> () + "," +
290  GetCppTypeid<T2> () + "," +
291  GetCppTypeid<T3> () + "," +
292  GetCppTypeid<T4> () +
293  ">";
294  return id;
295  }
296 };
298 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
299 class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
300 public:
301  virtual ~CallbackImpl () {}
302  virtual R operator() (T1, T2, T3, T4, T5) = 0;
303  virtual std::string GetTypeid (void) const
304  {
305  return DoGetTypeid ();
306  }
307  static std::string DoGetTypeid (void)
308  {
309  static std::string id = "CallbackImpl<" +
310  GetCppTypeid<R> () + "," +
311  GetCppTypeid<T1> () + "," +
312  GetCppTypeid<T2> () + "," +
313  GetCppTypeid<T3> () + "," +
314  GetCppTypeid<T4> () + "," +
315  GetCppTypeid<T5> () +
316  ">";
317  return id;
318  }
319 };
321 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
322 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
323 public:
324  virtual ~CallbackImpl () {}
325  virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
326  virtual std::string GetTypeid (void) const
327  {
328  return DoGetTypeid ();
329  }
330  static std::string DoGetTypeid (void)
331  {
332  static std::string id = "CallbackImpl<" +
333  GetCppTypeid<R> () + "," +
334  GetCppTypeid<T1> () + "," +
335  GetCppTypeid<T2> () + "," +
336  GetCppTypeid<T3> () + "," +
337  GetCppTypeid<T4> () + "," +
338  GetCppTypeid<T5> () + "," +
339  GetCppTypeid<T6> () +
340  ">";
341  return id;
342  }
343 };
345 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
346 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
347 public:
348  virtual ~CallbackImpl () {}
349  virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
350  virtual std::string GetTypeid (void) const
351  {
352  return DoGetTypeid ();
353  }
354  static std::string DoGetTypeid (void)
355  {
356  static std::string id = "CallbackImpl<" +
357  GetCppTypeid<R> () + "," +
358  GetCppTypeid<T1> () + "," +
359  GetCppTypeid<T2> () + "," +
360  GetCppTypeid<T3> () + "," +
361  GetCppTypeid<T4> () + "," +
362  GetCppTypeid<T5> () + "," +
363  GetCppTypeid<T6> () + "," +
364  GetCppTypeid<T7> () +
365  ">";
366  return id;
367  }
368 };
370 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
371 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
372 public:
373  virtual ~CallbackImpl () {}
374  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
375  virtual std::string GetTypeid (void) const
376  {
377  return DoGetTypeid ();
378  }
379  static std::string DoGetTypeid (void)
380  {
381  static std::string id = "CallbackImpl<" +
382  GetCppTypeid<R> () + "," +
383  GetCppTypeid<T1> () + "," +
384  GetCppTypeid<T2> () + "," +
385  GetCppTypeid<T3> () + "," +
386  GetCppTypeid<T4> () + "," +
387  GetCppTypeid<T5> () + "," +
388  GetCppTypeid<T6> () + "," +
389  GetCppTypeid<T7> () + "," +
390  GetCppTypeid<T8> () +
391  ">";
392  return id;
393  }
394 };
396 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
397 class CallbackImpl : public CallbackImplBase {
398 public:
399  virtual ~CallbackImpl () {}
400  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
401  virtual std::string GetTypeid (void) const
402  {
403  return DoGetTypeid ();
404  }
405  static std::string DoGetTypeid (void)
406  {
407  static std::string id = "CallbackImpl<" +
408  GetCppTypeid<R> () + "," +
409  GetCppTypeid<T1> () + "," +
410  GetCppTypeid<T2> () + "," +
411  GetCppTypeid<T3> () + "," +
412  GetCppTypeid<T4> () + "," +
413  GetCppTypeid<T5> () + "," +
414  GetCppTypeid<T6> () + "," +
415  GetCppTypeid<T7> () + "," +
416  GetCppTypeid<T8> () + "," +
417  GetCppTypeid<T9> () +
418  ">";
419  return id;
420  }
421 };
429 template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
430 class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
431 public:
437  FunctorCallbackImpl (T const &functor)
438  : m_functor (functor) {}
439  virtual ~FunctorCallbackImpl () {}
445  R operator() (void) {
446  return m_functor ();
447  }
452  R operator() (T1 a1) {
453  return m_functor (a1);
454  }
460  R operator() (T1 a1,T2 a2) {
461  return m_functor (a1,a2);
462  }
469  R operator() (T1 a1,T2 a2,T3 a3) {
470  return m_functor (a1,a2,a3);
471  }
479  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
480  return m_functor (a1,a2,a3,a4);
481  }
490  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
491  return m_functor (a1,a2,a3,a4,a5);
492  }
502  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
503  return m_functor (a1,a2,a3,a4,a5,a6);
504  }
515  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
516  return m_functor (a1,a2,a3,a4,a5,a6,a7);
517  }
529  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
530  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
531  }
544  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
545  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
546  }
554  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
557  if (otherDerived == 0)
558  {
559  return false;
560  }
561  else if (otherDerived->m_functor != m_functor)
562  {
563  return false;
564  }
565  return true;
566  }
567 private:
569 };
570 
575 template <typename OBJ_PTR, typename MEM_PTR, typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
576 class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
577 public:
584  MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR memPtr)
585  : m_objPtr (objPtr), m_memPtr (memPtr) {}
586  virtual ~MemPtrCallbackImpl () {}
592  R operator() (void) {
594  }
599  R operator() (T1 a1) {
601  }
607  R operator() (T1 a1,T2 a2) {
609  }
616  R operator() (T1 a1,T2 a2,T3 a3) {
617  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3);
618  }
626  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
627  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4);
628  }
637  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
638  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5);
639  }
649  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
650  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6);
651  }
662  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
663  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7);
664  }
676  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
677  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8);
678  }
691  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
692  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
693  }
701  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
704  if (otherDerived == 0)
705  {
706  return false;
707  }
708  else if (otherDerived->m_objPtr != m_objPtr ||
709  otherDerived->m_memPtr != m_memPtr)
710  {
711  return false;
712  }
713  return true;
714  }
715 private:
716  OBJ_PTR const m_objPtr;
717  MEM_PTR m_memPtr;
718 };
719 
724 template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
725 class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
726 public:
732  template <typename FUNCTOR, typename ARG>
733  BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
734  : m_functor (functor), m_a (a) {}
741  R operator() (void) {
742  return m_functor (m_a);
743  }
748  R operator() (T1 a1) {
749  return m_functor (m_a,a1);
750  }
756  R operator() (T1 a1,T2 a2) {
757  return m_functor (m_a,a1,a2);
758  }
765  R operator() (T1 a1,T2 a2,T3 a3) {
766  return m_functor (m_a,a1,a2,a3);
767  }
775  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
776  return m_functor (m_a,a1,a2,a3,a4);
777  }
786  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
787  return m_functor (m_a,a1,a2,a3,a4,a5);
788  }
798  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
799  return m_functor (m_a,a1,a2,a3,a4,a5,a6);
800  }
811  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
812  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
813  }
825  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
826  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
827  }
835  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
838  if (otherDerived == 0)
839  {
840  return false;
841  }
842  else if (otherDerived->m_functor != m_functor ||
843  otherDerived->m_a != m_a)
844  {
845  return false;
846  }
847  return true;
848  }
849 private:
852 };
853 
858 template <typename T, typename R, typename TX1, typename TX2, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
859 class TwoBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> {
860 public:
867  template <typename FUNCTOR, typename ARG1, typename ARG2>
868  TwoBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2)
869  : m_functor (functor), m_a1 (arg1), m_a2 (arg2) {}
876  R operator() (void) {
877  return m_functor (m_a1,m_a2);
878  }
883  R operator() (T1 a1) {
884  return m_functor (m_a1,m_a2,a1);
885  }
891  R operator() (T1 a1,T2 a2) {
892  return m_functor (m_a1,m_a2,a1,a2);
893  }
900  R operator() (T1 a1,T2 a2,T3 a3) {
901  return m_functor (m_a1,m_a2,a1,a2,a3);
902  }
910  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
911  return m_functor (m_a1,m_a2,a1,a2,a3,a4);
912  }
921  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
922  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5);
923  }
933  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
934  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6);
935  }
946  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
947  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6,a7);
948  }
956  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
959  if (otherDerived == 0)
960  {
961  return false;
962  }
963  else if (otherDerived->m_functor != m_functor ||
964  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2)
965  {
966  return false;
967  }
968  return true;
969  }
970 private:
974 };
975 
980 template <typename T, typename R, typename TX1, typename TX2, typename TX3, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
981 class ThreeBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> {
982 public:
990  template <typename FUNCTOR, typename ARG1, typename ARG2, typename ARG3>
991  ThreeBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
992  : m_functor (functor), m_a1 (arg1), m_a2 (arg2), m_a3 (arg3) {}
999  R operator() (void) {
1000  return m_functor (m_a1,m_a2,m_a3);
1001  }
1006  R operator() (T1 a1) {
1007  return m_functor (m_a1,m_a2,m_a3,a1);
1008  }
1014  R operator() (T1 a1,T2 a2) {
1015  return m_functor (m_a1,m_a2,m_a3,a1,a2);
1016  }
1023  R operator() (T1 a1,T2 a2,T3 a3) {
1024  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3);
1025  }
1033  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1034  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4);
1035  }
1044  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1045  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5);
1046  }
1056  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1057  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5,a6);
1058  }
1066  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1069  if (otherDerived == 0)
1070  {
1071  return false;
1072  }
1073  else if (otherDerived->m_functor != m_functor ||
1074  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2 || otherDerived->m_a3 != m_a3)
1075  {
1076  return false;
1077  }
1078  return true;
1079  }
1080 private:
1085 };
1086 
1093 public:
1096  Ptr<CallbackImplBase> GetImpl (void) const { return m_impl; }
1097 protected:
1104 };
1105 
1158 template<typename R,
1159  typename T1 = empty, typename T2 = empty,
1160  typename T3 = empty, typename T4 = empty,
1161  typename T5 = empty, typename T6 = empty,
1162  typename T7 = empty, typename T8 = empty,
1163  typename T9 = empty>
1164 class Callback : public CallbackBase {
1165 public:
1166  Callback () {}
1167 
1177  template <typename FUNCTOR>
1178  Callback (FUNCTOR const &functor, bool, bool)
1179  : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
1180  {}
1181 
1188  template <typename OBJ_PTR, typename MEM_PTR>
1189  Callback (OBJ_PTR const &objPtr, MEM_PTR memPtr)
1190  : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, memPtr))
1191  {}
1192 
1199  : CallbackBase (impl)
1200  {}
1201 
1208  template <typename T>
1214  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
1216  }
1217 
1225  template <typename TX1, typename TX2>
1231  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2), false);
1232  return Callback<R,T3,T4,T5,T6,T7,T8,T9> (impl);
1233  }
1234 
1243  template <typename TX1, typename TX2, typename TX3>
1244  Callback<R,T4,T5,T6,T7,T8,T9> ThreeBind (TX1 a1, TX2 a2, TX3 a3) {
1249  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2, a3), false);
1250  return Callback<R,T4,T5,T6,T7,T8,T9> (impl);
1251  }
1252 
1258  bool IsNull (void) const {
1259  return (DoPeekImpl () == 0) ? true : false;
1260  }
1262  void Nullify (void) {
1263  m_impl = 0;
1264  }
1265 
1271  R operator() (void) const {
1272  return (*(DoPeekImpl ()))();
1273  }
1278  R operator() (T1 a1) const {
1279  return (*(DoPeekImpl ()))(a1);
1280  }
1286  R operator() (T1 a1, T2 a2) const {
1287  return (*(DoPeekImpl ()))(a1,a2);
1288  }
1295  R operator() (T1 a1, T2 a2, T3 a3) const {
1296  return (*(DoPeekImpl ()))(a1,a2,a3);
1297  }
1305  R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
1306  return (*(DoPeekImpl ()))(a1,a2,a3,a4);
1307  }
1316  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
1317  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5);
1318  }
1328  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
1329  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6);
1330  }
1341  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
1342  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7);
1343  }
1355  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
1356  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8);
1357  }
1370  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
1371  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8,a9);
1372  }
1381  bool IsEqual (const CallbackBase &other) const {
1382  return m_impl->IsEqual (other.GetImpl ());
1383  }
1384 
1391  bool CheckType (const CallbackBase & other) const {
1392  return DoCheckType (other.GetImpl ());
1393  }
1399  bool Assign (const CallbackBase &other) {
1400  return DoAssign (other.GetImpl ());
1401  }
1402 private:
1406  }
1414  if (other != 0 &&
1415  dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
1416  {
1417  return true;
1418  }
1419  else if (other == 0)
1420  {
1421  return true;
1422  }
1423  else
1424  {
1425  return false;
1426  }
1427  }
1434  if (!DoCheckType (other))
1435  {
1436  std::string othTid = other->GetTypeid ();
1438  NS_FATAL_ERROR_CONT ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
1439  "got=" << othTid << std::endl <<
1440  "expected=" << myTid);
1441  return false;
1442  }
1443  m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
1444  return true;
1445  }
1446 };
1447 
1448 
1457 template <typename R, typename T1, typename T2,
1458  typename T3, typename T4,
1459  typename T5, typename T6,
1460  typename T7, typename T8,
1461  typename T9>
1463 {
1464  return !a.IsEqual (b);
1465 }
1466 
1479 template <typename T, typename OBJ, typename R>
1480 Callback<R> MakeCallback (R (T::*memPtr)(void), OBJ objPtr) {
1481  return Callback<R> (objPtr, memPtr);
1482 }
1483 template <typename T, typename OBJ, typename R>
1484 Callback<R> MakeCallback (R (T::*memPtr)() const, OBJ objPtr) {
1485  return Callback<R> (objPtr, memPtr);
1486 }
1487 template <typename T, typename OBJ, typename R, typename T1>
1488 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1), OBJ objPtr) {
1489  return Callback<R,T1> (objPtr, memPtr);
1490 }
1491 template <typename T, typename OBJ, typename R, typename T1>
1492 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1) const, OBJ objPtr) {
1493  return Callback<R,T1> (objPtr, memPtr);
1494 }
1495 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1496 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2), OBJ objPtr) {
1497  return Callback<R,T1,T2> (objPtr, memPtr);
1498 }
1499 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1500 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2) const, OBJ objPtr) {
1501  return Callback<R,T1,T2> (objPtr, memPtr);
1502 }
1503 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1504 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3), OBJ objPtr) {
1505  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1506 }
1507 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1508 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3) const, OBJ objPtr) {
1509  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1510 }
1511 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1512 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4), OBJ objPtr) {
1513  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1514 }
1515 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1516 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4) const, OBJ objPtr) {
1517  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1518 }
1519 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1520 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5), OBJ objPtr) {
1521  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1522 }
1523 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1524 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5) const, OBJ objPtr) {
1525  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1526 }
1527 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
1528 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6), OBJ objPtr) {
1529  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1530 }
1531 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
1532 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
1533  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1534 }
1535 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
1536 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
1537  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1538 }
1539 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
1540 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
1541  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1542 }
1543 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
1544 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
1545  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1546 }
1547 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1548 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8) const, OBJ objPtr) {
1549  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1550 }
1551 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1552 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8,T9), OBJ objPtr) {
1553  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1554 }
1555 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
1556 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8,T9) const, OBJ objPtr) {
1557  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1558 }
1572 template <typename R>
1573 Callback<R> MakeCallback (R (*fnPtr)()) {
1574  return Callback<R> (fnPtr, true, true);
1575 }
1576 template <typename R, typename T1>
1577 Callback<R,T1> MakeCallback (R (*fnPtr)(T1)) {
1578  return Callback<R,T1> (fnPtr, true, true);
1579 }
1580 template <typename R, typename T1, typename T2>
1581 Callback<R,T1,T2> MakeCallback (R (*fnPtr)(T1,T2)) {
1582  return Callback<R,T1,T2> (fnPtr, true, true);
1583 }
1584 template <typename R, typename T1, typename T2,typename T3>
1585 Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr)(T1,T2,T3)) {
1586  return Callback<R,T1,T2,T3> (fnPtr, true, true);
1587 }
1588 template <typename R, typename T1, typename T2,typename T3,typename T4>
1589 Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr)(T1,T2,T3,T4)) {
1590  return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
1591 }
1592 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1593 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5)) {
1594  return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
1595 }
1596 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1597 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6)) {
1598  return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
1599 }
1600 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1601 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7)) {
1602  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
1603 }
1604 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1605 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8)) {
1606  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
1607 }
1608 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1609 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
1610  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
1611 }
1625 template <typename R>
1627  return Callback<R> ();
1628 }
1629 template <typename R, typename T1>
1631  return Callback<R,T1> ();
1632 }
1633 template <typename R, typename T1, typename T2>
1635  return Callback<R,T1,T2> ();
1636 }
1637 template <typename R, typename T1, typename T2,typename T3>
1639  return Callback<R,T1,T2,T3> ();
1640 }
1641 template <typename R, typename T1, typename T2,typename T3,typename T4>
1643  return Callback<R,T1,T2,T3,T4> ();
1644 }
1645 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1647  return Callback<R,T1,T2,T3,T4,T5> ();
1648 }
1649 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1652 }
1653 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1656 }
1657 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1660 }
1661 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1664 }
1676 template <typename R, typename TX, typename ARG>
1677 Callback<R> MakeBoundCallback (R (*fnPtr)(TX), ARG a1) {
1679  Create<BoundFunctorCallbackImpl<R (*)(TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1);
1680  return Callback<R> (impl);
1681 }
1682 template <typename R, typename TX, typename ARG,
1683  typename T1>
1684 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX,T1), ARG a1) {
1686  Create<BoundFunctorCallbackImpl<R (*)(TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1687  return Callback<R,T1> (impl);
1688 }
1689 template <typename R, typename TX, typename ARG,
1690  typename T1, typename T2>
1691 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX,T1,T2), ARG a1) {
1693  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1694  return Callback<R,T1,T2> (impl);
1695 }
1696 template <typename R, typename TX, typename ARG,
1697  typename T1, typename T2,typename T3>
1698 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3), ARG a1) {
1700  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a1);
1701  return Callback<R,T1,T2,T3> (impl);
1702 }
1703 template <typename R, typename TX, typename ARG,
1704  typename T1, typename T2,typename T3,typename T4>
1705 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4), ARG a1) {
1707  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a1);
1708  return Callback<R,T1,T2,T3,T4> (impl);
1709 }
1710 template <typename R, typename TX, typename ARG,
1711  typename T1, typename T2,typename T3,typename T4,typename T5>
1712 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5), ARG a1) {
1714  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a1);
1715  return Callback<R,T1,T2,T3,T4,T5> (impl);
1716 }
1717 template <typename R, typename TX, typename ARG,
1718  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1719 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6), ARG a1) {
1721  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a1);
1722  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1723 }
1724 template <typename R, typename TX, typename ARG,
1725  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1726 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7), ARG a1) {
1728  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a1);
1729  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1730 }
1731 template <typename R, typename TX, typename ARG,
1732  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
1733 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a1) {
1735  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a1);
1737 }
1749 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2>
1750 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2), ARG1 a1, ARG2 a2) {
1752  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2),R,TX1,TX2,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2);
1753  return Callback<R> (impl);
1754 }
1755 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1756  typename T1>
1757 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1), ARG1 a1, ARG2 a2) {
1759  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1),R,TX1,TX2,T1,empty,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1760  return Callback<R,T1> (impl);
1761 }
1762 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1763  typename T1, typename T2>
1764 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2), ARG1 a1, ARG2 a2) {
1766  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2),R,TX1,TX2,T1,T2,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1767  return Callback<R,T1,T2> (impl);
1768 }
1769 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1770  typename T1, typename T2,typename T3>
1771 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3), ARG1 a1, ARG2 a2) {
1773  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3),R,TX1,TX2,T1,T2,T3,empty,empty,empty,empty> > (fnPtr, a1, a2);
1774  return Callback<R,T1,T2,T3> (impl);
1775 }
1776 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1777  typename T1, typename T2,typename T3,typename T4>
1778 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4), ARG1 a1, ARG2 a2) {
1780  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4),R,TX1,TX2,T1,T2,T3,T4,empty,empty,empty> > (fnPtr, a1, a2);
1781  return Callback<R,T1,T2,T3,T4> (impl);
1782 }
1783 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1784  typename T1, typename T2,typename T3,typename T4,typename T5>
1785 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2) {
1787  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5),R,TX1,TX2,T1,T2,T3,T4,T5,empty,empty> > (fnPtr, a1, a2);
1788  return Callback<R,T1,T2,T3,T4,T5> (impl);
1789 }
1790 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1791  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1792 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5,T6), ARG1 a1, ARG2 a2) {
1794  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5,T6),R,TX1,TX2,T1,T2,T3,T4,T5,T6,empty> > (fnPtr, a1, a2);
1795  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1796 }
1797 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1798  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1799 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5,T6,T7), ARG1 a1, ARG2 a2) {
1801  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5,T6,T7),R,TX1,TX2,T1,T2,T3,T4,T5,T6,T7> > (fnPtr, a1, a2);
1802  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1803 }
1816 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3>
1817 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3), ARG1 a1, ARG2 a2, ARG3 a3) {
1819  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3),R,TX1,TX2,TX3,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2, a3);
1820  return Callback<R> (impl);
1821 }
1822 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1823  typename T1>
1824 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1), ARG1 a1, ARG2 a2, ARG3 a3) {
1826  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1),R,TX1,TX2,TX3,T1,empty,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1827  return Callback<R,T1> (impl);
1828 }
1829 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1830  typename T1, typename T2>
1831 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2), ARG1 a1, ARG2 a2, ARG3 a3) {
1833  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2),R,TX1,TX2,TX3,T1,T2,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1834  return Callback<R,T1,T2> (impl);
1835 }
1836 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1837  typename T1, typename T2,typename T3>
1838 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3), ARG1 a1, ARG2 a2, ARG3 a3) {
1840  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3),R,TX1,TX2,TX3,T1,T2,T3,empty,empty,empty> > (fnPtr, a1, a2, a3);
1841  return Callback<R,T1,T2,T3> (impl);
1842 }
1843 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1844  typename T1, typename T2,typename T3,typename T4>
1845 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4), ARG1 a1, ARG2 a2, ARG3 a3) {
1847  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3,T4),R,TX1,TX2,TX3,T1,T2,T3,T4,empty,empty> > (fnPtr, a1, a2, a3);
1848  return Callback<R,T1,T2,T3,T4> (impl);
1849 }
1850 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1851  typename T1, typename T2,typename T3,typename T4,typename T5>
1852 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2, ARG3 a3) {
1854  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3,T4,T5),R,TX1,TX2,TX3,T1,T2,T3,T4,T5,empty> > (fnPtr, a1, a2, a3);
1855  return Callback<R,T1,T2,T3,T4,T5> (impl);
1856 }
1857 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1858  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1859 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4,T5,T6), ARG1 a1, ARG2 a2, ARG3 a3) {
1861  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3,T4,T5,T6),R,TX1,TX2,TX3,T1,T2,T3,T4,T5,T6> > (fnPtr, a1, a2, a3);
1862  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1863 }
1867 } // namespace ns3
1868 
1869 namespace ns3 {
1870 
1872 {
1873 public:
1875  CallbackValue ();
1880  CallbackValue (const CallbackBase &base);
1882  virtual ~CallbackValue ();
1884  void Set (CallbackBase base);
1891  template <typename T>
1892  bool GetAccessor (T &value) const;
1894  virtual Ptr<AttributeValue> Copy (void) const;
1900  virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
1908  virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
1909 private:
1911 };
1912 
1915 
1916 } // namespace ns3
1917 
1918 namespace ns3 {
1919 
1920 template <typename T>
1921 bool CallbackValue::GetAccessor (T &value) const
1922 {
1923  if (value.CheckType (m_value))
1924  {
1925  if (!value.Assign (m_value))
1927  return true;
1928  }
1929  return false;
1930 }
1931 
1932 } // namespace ns3
1933 
1934 
1935 #endif /* CALLBACK_H */
NS_FATAL_x macro definitions.
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:203
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:303
CallbackValue()
Constructor.
Definition: callback.cc:34
static std::string GetCppTypeid(void)
Helper to get the C++ typeid as a string.
Definition: callback.h:168
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
#define NS_FATAL_ERROR_CONT(msg)
Report a fatal error with a message, deferring termination.
Definition: fatal-error.h:161
virtual ~MemPtrCallbackImpl()
Definition: callback.h:586
Callback template class.
Definition: callback.h:1164
virtual ~BoundFunctorCallbackImpl()
Definition: callback.h:735
virtual ~FunctorCallbackImpl()
Definition: callback.h:439
Smart pointer implementation.
Hold a value for an Attribute.
Definition: attribute.h:68
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const =0
Equality test.
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1677
Callback< R, T3, T4, T5, T6, T7, T8, T9 > TwoBind(TX1 a1, TX2 a2)
Bind the first two arguments.
Definition: callback.h:1226
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1258
U * PeekPointer(const Ptr< U > &p)
Definition: ptr.h:562
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:741
Callback< R, T2, T3, T4, T5, T6, T7, T8, T9 > Bind(T a)
Bind the first arguments.
Definition: callback.h:1209
Base class for Callback class.
Definition: callback.h:1092
MemPtrCallbackImpl(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct from an object pointer and member function pointer.
Definition: callback.h:584
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:375
virtual ~CallbackValue()
Destructor.
Definition: callback.cc:43
bool Assign(const CallbackBase &other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1399
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:240
Callback< R > MakeNullCallback(void)
Definition: callback.h:1626
CallbackBase m_value
the CallbackBase
Definition: callback.h:1910
bool GetAccessor(T &value) const
Give value my callback, if type compatible.
Definition: callback.h:1921
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:221
CallbackImpl for functors with first three arguments bound at construction.
Definition: callback.h:981
bool DoAssign(Ptr< const CallbackImplBase > other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1433
static std::string Demangle(const std::string &mangled)
AttributeValue implementation for Callback.
Definition: callback.h:1871
The unqualified CallbackImpl class.
Definition: callback.h:189
#define ATTRIBUTE_CHECKER_DEFINE(type)
Declare the AttributeChecker class Checker and the MakeTypeChecker function for class type...
virtual std::string GetTypeid(void) const =0
Get the type as a string.
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:445
TypeTraits< TX >::ReferencedType m_a
the bound argument
Definition: callback.h:851
make Callback use a separate empty type
Definition: empty.h:33
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:592
bool CheckType(const CallbackBase &other) const
Check for compatible types.
Definition: callback.h:1391
FunctorCallbackImpl(T const &functor)
Construct from a functor.
Definition: callback.h:437
Trait class to convert a pointer into a reference, used by MemPtrCallBackImpl.
Definition: callback.h:113
BoundFunctorCallbackImpl(FUNCTOR functor, ARG a)
Construct from functor and a bound argument.
Definition: callback.h:733
OBJ_PTR const m_objPtr
the object pointer
Definition: callback.h:716
ns3::AttributeValue, ns3::AttributeAccessor and ns3::AttributeChecker declarations.
MEM_PTR m_memPtr
the member function pointer
Definition: callback.h:717
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:956
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:835
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1480
CallbackImpl for pointer to member functions.
Definition: callback.h:576
Callback< R, T4, T5, T6, T7, T8, T9 > ThreeBind(TX1 a1, TX2 a2, TX3 a3)
Bind the first three arguments.
Definition: callback.h:1244
bool DoCheckType(Ptr< const CallbackImplBase > other) const
Check for compatible types.
Definition: callback.h:1413
Abstract base class for CallbackImpl Provides reference counting and equality test.
Definition: callback.h:139
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:326
CallbackImpl for functors with first two arguments bound at construction.
Definition: callback.h:859
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:701
Callback(Ptr< CallbackImpl< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > > const &impl)
Construct from a CallbackImpl pointer.
Definition: callback.h:1198
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:281
R operator()(void) const
Functor with varying numbers of arguments.
Definition: callback.h:1271
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:401
TypeTraits< TX3 >::ReferencedType m_a3
third bound argument
Definition: callback.h:1084
bool operator!=(Callback< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > a, Callback< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > b)
Inequality test.
Definition: callback.h:1462
virtual ~CallbackImplBase()
Virtual destructor.
Definition: callback.h:143
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsEqual(const CallbackBase &other) const
Equality test.
Definition: callback.h:1381
static std::string DoGetTypeid(void)
Definition: callback.h:405
#define NS_FATAL_ERROR_NO_MSG()
Report a fatal error and terminate.
Definition: fatal-error.h:108
Ptr< T > Create(void)
Create class instances by constructors with varying numbers of arguments and return them by Ptr...
Definition: ptr.h:514
static T & GetReference(T *const p)
Definition: callback.h:128
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:1082
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:350
Callback(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct a member function pointer call back.
Definition: callback.h:1189
Declaration of Attribute helper macros.
T m_functor
the functor
Definition: callback.h:568
#define ATTRIBUTE_ACCESSOR_DEFINE(type)
Define the attribute accessor functions MakeTypeAccessor for class type.
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:876
virtual ~CallbackImpl()
Definition: callback.h:399
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:972
virtual std::string GetTypeid(void) const
Get the type as a string.
Definition: callback.h:260
Callback(FUNCTOR const &functor, bool, bool)
Construct a functor call back, supporting operator() calls.
Definition: callback.h:1178
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:554
CallbackImpl for functors with first argument bound at construction.
Definition: callback.h:725
TwoBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2)
Construct from functor and two arguments.
Definition: callback.h:868
CallbackImpl with functors.
Definition: callback.h:430
virtual bool DeserializeFromString(std::string value, Ptr< const AttributeChecker > checker)
Deserialize from string (not implemented)
Definition: callback.cc:69
virtual R operator()(T1, T2, T3, T4, T5, T6, T7, T8, T9)=0
Abstract operator.
Inspect a type to deduce its features.
Definition: type-traits.h:37
virtual std::string SerializeToString(Ptr< const AttributeChecker > checker) const
Serialize to string.
Definition: callback.cc:61
T m_functor
The functor.
Definition: callback.h:850
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:1066
void Nullify(void)
Discard the implementation, set it to null.
Definition: callback.h:1262
Definition of class ns3::empty, used by callbacks.
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:1083
CallbackBase(Ptr< CallbackImplBase > impl)
Construct from a pimpl.
Definition: callback.h:1102
A template-based reference counting class.
virtual Ptr< AttributeValue > Copy(void) const
Definition: callback.cc:55
CallbackImpl< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > * DoPeekImpl(void) const
Definition: callback.h:1404
Ptr< CallbackImplBase > m_impl
the pimpl
Definition: callback.h:1103
void Set(CallbackBase base)
Definition: callback.cc:48
Reference counting for smart pointers.
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:973
Ptr< CallbackImplBase > GetImpl(void) const
Definition: callback.h:1096
TypeTraits introspection template.
ThreeBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
Construct from functor and three arguments.
Definition: callback.h:991
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:999