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 
35 // Define the doxygen subgroups all at once,
36 // since the implementations are interleaved.
37 
107 template <typename T>
109 
110 template <typename T>
111 struct CallbackTraits<T *>
112 {
117  static T & GetReference (T * const p)
118  {
119  return *p;
120  }
121 };
129 class CallbackImplBase : public SimpleRefCount<CallbackImplBase>
130 {
131 public:
133  virtual ~CallbackImplBase () {}
140  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
141 };
142 
147 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
149 
157 template <typename R>
159 public:
160  virtual ~CallbackImpl () {}
161  virtual R operator() (void) = 0;
162 };
164 template <typename R, typename T1>
166 public:
167  virtual ~CallbackImpl () {}
168  virtual R operator() (T1) = 0;
169 };
171 template <typename R, typename T1, typename T2>
173 public:
174  virtual ~CallbackImpl () {}
175  virtual R operator() (T1, T2) = 0;
176 };
178 template <typename R, typename T1, typename T2, typename T3>
180 public:
181  virtual ~CallbackImpl () {}
182  virtual R operator() (T1, T2, T3) = 0;
183 };
185 template <typename R, typename T1, typename T2, typename T3, typename T4>
186 class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
187 public:
188  virtual ~CallbackImpl () {}
189  virtual R operator() (T1, T2, T3, T4) = 0;
190 };
192 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
193 class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
194 public:
195  virtual ~CallbackImpl () {}
196  virtual R operator() (T1, T2, T3, T4, T5) = 0;
197 };
199 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
200 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
201 public:
202  virtual ~CallbackImpl () {}
203  virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
204 };
206 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
207 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
208 public:
209  virtual ~CallbackImpl () {}
210  virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
211 };
213 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
214 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
215 public:
216  virtual ~CallbackImpl () {}
217  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
218 };
220 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
221 class CallbackImpl : public CallbackImplBase {
222 public:
223  virtual ~CallbackImpl () {}
224  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
225 };
233 template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
234 class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
235 public:
241  FunctorCallbackImpl (T const &functor)
242  : m_functor (functor) {}
243  virtual ~FunctorCallbackImpl () {}
249  R operator() (void) {
250  return m_functor ();
251  }
256  R operator() (T1 a1) {
257  return m_functor (a1);
258  }
264  R operator() (T1 a1,T2 a2) {
265  return m_functor (a1,a2);
266  }
273  R operator() (T1 a1,T2 a2,T3 a3) {
274  return m_functor (a1,a2,a3);
275  }
283  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
284  return m_functor (a1,a2,a3,a4);
285  }
294  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
295  return m_functor (a1,a2,a3,a4,a5);
296  }
306  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
307  return m_functor (a1,a2,a3,a4,a5,a6);
308  }
319  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
320  return m_functor (a1,a2,a3,a4,a5,a6,a7);
321  }
333  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
334  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
335  }
348  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
349  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
350  }
358  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
361  if (otherDerived == 0)
362  {
363  return false;
364  }
365  else if (otherDerived->m_functor != m_functor)
366  {
367  return false;
368  }
369  return true;
370  }
371 private:
373 };
374 
379 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>
380 class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
381 public:
388  MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR memPtr)
389  : m_objPtr (objPtr), m_memPtr (memPtr) {}
390  virtual ~MemPtrCallbackImpl () {}
396  R operator() (void) {
398  }
403  R operator() (T1 a1) {
405  }
411  R operator() (T1 a1,T2 a2) {
413  }
420  R operator() (T1 a1,T2 a2,T3 a3) {
421  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3);
422  }
430  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
431  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4);
432  }
441  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
442  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5);
443  }
453  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
454  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6);
455  }
466  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
467  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7);
468  }
480  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
481  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8);
482  }
495  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
496  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
497  }
505  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
508  if (otherDerived == 0)
509  {
510  return false;
511  }
512  else if (otherDerived->m_objPtr != m_objPtr ||
513  otherDerived->m_memPtr != m_memPtr)
514  {
515  return false;
516  }
517  return true;
518  }
519 private:
520  OBJ_PTR const m_objPtr;
521  MEM_PTR m_memPtr;
522 };
523 
528 template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
529 class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
530 public:
536  template <typename FUNCTOR, typename ARG>
537  BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
538  : m_functor (functor), m_a (a) {}
545  R operator() (void) {
546  return m_functor (m_a);
547  }
552  R operator() (T1 a1) {
553  return m_functor (m_a,a1);
554  }
560  R operator() (T1 a1,T2 a2) {
561  return m_functor (m_a,a1,a2);
562  }
569  R operator() (T1 a1,T2 a2,T3 a3) {
570  return m_functor (m_a,a1,a2,a3);
571  }
579  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
580  return m_functor (m_a,a1,a2,a3,a4);
581  }
590  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
591  return m_functor (m_a,a1,a2,a3,a4,a5);
592  }
602  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
603  return m_functor (m_a,a1,a2,a3,a4,a5,a6);
604  }
615  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
616  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
617  }
629  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
630  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
631  }
639  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
642  if (otherDerived == 0)
643  {
644  return false;
645  }
646  else if (otherDerived->m_functor != m_functor ||
647  otherDerived->m_a != m_a)
648  {
649  return false;
650  }
651  return true;
652  }
653 private:
656 };
657 
662 template <typename T, typename R, typename TX1, typename TX2, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
663 class TwoBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> {
664 public:
671  template <typename FUNCTOR, typename ARG1, typename ARG2>
672  TwoBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2)
673  : m_functor (functor), m_a1 (arg1), m_a2 (arg2) {}
680  R operator() (void) {
681  return m_functor (m_a1,m_a2);
682  }
687  R operator() (T1 a1) {
688  return m_functor (m_a1,m_a2,a1);
689  }
695  R operator() (T1 a1,T2 a2) {
696  return m_functor (m_a1,m_a2,a1,a2);
697  }
704  R operator() (T1 a1,T2 a2,T3 a3) {
705  return m_functor (m_a1,m_a2,a1,a2,a3);
706  }
714  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
715  return m_functor (m_a1,m_a2,a1,a2,a3,a4);
716  }
725  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
726  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5);
727  }
737  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
738  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6);
739  }
750  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
751  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6,a7);
752  }
760  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
763  if (otherDerived == 0)
764  {
765  return false;
766  }
767  else if (otherDerived->m_functor != m_functor ||
768  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2)
769  {
770  return false;
771  }
772  return true;
773  }
774 private:
778 };
779 
784 template <typename T, typename R, typename TX1, typename TX2, typename TX3, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
785 class ThreeBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> {
786 public:
794  template <typename FUNCTOR, typename ARG1, typename ARG2, typename ARG3>
795  ThreeBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
796  : m_functor (functor), m_a1 (arg1), m_a2 (arg2), m_a3 (arg3) {}
803  R operator() (void) {
804  return m_functor (m_a1,m_a2,m_a3);
805  }
810  R operator() (T1 a1) {
811  return m_functor (m_a1,m_a2,m_a3,a1);
812  }
818  R operator() (T1 a1,T2 a2) {
819  return m_functor (m_a1,m_a2,m_a3,a1,a2);
820  }
827  R operator() (T1 a1,T2 a2,T3 a3) {
828  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3);
829  }
837  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
838  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4);
839  }
848  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
849  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5);
850  }
860  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
861  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5,a6);
862  }
870  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
873  if (otherDerived == 0)
874  {
875  return false;
876  }
877  else if (otherDerived->m_functor != m_functor ||
878  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2 || otherDerived->m_a3 != m_a3)
879  {
880  return false;
881  }
882  return true;
883  }
884 private:
889 };
890 
897 public:
898  CallbackBase () : m_impl () {}
900  Ptr<CallbackImplBase> GetImpl (void) const { return m_impl; }
901 protected:
908 
913  static std::string Demangle (const std::string& mangled);
914 };
915 
966 template<typename R,
967  typename T1 = empty, typename T2 = empty,
968  typename T3 = empty, typename T4 = empty,
969  typename T5 = empty, typename T6 = empty,
970  typename T7 = empty, typename T8 = empty,
971  typename T9 = empty>
972 class Callback : public CallbackBase {
973 public:
974  Callback () {}
975 
985  template <typename FUNCTOR>
986  Callback (FUNCTOR const &functor, bool, bool)
987  : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
988  {}
989 
996  template <typename OBJ_PTR, typename MEM_PTR>
997  Callback (OBJ_PTR const &objPtr, MEM_PTR memPtr)
998  : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, memPtr))
999  {}
1000 
1007  : CallbackBase (impl)
1008  {}
1009 
1016  template <typename T>
1022  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
1024  }
1025 
1033  template <typename TX1, typename TX2>
1039  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2), false);
1040  return Callback<R,T3,T4,T5,T6,T7,T8,T9> (impl);
1041  }
1042 
1051  template <typename TX1, typename TX2, typename TX3>
1052  Callback<R,T4,T5,T6,T7,T8,T9> ThreeBind (TX1 a1, TX2 a2, TX3 a3) {
1057  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2, a3), false);
1058  return Callback<R,T4,T5,T6,T7,T8,T9> (impl);
1059  }
1060 
1066  bool IsNull (void) const {
1067  return (DoPeekImpl () == 0) ? true : false;
1068  }
1070  void Nullify (void) {
1071  m_impl = 0;
1072  }
1073 
1079  R operator() (void) const {
1080  return (*(DoPeekImpl ()))();
1081  }
1086  R operator() (T1 a1) const {
1087  return (*(DoPeekImpl ()))(a1);
1088  }
1094  R operator() (T1 a1, T2 a2) const {
1095  return (*(DoPeekImpl ()))(a1,a2);
1096  }
1103  R operator() (T1 a1, T2 a2, T3 a3) const {
1104  return (*(DoPeekImpl ()))(a1,a2,a3);
1105  }
1113  R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
1114  return (*(DoPeekImpl ()))(a1,a2,a3,a4);
1115  }
1124  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
1125  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5);
1126  }
1136  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
1137  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6);
1138  }
1149  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
1150  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7);
1151  }
1163  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
1164  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8);
1165  }
1178  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
1179  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8,a9);
1180  }
1189  bool IsEqual (const CallbackBase &other) const {
1190  return m_impl->IsEqual (other.GetImpl ());
1191  }
1192 
1199  bool CheckType (const CallbackBase & other) const {
1200  return DoCheckType (other.GetImpl ());
1201  }
1207  void Assign (const CallbackBase &other) {
1208  DoAssign (other.GetImpl ());
1209  }
1210 private:
1214  }
1222  if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
1223  {
1224  return true;
1225  }
1226  else if (other == 0)
1227  {
1228  return true;
1229  }
1230  else
1231  {
1232  return false;
1233  }
1234  }
1241  if (!DoCheckType (other))
1242  {
1243  NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
1244  "got=" << Demangle ( typeid (*other).name () ) << std::endl <<
1245  "expected=" << Demangle ( typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name () ));
1246  }
1247  m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
1248  }
1249 };
1250 
1251 
1260 template <typename R, typename T1, typename T2,
1261  typename T3, typename T4,
1262  typename T5, typename T6,
1263  typename T7, typename T8,
1264  typename T9>
1266 {
1267  return !a.IsEqual (b);
1268 }
1269 
1282 template <typename T, typename OBJ, typename R>
1283 Callback<R> MakeCallback (R (T::*memPtr)(void), OBJ objPtr) {
1284  return Callback<R> (objPtr, memPtr);
1285 }
1286 template <typename T, typename OBJ, typename R>
1287 Callback<R> MakeCallback (R (T::*memPtr)() const, OBJ objPtr) {
1288  return Callback<R> (objPtr, memPtr);
1289 }
1290 template <typename T, typename OBJ, typename R, typename T1>
1291 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1), OBJ objPtr) {
1292  return Callback<R,T1> (objPtr, memPtr);
1293 }
1294 template <typename T, typename OBJ, typename R, typename T1>
1295 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1) const, OBJ objPtr) {
1296  return Callback<R,T1> (objPtr, memPtr);
1297 }
1298 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1299 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2), OBJ objPtr) {
1300  return Callback<R,T1,T2> (objPtr, memPtr);
1301 }
1302 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1303 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2) const, OBJ objPtr) {
1304  return Callback<R,T1,T2> (objPtr, memPtr);
1305 }
1306 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1307 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3), OBJ objPtr) {
1308  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1309 }
1310 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1311 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3) const, OBJ objPtr) {
1312  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1313 }
1314 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1315 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4), OBJ objPtr) {
1316  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1317 }
1318 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1319 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4) const, OBJ objPtr) {
1320  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1321 }
1322 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1323 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5), OBJ objPtr) {
1324  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1325 }
1326 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1327 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5) const, OBJ objPtr) {
1328  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1329 }
1330 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
1331 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6), OBJ objPtr) {
1332  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1333 }
1334 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
1335 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
1336  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1337 }
1338 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
1339 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
1340  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1341 }
1342 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
1343 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
1344  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1345 }
1346 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
1347 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
1348  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1349 }
1350 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1351 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) {
1352  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1353 }
1354 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>
1355 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) {
1356  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1357 }
1358 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>
1359 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) {
1360  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1361 }
1375 template <typename R>
1376 Callback<R> MakeCallback (R (*fnPtr)()) {
1377  return Callback<R> (fnPtr, true, true);
1378 }
1379 template <typename R, typename T1>
1380 Callback<R,T1> MakeCallback (R (*fnPtr)(T1)) {
1381  return Callback<R,T1> (fnPtr, true, true);
1382 }
1383 template <typename R, typename T1, typename T2>
1384 Callback<R,T1,T2> MakeCallback (R (*fnPtr)(T1,T2)) {
1385  return Callback<R,T1,T2> (fnPtr, true, true);
1386 }
1387 template <typename R, typename T1, typename T2,typename T3>
1388 Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr)(T1,T2,T3)) {
1389  return Callback<R,T1,T2,T3> (fnPtr, true, true);
1390 }
1391 template <typename R, typename T1, typename T2,typename T3,typename T4>
1392 Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr)(T1,T2,T3,T4)) {
1393  return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
1394 }
1395 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1396 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5)) {
1397  return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
1398 }
1399 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1400 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6)) {
1401  return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
1402 }
1403 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1404 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7)) {
1405  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
1406 }
1407 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1408 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8)) {
1409  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
1410 }
1411 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1412 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
1413  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
1414 }
1428 template <typename R>
1430  return Callback<R> ();
1431 }
1432 template <typename R, typename T1>
1434  return Callback<R,T1> ();
1435 }
1436 template <typename R, typename T1, typename T2>
1438  return Callback<R,T1,T2> ();
1439 }
1440 template <typename R, typename T1, typename T2,typename T3>
1442  return Callback<R,T1,T2,T3> ();
1443 }
1444 template <typename R, typename T1, typename T2,typename T3,typename T4>
1446  return Callback<R,T1,T2,T3,T4> ();
1447 }
1448 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1450  return Callback<R,T1,T2,T3,T4,T5> ();
1451 }
1452 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1455 }
1456 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1459 }
1460 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1463 }
1464 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1467 }
1479 template <typename R, typename TX, typename ARG>
1480 Callback<R> MakeBoundCallback (R (*fnPtr)(TX), ARG a1) {
1482  Create<BoundFunctorCallbackImpl<R (*)(TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1);
1483  return Callback<R> (impl);
1484 }
1485 template <typename R, typename TX, typename ARG,
1486  typename T1>
1487 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX,T1), ARG a1) {
1489  Create<BoundFunctorCallbackImpl<R (*)(TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1490  return Callback<R,T1> (impl);
1491 }
1492 template <typename R, typename TX, typename ARG,
1493  typename T1, typename T2>
1494 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX,T1,T2), ARG a1) {
1496  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1497  return Callback<R,T1,T2> (impl);
1498 }
1499 template <typename R, typename TX, typename ARG,
1500  typename T1, typename T2,typename T3>
1501 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3), ARG a1) {
1503  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a1);
1504  return Callback<R,T1,T2,T3> (impl);
1505 }
1506 template <typename R, typename TX, typename ARG,
1507  typename T1, typename T2,typename T3,typename T4>
1508 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4), ARG a1) {
1510  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a1);
1511  return Callback<R,T1,T2,T3,T4> (impl);
1512 }
1513 template <typename R, typename TX, typename ARG,
1514  typename T1, typename T2,typename T3,typename T4,typename T5>
1515 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5), ARG a1) {
1517  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a1);
1518  return Callback<R,T1,T2,T3,T4,T5> (impl);
1519 }
1520 template <typename R, typename TX, typename ARG,
1521  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1522 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6), ARG a1) {
1524  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a1);
1525  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1526 }
1527 template <typename R, typename TX, typename ARG,
1528  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1529 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7), ARG a1) {
1531  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a1);
1532  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1533 }
1534 template <typename R, typename TX, typename ARG,
1535  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
1536 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a1) {
1538  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a1);
1540 }
1552 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2>
1553 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2), ARG1 a1, ARG2 a2) {
1555  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2),R,TX1,TX2,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2);
1556  return Callback<R> (impl);
1557 }
1558 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1559  typename T1>
1560 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1), ARG1 a1, ARG2 a2) {
1562  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1),R,TX1,TX2,T1,empty,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1563  return Callback<R,T1> (impl);
1564 }
1565 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1566  typename T1, typename T2>
1567 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2), ARG1 a1, ARG2 a2) {
1569  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2),R,TX1,TX2,T1,T2,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1570  return Callback<R,T1,T2> (impl);
1571 }
1572 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1573  typename T1, typename T2,typename T3>
1574 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3), ARG1 a1, ARG2 a2) {
1576  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3),R,TX1,TX2,T1,T2,T3,empty,empty,empty,empty> > (fnPtr, a1, a2);
1577  return Callback<R,T1,T2,T3> (impl);
1578 }
1579 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1580  typename T1, typename T2,typename T3,typename T4>
1581 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4), ARG1 a1, ARG2 a2) {
1583  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4),R,TX1,TX2,T1,T2,T3,T4,empty,empty,empty> > (fnPtr, a1, a2);
1584  return Callback<R,T1,T2,T3,T4> (impl);
1585 }
1586 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1587  typename T1, typename T2,typename T3,typename T4,typename T5>
1588 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2) {
1590  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5),R,TX1,TX2,T1,T2,T3,T4,T5,empty,empty> > (fnPtr, a1, a2);
1591  return Callback<R,T1,T2,T3,T4,T5> (impl);
1592 }
1593 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1594  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1595 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5,T6), ARG1 a1, ARG2 a2) {
1597  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5,T6),R,TX1,TX2,T1,T2,T3,T4,T5,T6,empty> > (fnPtr, a1, a2);
1598  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1599 }
1600 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1601  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1602 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) {
1604  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);
1605  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1606 }
1619 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3>
1620 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3), ARG1 a1, ARG2 a2, ARG3 a3) {
1622  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3),R,TX1,TX2,TX3,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2, a3);
1623  return Callback<R> (impl);
1624 }
1625 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1626  typename T1>
1627 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1), ARG1 a1, ARG2 a2, ARG3 a3) {
1629  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1),R,TX1,TX2,TX3,T1,empty,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1630  return Callback<R,T1> (impl);
1631 }
1632 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1633  typename T1, typename T2>
1634 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2), ARG1 a1, ARG2 a2, ARG3 a3) {
1636  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2),R,TX1,TX2,TX3,T1,T2,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1637  return Callback<R,T1,T2> (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>
1641 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3), ARG1 a1, ARG2 a2, ARG3 a3) {
1643  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3),R,TX1,TX2,TX3,T1,T2,T3,empty,empty,empty> > (fnPtr, a1, a2, a3);
1644  return Callback<R,T1,T2,T3> (impl);
1645 }
1646 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1647  typename T1, typename T2,typename T3,typename T4>
1648 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4), ARG1 a1, ARG2 a2, ARG3 a3) {
1650  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3,T4),R,TX1,TX2,TX3,T1,T2,T3,T4,empty,empty> > (fnPtr, a1, a2, a3);
1651  return Callback<R,T1,T2,T3,T4> (impl);
1652 }
1653 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1654  typename T1, typename T2,typename T3,typename T4,typename T5>
1655 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2, ARG3 a3) {
1657  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);
1658  return Callback<R,T1,T2,T3,T4,T5> (impl);
1659 }
1660 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1661  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1662 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) {
1664  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);
1665  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1666 }
1670 } // namespace ns3
1671 
1672 namespace ns3 {
1673 
1679 {
1680 public:
1682  CallbackValue ();
1687  CallbackValue (const CallbackBase &base);
1689  virtual ~CallbackValue ();
1691  void Set (CallbackBase base);
1698  template <typename T>
1699  bool GetAccessor (T &value) const;
1701  virtual Ptr<AttributeValue> Copy (void) const;
1707  virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
1715  virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
1716 private:
1718 };
1719 
1722 
1723 } // namespace ns3
1724 
1725 namespace ns3 {
1726 
1727 template <typename T>
1728 bool CallbackValue::GetAccessor (T &value) const
1729 {
1730  if (value.CheckType (m_value))
1731  {
1732  value.Assign (m_value);
1733  return true;
1734  }
1735  return false;
1736 }
1737 
1738 } // namespace ns3
1739 
1740 
1741 #endif /* CALLBACK_H */
CallbackValue()
Constructor.
Definition: callback.cc:8
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:60
virtual ~MemPtrCallbackImpl()
Definition: callback.h:390
Callback template class.
Definition: callback.h:972
void DoAssign(Ptr< const CallbackImplBase > other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1240
virtual ~BoundFunctorCallbackImpl()
Definition: callback.h:539
virtual ~FunctorCallbackImpl()
Definition: callback.h:243
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)
Make Callbacks with one bound argument.
Definition: callback.h:1480
Callback< R, T3, T4, T5, T6, T7, T8, T9 > TwoBind(TX1 a1, TX2 a2)
Bind the first two arguments.
Definition: callback.h:1034
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1066
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:545
void Assign(const CallbackBase &other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1207
Callback< R, T2, T3, T4, T5, T6, T7, T8, T9 > Bind(T a)
Bind the first arguments.
Definition: callback.h:1017
Base class for Callback class.
Definition: callback.h:896
MemPtrCallbackImpl(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct from an object pointer and member function pointer.
Definition: callback.h:388
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:95
virtual ~CallbackValue()
Destructor.
Definition: callback.cc:17
Callback< R > MakeNullCallback(void)
Definition: callback.h:1429
bool GetAccessor(T &value) const
Give value my callback, if type compatible.
Definition: callback.h:1728
CallbackImpl for functors with first three arguments bound at construction.
Definition: callback.h:785
AttributeValue form of a Callback.
Definition: callback.h:1678
The unqualified CallbackImpl class.
Definition: callback.h:148
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:249
TypeTraits< TX >::ReferencedType m_a
the bound argument
Definition: callback.h:655
make Callback use a separate empty type
Definition: empty.h:8
Ptr< T > Create(void)
Definition: ptr.h:232
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:396
CallbackBase m_value
the CallbackBase
Definition: callback.h:1717
bool CheckType(const CallbackBase &other) const
Check for compatible types.
Definition: callback.h:1199
FunctorCallbackImpl(T const &functor)
Construct from a functor.
Definition: callback.h:241
Trait class to convert a pointer into a reference, used by MemPtrCallBackImpl.
Definition: callback.h:108
BoundFunctorCallbackImpl(FUNCTOR functor, ARG a)
Construct from functor and a bound argument.
Definition: callback.h:537
OBJ_PTR const m_objPtr
the object pointer
Definition: callback.h:520
MEM_PTR m_memPtr
the member function pointer
Definition: callback.h:521
T * PeekPointer(const Ptr< T > &p)
Definition: ptr.h:280
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:760
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:639
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1283
ATTRIBUTE_ACCESSOR_DEFINE(Boolean)
CallbackImpl for pointer to member functions.
Definition: callback.h:380
Callback< R, T4, T5, T6, T7, T8, T9 > ThreeBind(TX1 a1, TX2 a2, TX3 a3)
Bind the first three arguments.
Definition: callback.h:1052
bool DoCheckType(Ptr< const CallbackImplBase > other) const
Check for compatible types.
Definition: callback.h:1221
Abstract base class for CallbackImpl Provides reference counting and equality test.
Definition: callback.h:129
CallbackImpl for functors with first two arguments bound at construction.
Definition: callback.h:663
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:505
Callback(Ptr< CallbackImpl< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > > const &impl)
Construct from a CallbackImpl pointer.
Definition: callback.h:1006
R operator()(void) const
Functor with varying numbers of arguments.
Definition: callback.h:1079
TypeTraits< TX3 >::ReferencedType m_a3
third bound argument
Definition: callback.h:888
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:1265
virtual ~CallbackImplBase()
Virtual destructor.
Definition: callback.h:133
static std::string Demangle(const std::string &mangled)
Definition: callback.cc:104
bool IsEqual(const CallbackBase &other) const
Equality test.
Definition: callback.h:1189
static T & GetReference(T *const p)
Definition: callback.h:117
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:886
Callback(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct a member function pointer call back.
Definition: callback.h:997
T m_functor
the functor
Definition: callback.h:372
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:680
virtual ~CallbackImpl()
Definition: callback.h:223
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:776
Callback(FUNCTOR const &functor, bool, bool)
Construct a functor call back, supporting operator() calls.
Definition: callback.h:986
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:358
CallbackImpl for functors with first argument bound at construction.
Definition: callback.h:529
TwoBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2)
Construct from functor and two arguments.
Definition: callback.h:672
CallbackImpl with functors.
Definition: callback.h:234
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:654
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:870
void Nullify(void)
Discard the implementation, set it to null.
Definition: callback.h:1070
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:887
CallbackBase(Ptr< CallbackImplBase > impl)
Construct from a pimpl.
Definition: callback.h:906
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:1212
Ptr< CallbackImplBase > m_impl
the pimpl
Definition: callback.h:907
void Set(CallbackBase base)
Definition: callback.cc:22
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:777
Ptr< CallbackImplBase > GetImpl(void) const
Definition: callback.h:900
ThreeBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
Construct from functor and three arguments.
Definition: callback.h:795
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:803