A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
33 namespace ns3 {
34 
47 template <typename T>
49 
54 template <typename T>
55 struct CallbackTraits<T *>
56 {
61  static T & GetReference (T * const p)
62  {
63  return *p;
64  }
65 };
78 class CallbackImplBase : public SimpleRefCount<CallbackImplBase>
79 {
80 public:
82  virtual ~CallbackImplBase () {}
89  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
90 };
91 
96 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
98 
105 template <typename R>
107 public:
108  virtual ~CallbackImpl () {}
109  virtual R operator() (void) = 0;
110 };
112 template <typename R, typename T1>
114 public:
115  virtual ~CallbackImpl () {}
116  virtual R operator() (T1) = 0;
117 };
119 template <typename R, typename T1, typename T2>
121 public:
122  virtual ~CallbackImpl () {}
123  virtual R operator() (T1, T2) = 0;
124 };
126 template <typename R, typename T1, typename T2, typename T3>
128 public:
129  virtual ~CallbackImpl () {}
130  virtual R operator() (T1, T2, T3) = 0;
131 };
133 template <typename R, typename T1, typename T2, typename T3, typename T4>
134 class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
135 public:
136  virtual ~CallbackImpl () {}
137  virtual R operator() (T1, T2, T3, T4) = 0;
138 };
140 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
141 class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
142 public:
143  virtual ~CallbackImpl () {}
144  virtual R operator() (T1, T2, T3, T4, T5) = 0;
145 };
147 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
148 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
149 public:
150  virtual ~CallbackImpl () {}
151  virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
152 };
154 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
155 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
156 public:
157  virtual ~CallbackImpl () {}
158  virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
159 };
161 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
162 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
163 public:
164  virtual ~CallbackImpl () {}
165  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
166 };
168 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
169 class CallbackImpl : public CallbackImplBase {
170 public:
171  virtual ~CallbackImpl () {}
172  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
173 };
181 template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
182 class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
183 public:
189  FunctorCallbackImpl (T const &functor)
190  : m_functor (functor) {}
191  virtual ~FunctorCallbackImpl () {}
197  R operator() (void) {
198  return m_functor ();
199  }
204  R operator() (T1 a1) {
205  return m_functor (a1);
206  }
212  R operator() (T1 a1,T2 a2) {
213  return m_functor (a1,a2);
214  }
221  R operator() (T1 a1,T2 a2,T3 a3) {
222  return m_functor (a1,a2,a3);
223  }
231  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
232  return m_functor (a1,a2,a3,a4);
233  }
242  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
243  return m_functor (a1,a2,a3,a4,a5);
244  }
254  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
255  return m_functor (a1,a2,a3,a4,a5,a6);
256  }
267  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
268  return m_functor (a1,a2,a3,a4,a5,a6,a7);
269  }
281  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
282  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
283  }
296  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
297  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
298  }
306  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
309  if (otherDerived == 0)
310  {
311  return false;
312  }
313  else if (otherDerived->m_functor != m_functor)
314  {
315  return false;
316  }
317  return true;
318  }
319 private:
321 };
322 
327 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>
328 class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
329 public:
336  MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR memPtr)
337  : m_objPtr (objPtr), m_memPtr (memPtr) {}
338  virtual ~MemPtrCallbackImpl () {}
344  R operator() (void) {
346  }
351  R operator() (T1 a1) {
353  }
359  R operator() (T1 a1,T2 a2) {
361  }
368  R operator() (T1 a1,T2 a2,T3 a3) {
369  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3);
370  }
378  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
379  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4);
380  }
389  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
390  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5);
391  }
401  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
402  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6);
403  }
414  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
415  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7);
416  }
428  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
429  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8);
430  }
443  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
444  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
445  }
453  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
456  if (otherDerived == 0)
457  {
458  return false;
459  }
460  else if (otherDerived->m_objPtr != m_objPtr ||
461  otherDerived->m_memPtr != m_memPtr)
462  {
463  return false;
464  }
465  return true;
466  }
467 private:
468  OBJ_PTR const m_objPtr;
469  MEM_PTR m_memPtr;
470 };
471 
476 template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
477 class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
478 public:
484  template <typename FUNCTOR, typename ARG>
485  BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
486  : m_functor (functor), m_a (a) {}
493  R operator() (void) {
494  return m_functor (m_a);
495  }
500  R operator() (T1 a1) {
501  return m_functor (m_a,a1);
502  }
508  R operator() (T1 a1,T2 a2) {
509  return m_functor (m_a,a1,a2);
510  }
517  R operator() (T1 a1,T2 a2,T3 a3) {
518  return m_functor (m_a,a1,a2,a3);
519  }
527  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
528  return m_functor (m_a,a1,a2,a3,a4);
529  }
538  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
539  return m_functor (m_a,a1,a2,a3,a4,a5);
540  }
550  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
551  return m_functor (m_a,a1,a2,a3,a4,a5,a6);
552  }
563  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
564  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
565  }
577  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
578  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
579  }
587  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
590  if (otherDerived == 0)
591  {
592  return false;
593  }
594  else if (otherDerived->m_functor != m_functor ||
595  otherDerived->m_a != m_a)
596  {
597  return false;
598  }
599  return true;
600  }
601 private:
604 };
605 
610 template <typename T, typename R, typename TX1, typename TX2, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
611 class TwoBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> {
612 public:
619  template <typename FUNCTOR, typename ARG1, typename ARG2>
620  TwoBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2)
621  : m_functor (functor), m_a1 (arg1), m_a2 (arg2) {}
628  R operator() (void) {
629  return m_functor (m_a1,m_a2);
630  }
635  R operator() (T1 a1) {
636  return m_functor (m_a1,m_a2,a1);
637  }
643  R operator() (T1 a1,T2 a2) {
644  return m_functor (m_a1,m_a2,a1,a2);
645  }
652  R operator() (T1 a1,T2 a2,T3 a3) {
653  return m_functor (m_a1,m_a2,a1,a2,a3);
654  }
662  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
663  return m_functor (m_a1,m_a2,a1,a2,a3,a4);
664  }
673  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
674  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5);
675  }
685  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
686  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6);
687  }
698  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
699  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6,a7);
700  }
708  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
711  if (otherDerived == 0)
712  {
713  return false;
714  }
715  else if (otherDerived->m_functor != m_functor ||
716  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2)
717  {
718  return false;
719  }
720  return true;
721  }
722 private:
726 };
727 
732 template <typename T, typename R, typename TX1, typename TX2, typename TX3, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
733 class ThreeBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> {
734 public:
742  template <typename FUNCTOR, typename ARG1, typename ARG2, typename ARG3>
743  ThreeBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
744  : m_functor (functor), m_a1 (arg1), m_a2 (arg2), m_a3 (arg3) {}
751  R operator() (void) {
752  return m_functor (m_a1,m_a2,m_a3);
753  }
758  R operator() (T1 a1) {
759  return m_functor (m_a1,m_a2,m_a3,a1);
760  }
766  R operator() (T1 a1,T2 a2) {
767  return m_functor (m_a1,m_a2,m_a3,a1,a2);
768  }
775  R operator() (T1 a1,T2 a2,T3 a3) {
776  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3);
777  }
785  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
786  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4);
787  }
796  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
797  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5);
798  }
808  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
809  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5,a6);
810  }
818  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
821  if (otherDerived == 0)
822  {
823  return false;
824  }
825  else if (otherDerived->m_functor != m_functor ||
826  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2 || otherDerived->m_a3 != m_a3)
827  {
828  return false;
829  }
830  return true;
831  }
832 private:
837 };
838 
845 public:
846  CallbackBase () : m_impl () {}
848  Ptr<CallbackImplBase> GetImpl (void) const { return m_impl; }
849 protected:
856 
861  static std::string Demangle (const std::string& mangled);
862 };
863 
914 template<typename R,
915  typename T1 = empty, typename T2 = empty,
916  typename T3 = empty, typename T4 = empty,
917  typename T5 = empty, typename T6 = empty,
918  typename T7 = empty, typename T8 = empty,
919  typename T9 = empty>
920 class Callback : public CallbackBase {
921 public:
922  Callback () {}
923 
933  template <typename FUNCTOR>
934  Callback (FUNCTOR const &functor, bool, bool)
935  : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
936  {}
937 
944  template <typename OBJ_PTR, typename MEM_PTR>
945  Callback (OBJ_PTR const &objPtr, MEM_PTR memPtr)
946  : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, memPtr))
947  {}
948 
955  : CallbackBase (impl)
956  {}
957 
964  template <typename T>
970  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
972  }
973 
981  template <typename TX1, typename TX2>
987  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2), false);
988  return Callback<R,T3,T4,T5,T6,T7,T8,T9> (impl);
989  }
990 
999  template <typename TX1, typename TX2, typename TX3>
1000  Callback<R,T4,T5,T6,T7,T8,T9> ThreeBind (TX1 a1, TX2 a2, TX3 a3) {
1005  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2, a3), false);
1006  return Callback<R,T4,T5,T6,T7,T8,T9> (impl);
1007  }
1008 
1014  bool IsNull (void) const {
1015  return (DoPeekImpl () == 0) ? true : false;
1016  }
1018  void Nullify (void) {
1019  m_impl = 0;
1020  }
1021 
1027  R operator() (void) const {
1028  return (*(DoPeekImpl ()))();
1029  }
1034  R operator() (T1 a1) const {
1035  return (*(DoPeekImpl ()))(a1);
1036  }
1042  R operator() (T1 a1, T2 a2) const {
1043  return (*(DoPeekImpl ()))(a1,a2);
1044  }
1051  R operator() (T1 a1, T2 a2, T3 a3) const {
1052  return (*(DoPeekImpl ()))(a1,a2,a3);
1053  }
1061  R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
1062  return (*(DoPeekImpl ()))(a1,a2,a3,a4);
1063  }
1072  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
1073  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5);
1074  }
1084  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
1085  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6);
1086  }
1097  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
1098  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7);
1099  }
1111  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
1112  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8);
1113  }
1126  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
1127  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8,a9);
1128  }
1137  bool IsEqual (const CallbackBase &other) const {
1138  return m_impl->IsEqual (other.GetImpl ());
1139  }
1140 
1147  bool CheckType (const CallbackBase & other) const {
1148  return DoCheckType (other.GetImpl ());
1149  }
1155  void Assign (const CallbackBase &other) {
1156  DoAssign (other.GetImpl ());
1157  }
1158 private:
1162  }
1170  if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
1171  {
1172  return true;
1173  }
1174  else if (other == 0)
1175  {
1176  return true;
1177  }
1178  else
1179  {
1180  return false;
1181  }
1182  }
1189  if (!DoCheckType (other))
1190  {
1191  NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
1192  "got=" << Demangle ( typeid (*other).name () ) << std::endl <<
1193  "expected=" << Demangle ( typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name () ));
1194  }
1195  m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
1196  }
1197 };
1198 
1199 
1208 template <typename R, typename T1, typename T2,
1209  typename T3, typename T4,
1210  typename T5, typename T6,
1211  typename T7, typename T8,
1212  typename T9>
1214 {
1215  return !a.IsEqual (b);
1216 }
1217 
1237 template <typename T, typename OBJ, typename R>
1238 Callback<R> MakeCallback (R (T::*memPtr)(void), OBJ objPtr) {
1239  return Callback<R> (objPtr, memPtr);
1240 }
1241 template <typename T, typename OBJ, typename R>
1242 Callback<R> MakeCallback (R (T::*memPtr)() const, OBJ objPtr) {
1243  return Callback<R> (objPtr, memPtr);
1244 }
1245 template <typename T, typename OBJ, typename R, typename T1>
1246 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1), OBJ objPtr) {
1247  return Callback<R,T1> (objPtr, memPtr);
1248 }
1249 template <typename T, typename OBJ, typename R, typename T1>
1250 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1) const, OBJ objPtr) {
1251  return Callback<R,T1> (objPtr, memPtr);
1252 }
1253 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1254 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2), OBJ objPtr) {
1255  return Callback<R,T1,T2> (objPtr, memPtr);
1256 }
1257 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1258 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2) const, OBJ objPtr) {
1259  return Callback<R,T1,T2> (objPtr, memPtr);
1260 }
1261 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1262 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3), OBJ objPtr) {
1263  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1264 }
1265 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1266 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3) const, OBJ objPtr) {
1267  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1268 }
1269 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1270 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4), OBJ objPtr) {
1271  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1272 }
1273 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1274 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4) const, OBJ objPtr) {
1275  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1276 }
1277 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1278 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5), OBJ objPtr) {
1279  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1280 }
1281 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1282 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5) const, OBJ objPtr) {
1283  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1284 }
1285 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
1286 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6), OBJ objPtr) {
1287  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1288 }
1289 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
1290 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
1291  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1292 }
1293 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
1294 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
1295  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1296 }
1297 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
1298 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
1299  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1300 }
1301 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
1302 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
1303  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1304 }
1305 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1306 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) {
1307  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1308 }
1309 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>
1310 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) {
1311  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1312 }
1313 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>
1314 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) {
1315  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1316 }
1337 template <typename R>
1338 Callback<R> MakeCallback (R (*fnPtr)()) {
1339  return Callback<R> (fnPtr, true, true);
1340 }
1341 template <typename R, typename T1>
1342 Callback<R,T1> MakeCallback (R (*fnPtr)(T1)) {
1343  return Callback<R,T1> (fnPtr, true, true);
1344 }
1345 template <typename R, typename T1, typename T2>
1346 Callback<R,T1,T2> MakeCallback (R (*fnPtr)(T1,T2)) {
1347  return Callback<R,T1,T2> (fnPtr, true, true);
1348 }
1349 template <typename R, typename T1, typename T2,typename T3>
1350 Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr)(T1,T2,T3)) {
1351  return Callback<R,T1,T2,T3> (fnPtr, true, true);
1352 }
1353 template <typename R, typename T1, typename T2,typename T3,typename T4>
1354 Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr)(T1,T2,T3,T4)) {
1355  return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
1356 }
1357 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1358 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5)) {
1359  return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
1360 }
1361 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1362 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6)) {
1363  return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
1364 }
1365 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1366 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7)) {
1367  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
1368 }
1369 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1370 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8)) {
1371  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
1372 }
1373 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1374 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
1375  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
1376 }
1394 template <typename R>
1396  return Callback<R> ();
1397 }
1398 template <typename R, typename T1>
1400  return Callback<R,T1> ();
1401 }
1402 template <typename R, typename T1, typename T2>
1404  return Callback<R,T1,T2> ();
1405 }
1406 template <typename R, typename T1, typename T2,typename T3>
1408  return Callback<R,T1,T2,T3> ();
1409 }
1410 template <typename R, typename T1, typename T2,typename T3,typename T4>
1412  return Callback<R,T1,T2,T3,T4> ();
1413 }
1414 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1416  return Callback<R,T1,T2,T3,T4,T5> ();
1417 }
1418 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1421 }
1422 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1425 }
1426 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1429 }
1430 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1433 }
1462 template <typename R, typename TX, typename ARG>
1463 Callback<R> MakeBoundCallback (R (*fnPtr)(TX), ARG a1) {
1465  Create<BoundFunctorCallbackImpl<R (*)(TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1);
1466  return Callback<R> (impl);
1467 }
1468 template <typename R, typename TX, typename ARG,
1469  typename T1>
1470 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX,T1), ARG a1) {
1472  Create<BoundFunctorCallbackImpl<R (*)(TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1473  return Callback<R,T1> (impl);
1474 }
1475 template <typename R, typename TX, typename ARG,
1476  typename T1, typename T2>
1477 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX,T1,T2), ARG a1) {
1479  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1480  return Callback<R,T1,T2> (impl);
1481 }
1482 template <typename R, typename TX, typename ARG,
1483  typename T1, typename T2,typename T3>
1484 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3), ARG a1) {
1486  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a1);
1487  return Callback<R,T1,T2,T3> (impl);
1488 }
1489 template <typename R, typename TX, typename ARG,
1490  typename T1, typename T2,typename T3,typename T4>
1491 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4), ARG a1) {
1493  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a1);
1494  return Callback<R,T1,T2,T3,T4> (impl);
1495 }
1496 template <typename R, typename TX, typename ARG,
1497  typename T1, typename T2,typename T3,typename T4,typename T5>
1498 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5), ARG a1) {
1500  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a1);
1501  return Callback<R,T1,T2,T3,T4,T5> (impl);
1502 }
1503 template <typename R, typename TX, typename ARG,
1504  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1505 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6), ARG a1) {
1507  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a1);
1508  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1509 }
1510 template <typename R, typename TX, typename ARG,
1511  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1512 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7), ARG a1) {
1514  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a1);
1515  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1516 }
1517 template <typename R, typename TX, typename ARG,
1518  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
1519 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a1) {
1521  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a1);
1523 }
1533 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2>
1534 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2), ARG1 a1, ARG2 a2) {
1536  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2),R,TX1,TX2,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2);
1537  return Callback<R> (impl);
1538 }
1539 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1540  typename T1>
1541 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1), ARG1 a1, ARG2 a2) {
1543  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1),R,TX1,TX2,T1,empty,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1544  return Callback<R,T1> (impl);
1545 }
1546 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1547  typename T1, typename T2>
1548 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2), ARG1 a1, ARG2 a2) {
1550  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2),R,TX1,TX2,T1,T2,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1551  return Callback<R,T1,T2> (impl);
1552 }
1553 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1554  typename T1, typename T2,typename T3>
1555 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3), ARG1 a1, ARG2 a2) {
1557  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3),R,TX1,TX2,T1,T2,T3,empty,empty,empty,empty> > (fnPtr, a1, a2);
1558  return Callback<R,T1,T2,T3> (impl);
1559 }
1560 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1561  typename T1, typename T2,typename T3,typename T4>
1562 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4), ARG1 a1, ARG2 a2) {
1564  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4),R,TX1,TX2,T1,T2,T3,T4,empty,empty,empty> > (fnPtr, a1, a2);
1565  return Callback<R,T1,T2,T3,T4> (impl);
1566 }
1567 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1568  typename T1, typename T2,typename T3,typename T4,typename T5>
1569 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2) {
1571  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5),R,TX1,TX2,T1,T2,T3,T4,T5,empty,empty> > (fnPtr, a1, a2);
1572  return Callback<R,T1,T2,T3,T4,T5> (impl);
1573 }
1574 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1575  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1576 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5,T6), ARG1 a1, ARG2 a2) {
1578  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5,T6),R,TX1,TX2,T1,T2,T3,T4,T5,T6,empty> > (fnPtr, a1, a2);
1579  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1580 }
1581 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1582  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1583 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) {
1585  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);
1586  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1587 }
1598 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3>
1599 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3), ARG1 a1, ARG2 a2, ARG3 a3) {
1601  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3),R,TX1,TX2,TX3,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2, a3);
1602  return Callback<R> (impl);
1603 }
1604 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1605  typename T1>
1606 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1), ARG1 a1, ARG2 a2, ARG3 a3) {
1608  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1),R,TX1,TX2,TX3,T1,empty,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1609  return Callback<R,T1> (impl);
1610 }
1611 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1612  typename T1, typename T2>
1613 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2), ARG1 a1, ARG2 a2, ARG3 a3) {
1615  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2),R,TX1,TX2,TX3,T1,T2,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1616  return Callback<R,T1,T2> (impl);
1617 }
1618 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1619  typename T1, typename T2,typename T3>
1620 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3), ARG1 a1, ARG2 a2, ARG3 a3) {
1622  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3),R,TX1,TX2,TX3,T1,T2,T3,empty,empty,empty> > (fnPtr, a1, a2, a3);
1623  return Callback<R,T1,T2,T3> (impl);
1624 }
1625 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1626  typename T1, typename T2,typename T3,typename T4>
1627 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4), ARG1 a1, ARG2 a2, ARG3 a3) {
1629  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3,T4),R,TX1,TX2,TX3,T1,T2,T3,T4,empty,empty> > (fnPtr, a1, a2, a3);
1630  return Callback<R,T1,T2,T3,T4> (impl);
1631 }
1632 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1633  typename T1, typename T2,typename T3,typename T4,typename T5>
1634 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2, ARG3 a3) {
1636  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);
1637  return Callback<R,T1,T2,T3,T4,T5> (impl);
1638 }
1639 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1640  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1641 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) {
1643  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);
1644  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1645 }
1650 } // namespace ns3
1651 
1652 namespace ns3 {
1653 
1659 {
1660 public:
1661  CallbackValue ();
1666  CallbackValue (const CallbackBase &base);
1667  virtual ~CallbackValue ();
1669  void Set (CallbackBase base);
1676  template <typename T>
1677  bool GetAccessor (T &value) const;
1679  virtual Ptr<AttributeValue> Copy (void) const;
1685  virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
1693  virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
1694 private:
1696 };
1697 
1703 } // namespace ns3
1704 
1705 namespace ns3 {
1706 
1707 template <typename T>
1708 bool CallbackValue::GetAccessor (T &value) const
1709 {
1710  if (value.CheckType (m_value))
1711  {
1712  value.Assign (m_value);
1713  return true;
1714  }
1715  return false;
1716 }
1717 
1718 } // namespace ns3
1719 
1720 
1721 #endif /* CALLBACK_H */
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
virtual ~MemPtrCallbackImpl()
Definition: callback.h:338
Callback template class.
Definition: callback.h:920
void DoAssign(Ptr< const CallbackImplBase > other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1188
virtual ~BoundFunctorCallbackImpl()
Definition: callback.h:487
virtual ~FunctorCallbackImpl()
Definition: callback.h:191
Hold a value for an Attribute.
Definition: attribute.h:56
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const =0
Equality test.
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Build bound Callbacks which take varying numbers of arguments, and potentially returning a value...
Definition: callback.h:1463
Callback< R, T3, T4, T5, T6, T7, T8, T9 > TwoBind(TX1 a1, TX2 a2)
Bind the first two arguments.
Definition: callback.h:982
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1014
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:493
void Assign(const CallbackBase &other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1155
Callback< R, T2, T3, T4, T5, T6, T7, T8, T9 > Bind(T a)
Bind the first arguments.
Definition: callback.h:965
Base class for Callback class.
Definition: callback.h:844
MemPtrCallbackImpl(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct from an object pointer and member function pointer.
Definition: callback.h:336
virtual ~CallbackValue()
Definition: callback.cc:17
Callback< R > MakeNullCallback(void)
Definition: callback.h:1395
bool GetAccessor(T &value) const
Give value my callback, if type compatible.
Definition: callback.h:1708
CallbackImpl for functors with first three arguments bound at construction.
Definition: callback.h:733
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
AttributeValue form of a Callback.
Definition: callback.h:1658
The unqualified CallbackImpl class.
Definition: callback.h:97
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:197
TypeTraits< TX >::ReferencedType m_a
the bound argument
Definition: callback.h:603
make Callback use a separate empty type
Definition: empty.h:8
Ptr< T > Create(void)
Definition: ptr.h:231
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:344
CallbackBase m_value
the CallbackBase
Definition: callback.h:1695
bool CheckType(const CallbackBase &other) const
Check for compatible types.
Definition: callback.h:1147
FunctorCallbackImpl(T const &functor)
Construct from a functor.
Definition: callback.h:189
Trait class to convert a pointer into a reference, used by MemPtrCallBackImpl.
Definition: callback.h:48
BoundFunctorCallbackImpl(FUNCTOR functor, ARG a)
Construct from functor and a bound argument.
Definition: callback.h:485
OBJ_PTR const m_objPtr
the object pointer
Definition: callback.h:468
MEM_PTR m_memPtr
the member function pointer
Definition: callback.h:469
T * PeekPointer(const Ptr< T > &p)
Definition: ptr.h:279
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:708
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:587
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1238
ATTRIBUTE_ACCESSOR_DEFINE(Boolean)
CallbackImpl for pointer to member functions.
Definition: callback.h:328
Callback< R, T4, T5, T6, T7, T8, T9 > ThreeBind(TX1 a1, TX2 a2, TX3 a3)
Bind the first three arguments.
Definition: callback.h:1000
bool DoCheckType(Ptr< const CallbackImplBase > other) const
Check for compatible types.
Definition: callback.h:1169
Abstract base class for CallbackImpl Provides reference counting and equality test.
Definition: callback.h:78
CallbackImpl for functors with first two arguments bound at construction.
Definition: callback.h:611
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:453
Callback(Ptr< CallbackImpl< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > > const &impl)
Construct from a CallbackImpl pointer.
Definition: callback.h:954
R operator()(void) const
Functor with varying numbers of arguments.
Definition: callback.h:1027
TypeTraits< TX3 >::ReferencedType m_a3
third bound argument
Definition: callback.h:836
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:1213
virtual ~CallbackImplBase()
Virtual destructor.
Definition: callback.h:82
static std::string Demangle(const std::string &mangled)
Definition: callback.cc:104
bool IsEqual(const CallbackBase &other) const
Equality test.
Definition: callback.h:1137
static T & GetReference(T *const p)
Definition: callback.h:61
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:834
Callback(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct a member function pointer call back.
Definition: callback.h:945
T m_functor
the functor
Definition: callback.h:320
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:628
virtual ~CallbackImpl()
Definition: callback.h:171
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:724
Callback(FUNCTOR const &functor, bool, bool)
Construct a functor call back, supporting operator() calls.
Definition: callback.h:934
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:306
CallbackImpl for functors with first argument bound at construction.
Definition: callback.h:477
TwoBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2)
Construct from functor and two arguments.
Definition: callback.h:620
CallbackImpl with functors.
Definition: callback.h:182
virtual bool DeserializeFromString(std::string value, Ptr< const AttributeChecker > checker)
Deserialize from string (not implemented)
Definition: callback.cc:43
virtual R operator()(T1, T2, T3, T4, T5, T6, T7, T8, T9)=0
Abstract operator.
Type trait reference values.
Definition: type-traits.h:6
virtual std::string SerializeToString(Ptr< const AttributeChecker > checker) const
Serialize to string.
Definition: callback.cc:35
T m_functor
The functor.
Definition: callback.h:602
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:818
void Nullify(void)
Discard the implementation, set it to null.
Definition: callback.h:1018
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:835
CallbackBase(Ptr< CallbackImplBase > impl)
Construct from a pimpl.
Definition: callback.h:854
A template-based reference counting class.
virtual Ptr< AttributeValue > Copy(void) const
Definition: callback.cc:29
ATTRIBUTE_CHECKER_DEFINE(Boolean)
CallbackImpl< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > * DoPeekImpl(void) const
Definition: callback.h:1160
Ptr< CallbackImplBase > m_impl
the pimpl
Definition: callback.h:855
void Set(CallbackBase base)
Definition: callback.cc:22
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:725
Ptr< CallbackImplBase > GetImpl(void) const
Definition: callback.h:848
ThreeBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
Construct from functor and three arguments.
Definition: callback.h:743
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:751