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;
151 };
152 
157 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
159 
167 template <typename R>
169 public:
170  virtual ~CallbackImpl () {}
171  virtual R operator() (void) = 0;
172 };
174 template <typename R, typename T1>
176 public:
177  virtual ~CallbackImpl () {}
178  virtual R operator() (T1) = 0;
179 };
181 template <typename R, typename T1, typename T2>
183 public:
184  virtual ~CallbackImpl () {}
185  virtual R operator() (T1, T2) = 0;
186 };
188 template <typename R, typename T1, typename T2, typename T3>
190 public:
191  virtual ~CallbackImpl () {}
192  virtual R operator() (T1, T2, T3) = 0;
193 };
195 template <typename R, typename T1, typename T2, typename T3, typename T4>
196 class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
197 public:
198  virtual ~CallbackImpl () {}
199  virtual R operator() (T1, T2, T3, T4) = 0;
200 };
202 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
203 class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
204 public:
205  virtual ~CallbackImpl () {}
206  virtual R operator() (T1, T2, T3, T4, T5) = 0;
207 };
209 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
210 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
211 public:
212  virtual ~CallbackImpl () {}
213  virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
214 };
216 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
217 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
218 public:
219  virtual ~CallbackImpl () {}
220  virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
221 };
223 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
224 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
225 public:
226  virtual ~CallbackImpl () {}
227  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
228 };
230 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
231 class CallbackImpl : public CallbackImplBase {
232 public:
233  virtual ~CallbackImpl () {}
234  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
235 };
243 template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
244 class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
245 public:
251  FunctorCallbackImpl (T const &functor)
252  : m_functor (functor) {}
253  virtual ~FunctorCallbackImpl () {}
259  R operator() (void) {
260  return m_functor ();
261  }
266  R operator() (T1 a1) {
267  return m_functor (a1);
268  }
274  R operator() (T1 a1,T2 a2) {
275  return m_functor (a1,a2);
276  }
283  R operator() (T1 a1,T2 a2,T3 a3) {
284  return m_functor (a1,a2,a3);
285  }
293  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
294  return m_functor (a1,a2,a3,a4);
295  }
304  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
305  return m_functor (a1,a2,a3,a4,a5);
306  }
316  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
317  return m_functor (a1,a2,a3,a4,a5,a6);
318  }
329  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
330  return m_functor (a1,a2,a3,a4,a5,a6,a7);
331  }
343  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
344  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
345  }
358  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
359  return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
360  }
368  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
371  if (otherDerived == 0)
372  {
373  return false;
374  }
375  else if (otherDerived->m_functor != m_functor)
376  {
377  return false;
378  }
379  return true;
380  }
381 private:
383 };
384 
389 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>
390 class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
391 public:
398  MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR memPtr)
399  : m_objPtr (objPtr), m_memPtr (memPtr) {}
400  virtual ~MemPtrCallbackImpl () {}
406  R operator() (void) {
408  }
413  R operator() (T1 a1) {
415  }
421  R operator() (T1 a1,T2 a2) {
423  }
430  R operator() (T1 a1,T2 a2,T3 a3) {
431  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3);
432  }
440  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
441  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4);
442  }
451  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
452  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5);
453  }
463  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
464  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6);
465  }
476  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
477  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7);
478  }
490  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
491  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8);
492  }
505  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
506  return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
507  }
515  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
518  if (otherDerived == 0)
519  {
520  return false;
521  }
522  else if (otherDerived->m_objPtr != m_objPtr ||
523  otherDerived->m_memPtr != m_memPtr)
524  {
525  return false;
526  }
527  return true;
528  }
529 private:
530  OBJ_PTR const m_objPtr;
531  MEM_PTR m_memPtr;
532 };
533 
538 template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
539 class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
540 public:
546  template <typename FUNCTOR, typename ARG>
547  BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
548  : m_functor (functor), m_a (a) {}
555  R operator() (void) {
556  return m_functor (m_a);
557  }
562  R operator() (T1 a1) {
563  return m_functor (m_a,a1);
564  }
570  R operator() (T1 a1,T2 a2) {
571  return m_functor (m_a,a1,a2);
572  }
579  R operator() (T1 a1,T2 a2,T3 a3) {
580  return m_functor (m_a,a1,a2,a3);
581  }
589  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
590  return m_functor (m_a,a1,a2,a3,a4);
591  }
600  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
601  return m_functor (m_a,a1,a2,a3,a4,a5);
602  }
612  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
613  return m_functor (m_a,a1,a2,a3,a4,a5,a6);
614  }
625  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
626  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
627  }
639  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
640  return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
641  }
649  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
652  if (otherDerived == 0)
653  {
654  return false;
655  }
656  else if (otherDerived->m_functor != m_functor ||
657  otherDerived->m_a != m_a)
658  {
659  return false;
660  }
661  return true;
662  }
663 private:
666 };
667 
672 template <typename T, typename R, typename TX1, typename TX2, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
673 class TwoBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> {
674 public:
681  template <typename FUNCTOR, typename ARG1, typename ARG2>
682  TwoBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2)
683  : m_functor (functor), m_a1 (arg1), m_a2 (arg2) {}
690  R operator() (void) {
691  return m_functor (m_a1,m_a2);
692  }
697  R operator() (T1 a1) {
698  return m_functor (m_a1,m_a2,a1);
699  }
705  R operator() (T1 a1,T2 a2) {
706  return m_functor (m_a1,m_a2,a1,a2);
707  }
714  R operator() (T1 a1,T2 a2,T3 a3) {
715  return m_functor (m_a1,m_a2,a1,a2,a3);
716  }
724  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
725  return m_functor (m_a1,m_a2,a1,a2,a3,a4);
726  }
735  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
736  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5);
737  }
747  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
748  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6);
749  }
760  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
761  return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6,a7);
762  }
770  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
773  if (otherDerived == 0)
774  {
775  return false;
776  }
777  else if (otherDerived->m_functor != m_functor ||
778  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2)
779  {
780  return false;
781  }
782  return true;
783  }
784 private:
788 };
789 
794 template <typename T, typename R, typename TX1, typename TX2, typename TX3, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
795 class ThreeBoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> {
796 public:
804  template <typename FUNCTOR, typename ARG1, typename ARG2, typename ARG3>
805  ThreeBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
806  : m_functor (functor), m_a1 (arg1), m_a2 (arg2), m_a3 (arg3) {}
813  R operator() (void) {
814  return m_functor (m_a1,m_a2,m_a3);
815  }
820  R operator() (T1 a1) {
821  return m_functor (m_a1,m_a2,m_a3,a1);
822  }
828  R operator() (T1 a1,T2 a2) {
829  return m_functor (m_a1,m_a2,m_a3,a1,a2);
830  }
837  R operator() (T1 a1,T2 a2,T3 a3) {
838  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3);
839  }
847  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
848  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4);
849  }
858  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
859  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5);
860  }
870  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
871  return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5,a6);
872  }
880  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
883  if (otherDerived == 0)
884  {
885  return false;
886  }
887  else if (otherDerived->m_functor != m_functor ||
888  otherDerived->m_a1 != m_a1 || otherDerived->m_a2 != m_a2 || otherDerived->m_a3 != m_a3)
889  {
890  return false;
891  }
892  return true;
893  }
894 private:
899 };
900 
907 public:
908  CallbackBase () : m_impl () {}
910  Ptr<CallbackImplBase> GetImpl (void) const { return m_impl; }
911 protected:
918 
923  static std::string Demangle (const std::string& mangled);
924 };
925 
978 template<typename R,
979  typename T1 = empty, typename T2 = empty,
980  typename T3 = empty, typename T4 = empty,
981  typename T5 = empty, typename T6 = empty,
982  typename T7 = empty, typename T8 = empty,
983  typename T9 = empty>
984 class Callback : public CallbackBase {
985 public:
986  Callback () {}
987 
997  template <typename FUNCTOR>
998  Callback (FUNCTOR const &functor, bool, bool)
999  : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
1000  {}
1001 
1008  template <typename OBJ_PTR, typename MEM_PTR>
1009  Callback (OBJ_PTR const &objPtr, MEM_PTR memPtr)
1010  : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, memPtr))
1011  {}
1012 
1019  : CallbackBase (impl)
1020  {}
1021 
1028  template <typename T>
1034  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
1036  }
1037 
1045  template <typename TX1, typename TX2>
1051  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2), false);
1052  return Callback<R,T3,T4,T5,T6,T7,T8,T9> (impl);
1053  }
1054 
1063  template <typename TX1, typename TX2, typename TX3>
1064  Callback<R,T4,T5,T6,T7,T8,T9> ThreeBind (TX1 a1, TX2 a2, TX3 a3) {
1069  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a1, a2, a3), false);
1070  return Callback<R,T4,T5,T6,T7,T8,T9> (impl);
1071  }
1072 
1078  bool IsNull (void) const {
1079  return (DoPeekImpl () == 0) ? true : false;
1080  }
1082  void Nullify (void) {
1083  m_impl = 0;
1084  }
1085 
1091  R operator() (void) const {
1092  return (*(DoPeekImpl ()))();
1093  }
1098  R operator() (T1 a1) const {
1099  return (*(DoPeekImpl ()))(a1);
1100  }
1106  R operator() (T1 a1, T2 a2) const {
1107  return (*(DoPeekImpl ()))(a1,a2);
1108  }
1115  R operator() (T1 a1, T2 a2, T3 a3) const {
1116  return (*(DoPeekImpl ()))(a1,a2,a3);
1117  }
1125  R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
1126  return (*(DoPeekImpl ()))(a1,a2,a3,a4);
1127  }
1136  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
1137  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5);
1138  }
1148  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
1149  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6);
1150  }
1161  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
1162  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7);
1163  }
1175  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
1176  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8);
1177  }
1190  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
1191  return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8,a9);
1192  }
1201  bool IsEqual (const CallbackBase &other) const {
1202  return m_impl->IsEqual (other.GetImpl ());
1203  }
1204 
1211  bool CheckType (const CallbackBase & other) const {
1212  return DoCheckType (other.GetImpl ());
1213  }
1219  void Assign (const CallbackBase &other) {
1220  DoAssign (other.GetImpl ());
1221  }
1222 private:
1226  }
1234  if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
1235  {
1236  return true;
1237  }
1238  else if (other == 0)
1239  {
1240  return true;
1241  }
1242  else
1243  {
1244  return false;
1245  }
1246  }
1253  if (!DoCheckType (other))
1254  {
1256  NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
1257  "got=" << Demangle ( typeid (*other).name () ) << std::endl <<
1258  "expected=" << Demangle ( typeid (*expected).name () ));
1259  }
1260  m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
1261  }
1262 };
1263 
1264 
1273 template <typename R, typename T1, typename T2,
1274  typename T3, typename T4,
1275  typename T5, typename T6,
1276  typename T7, typename T8,
1277  typename T9>
1279 {
1280  return !a.IsEqual (b);
1281 }
1282 
1295 template <typename T, typename OBJ, typename R>
1296 Callback<R> MakeCallback (R (T::*memPtr)(void), OBJ objPtr) {
1297  return Callback<R> (objPtr, memPtr);
1298 }
1299 template <typename T, typename OBJ, typename R>
1300 Callback<R> MakeCallback (R (T::*memPtr)() const, OBJ objPtr) {
1301  return Callback<R> (objPtr, memPtr);
1302 }
1303 template <typename T, typename OBJ, typename R, typename T1>
1304 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1), OBJ objPtr) {
1305  return Callback<R,T1> (objPtr, memPtr);
1306 }
1307 template <typename T, typename OBJ, typename R, typename T1>
1308 Callback<R,T1> MakeCallback (R (T::*memPtr)(T1) const, OBJ objPtr) {
1309  return Callback<R,T1> (objPtr, memPtr);
1310 }
1311 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1312 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2), OBJ objPtr) {
1313  return Callback<R,T1,T2> (objPtr, memPtr);
1314 }
1315 template <typename T, typename OBJ, typename R, typename T1, typename T2>
1316 Callback<R,T1,T2> MakeCallback (R (T::*memPtr)(T1,T2) const, OBJ objPtr) {
1317  return Callback<R,T1,T2> (objPtr, memPtr);
1318 }
1319 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1320 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3), OBJ objPtr) {
1321  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1322 }
1323 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1324 Callback<R,T1,T2,T3> MakeCallback (R (T::*memPtr)(T1,T2,T3) const, OBJ objPtr) {
1325  return Callback<R,T1,T2,T3> (objPtr, memPtr);
1326 }
1327 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1328 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4), OBJ objPtr) {
1329  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1330 }
1331 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1332 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4) const, OBJ objPtr) {
1333  return Callback<R,T1,T2,T3,T4> (objPtr, memPtr);
1334 }
1335 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1336 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5), OBJ objPtr) {
1337  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1338 }
1339 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1340 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5) const, OBJ objPtr) {
1341  return Callback<R,T1,T2,T3,T4,T5> (objPtr, memPtr);
1342 }
1343 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
1344 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6), OBJ objPtr) {
1345  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1346 }
1347 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
1348 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
1349  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, memPtr);
1350 }
1351 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
1352 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
1353  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1354 }
1355 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
1356 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
1357  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, memPtr);
1358 }
1359 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
1360 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*memPtr)(T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
1361  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1362 }
1363 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1364 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) {
1365  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, memPtr);
1366 }
1367 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>
1368 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) {
1369  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1370 }
1371 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>
1372 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) {
1373  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, memPtr);
1374 }
1388 template <typename R>
1389 Callback<R> MakeCallback (R (*fnPtr)()) {
1390  return Callback<R> (fnPtr, true, true);
1391 }
1392 template <typename R, typename T1>
1393 Callback<R,T1> MakeCallback (R (*fnPtr)(T1)) {
1394  return Callback<R,T1> (fnPtr, true, true);
1395 }
1396 template <typename R, typename T1, typename T2>
1397 Callback<R,T1,T2> MakeCallback (R (*fnPtr)(T1,T2)) {
1398  return Callback<R,T1,T2> (fnPtr, true, true);
1399 }
1400 template <typename R, typename T1, typename T2,typename T3>
1401 Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr)(T1,T2,T3)) {
1402  return Callback<R,T1,T2,T3> (fnPtr, true, true);
1403 }
1404 template <typename R, typename T1, typename T2,typename T3,typename T4>
1405 Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr)(T1,T2,T3,T4)) {
1406  return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
1407 }
1408 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1409 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5)) {
1410  return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
1411 }
1412 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1413 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6)) {
1414  return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
1415 }
1416 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1417 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7)) {
1418  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
1419 }
1420 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1421 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8)) {
1422  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
1423 }
1424 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1425 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr)(T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
1426  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
1427 }
1441 template <typename R>
1443  return Callback<R> ();
1444 }
1445 template <typename R, typename T1>
1447  return Callback<R,T1> ();
1448 }
1449 template <typename R, typename T1, typename T2>
1451  return Callback<R,T1,T2> ();
1452 }
1453 template <typename R, typename T1, typename T2,typename T3>
1455  return Callback<R,T1,T2,T3> ();
1456 }
1457 template <typename R, typename T1, typename T2,typename T3,typename T4>
1459  return Callback<R,T1,T2,T3,T4> ();
1460 }
1461 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1463  return Callback<R,T1,T2,T3,T4,T5> ();
1464 }
1465 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1468 }
1469 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1472 }
1473 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1476 }
1477 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1480 }
1492 template <typename R, typename TX, typename ARG>
1493 Callback<R> MakeBoundCallback (R (*fnPtr)(TX), ARG a1) {
1495  Create<BoundFunctorCallbackImpl<R (*)(TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1);
1496  return Callback<R> (impl);
1497 }
1498 template <typename R, typename TX, typename ARG,
1499  typename T1>
1500 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX,T1), ARG a1) {
1502  Create<BoundFunctorCallbackImpl<R (*)(TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1503  return Callback<R,T1> (impl);
1504 }
1505 template <typename R, typename TX, typename ARG,
1506  typename T1, typename T2>
1507 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX,T1,T2), ARG a1) {
1509  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a1);
1510  return Callback<R,T1,T2> (impl);
1511 }
1512 template <typename R, typename TX, typename ARG,
1513  typename T1, typename T2,typename T3>
1514 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3), ARG a1) {
1516  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a1);
1517  return Callback<R,T1,T2,T3> (impl);
1518 }
1519 template <typename R, typename TX, typename ARG,
1520  typename T1, typename T2,typename T3,typename T4>
1521 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4), ARG a1) {
1523  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a1);
1524  return Callback<R,T1,T2,T3,T4> (impl);
1525 }
1526 template <typename R, typename TX, typename ARG,
1527  typename T1, typename T2,typename T3,typename T4,typename T5>
1528 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5), ARG a1) {
1530  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a1);
1531  return Callback<R,T1,T2,T3,T4,T5> (impl);
1532 }
1533 template <typename R, typename TX, typename ARG,
1534  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1535 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6), ARG a1) {
1537  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a1);
1538  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1539 }
1540 template <typename R, typename TX, typename ARG,
1541  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1542 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7), ARG a1) {
1544  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a1);
1545  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1546 }
1547 template <typename R, typename TX, typename ARG,
1548  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
1549 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr)(TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a1) {
1551  Create<BoundFunctorCallbackImpl<R (*)(TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a1);
1553 }
1565 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2>
1566 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2), ARG1 a1, ARG2 a2) {
1568  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2),R,TX1,TX2,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2);
1569  return Callback<R> (impl);
1570 }
1571 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1572  typename T1>
1573 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1), ARG1 a1, ARG2 a2) {
1575  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1),R,TX1,TX2,T1,empty,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1576  return Callback<R,T1> (impl);
1577 }
1578 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1579  typename T1, typename T2>
1580 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2), ARG1 a1, ARG2 a2) {
1582  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2),R,TX1,TX2,T1,T2,empty,empty,empty,empty,empty> > (fnPtr, a1, a2);
1583  return Callback<R,T1,T2> (impl);
1584 }
1585 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1586  typename T1, typename T2,typename T3>
1587 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3), ARG1 a1, ARG2 a2) {
1589  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3),R,TX1,TX2,T1,T2,T3,empty,empty,empty,empty> > (fnPtr, a1, a2);
1590  return Callback<R,T1,T2,T3> (impl);
1591 }
1592 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1593  typename T1, typename T2,typename T3,typename T4>
1594 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4), ARG1 a1, ARG2 a2) {
1596  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4),R,TX1,TX2,T1,T2,T3,T4,empty,empty,empty> > (fnPtr, a1, a2);
1597  return Callback<R,T1,T2,T3,T4> (impl);
1598 }
1599 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1600  typename T1, typename T2,typename T3,typename T4,typename T5>
1601 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2) {
1603  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5),R,TX1,TX2,T1,T2,T3,T4,T5,empty,empty> > (fnPtr, a1, a2);
1604  return Callback<R,T1,T2,T3,T4,T5> (impl);
1605 }
1606 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1607  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1608 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr)(TX1,TX2,T1,T2,T3,T4,T5,T6), ARG1 a1, ARG2 a2) {
1610  Create<TwoBoundFunctorCallbackImpl<R (*)(TX1,TX2,T1,T2,T3,T4,T5,T6),R,TX1,TX2,T1,T2,T3,T4,T5,T6,empty> > (fnPtr, a1, a2);
1611  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1612 }
1613 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2,
1614  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1615 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) {
1617  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);
1618  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1619 }
1632 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3>
1633 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3), ARG1 a1, ARG2 a2, ARG3 a3) {
1635  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3),R,TX1,TX2,TX3,empty,empty,empty,empty,empty,empty> >(fnPtr, a1, a2, a3);
1636  return Callback<R> (impl);
1637 }
1638 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1639  typename T1>
1640 Callback<R,T1> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1), ARG1 a1, ARG2 a2, ARG3 a3) {
1642  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1),R,TX1,TX2,TX3,T1,empty,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1643  return Callback<R,T1> (impl);
1644 }
1645 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1646  typename T1, typename T2>
1647 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2), ARG1 a1, ARG2 a2, ARG3 a3) {
1649  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2),R,TX1,TX2,TX3,T1,T2,empty,empty,empty,empty> > (fnPtr, a1, a2, a3);
1650  return Callback<R,T1,T2> (impl);
1651 }
1652 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1653  typename T1, typename T2,typename T3>
1654 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3), ARG1 a1, ARG2 a2, ARG3 a3) {
1656  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3),R,TX1,TX2,TX3,T1,T2,T3,empty,empty,empty> > (fnPtr, a1, a2, a3);
1657  return Callback<R,T1,T2,T3> (impl);
1658 }
1659 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1660  typename T1, typename T2,typename T3,typename T4>
1661 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4), ARG1 a1, ARG2 a2, ARG3 a3) {
1663  Create<ThreeBoundFunctorCallbackImpl<R (*)(TX1,TX2,TX3,T1,T2,T3,T4),R,TX1,TX2,TX3,T1,T2,T3,T4,empty,empty> > (fnPtr, a1, a2, a3);
1664  return Callback<R,T1,T2,T3,T4> (impl);
1665 }
1666 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1667  typename T1, typename T2,typename T3,typename T4,typename T5>
1668 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3,T1,T2,T3,T4,T5), ARG1 a1, ARG2 a2, ARG3 a3) {
1670  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);
1671  return Callback<R,T1,T2,T3,T4,T5> (impl);
1672 }
1673 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3,
1674  typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1675 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) {
1677  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);
1678  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1679 }
1683 } // namespace ns3
1684 
1685 namespace ns3 {
1686 
1688 {
1689 public:
1691  CallbackValue ();
1696  CallbackValue (const CallbackBase &base);
1698  virtual ~CallbackValue ();
1700  void Set (CallbackBase base);
1707  template <typename T>
1708  bool GetAccessor (T &value) const;
1710  virtual Ptr<AttributeValue> Copy (void) const;
1716  virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
1724  virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
1725 private:
1727 };
1728 
1731 
1732 } // namespace ns3
1733 
1734 namespace ns3 {
1735 
1736 template <typename T>
1737 bool CallbackValue::GetAccessor (T &value) const
1738 {
1739  if (value.CheckType (m_value))
1740  {
1741  value.Assign (m_value);
1742  return true;
1743  }
1744  return false;
1745 }
1746 
1747 } // namespace ns3
1748 
1749 
1750 #endif /* CALLBACK_H */
NS_FATAL_x macro definitions.
CallbackValue()
Constructor.
Definition: callback.cc:34
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
virtual ~MemPtrCallbackImpl()
Definition: callback.h:400
Callback template class.
Definition: callback.h:984
void DoAssign(Ptr< const CallbackImplBase > other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1252
virtual ~BoundFunctorCallbackImpl()
Definition: callback.h:549
virtual ~FunctorCallbackImpl()
Definition: callback.h:253
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:1493
Callback< R, T3, T4, T5, T6, T7, T8, T9 > TwoBind(TX1 a1, TX2 a2)
Bind the first two arguments.
Definition: callback.h:1046
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1078
U * PeekPointer(const Ptr< U > &p)
Definition: ptr.h:562
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:555
void Assign(const CallbackBase &other)
Adopt the other's implementation, if type compatible.
Definition: callback.h:1219
Callback< R, T2, T3, T4, T5, T6, T7, T8, T9 > Bind(T a)
Bind the first arguments.
Definition: callback.h:1029
Base class for Callback class.
Definition: callback.h:906
MemPtrCallbackImpl(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct from an object pointer and member function pointer.
Definition: callback.h:398
#define NS_FATAL_ERROR(msg)
Fatal error handling.
Definition: fatal-error.h:100
virtual ~CallbackValue()
Destructor.
Definition: callback.cc:43
Callback< R > MakeNullCallback(void)
Definition: callback.h:1442
CallbackBase m_value
the CallbackBase
Definition: callback.h:1726
bool GetAccessor(T &value) const
Give value my callback, if type compatible.
Definition: callback.h:1737
CallbackImpl for functors with first three arguments bound at construction.
Definition: callback.h:795
AttributeValue implementation for Callback.
Definition: callback.h:1687
The unqualified CallbackImpl class.
Definition: callback.h:158
#define ATTRIBUTE_CHECKER_DEFINE(type)
Declare the AttributeChecker class Checker and the MakeTypeChecker function for class type...
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:259
TypeTraits< TX >::ReferencedType m_a
the bound argument
Definition: callback.h:665
make Callback use a separate empty type
Definition: empty.h:33
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:406
bool CheckType(const CallbackBase &other) const
Check for compatible types.
Definition: callback.h:1211
FunctorCallbackImpl(T const &functor)
Construct from a functor.
Definition: callback.h:251
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:547
OBJ_PTR const m_objPtr
the object pointer
Definition: callback.h:530
ns3::AttributeValue, ns3::AttributeAccessor and ns3::AttributeChecker declarations.
MEM_PTR m_memPtr
the member function pointer
Definition: callback.h:531
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:770
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:649
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1296
CallbackImpl for pointer to member functions.
Definition: callback.h:390
Callback< R, T4, T5, T6, T7, T8, T9 > ThreeBind(TX1 a1, TX2 a2, TX3 a3)
Bind the first three arguments.
Definition: callback.h:1064
bool DoCheckType(Ptr< const CallbackImplBase > other) const
Check for compatible types.
Definition: callback.h:1233
Abstract base class for CallbackImpl Provides reference counting and equality test.
Definition: callback.h:139
CallbackImpl for functors with first two arguments bound at construction.
Definition: callback.h:673
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:515
Callback(Ptr< CallbackImpl< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > > const &impl)
Construct from a CallbackImpl pointer.
Definition: callback.h:1018
R operator()(void) const
Functor with varying numbers of arguments.
Definition: callback.h:1091
TypeTraits< TX3 >::ReferencedType m_a3
third bound argument
Definition: callback.h:898
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:1278
virtual ~CallbackImplBase()
Virtual destructor.
Definition: callback.h:143
static std::string Demangle(const std::string &mangled)
Definition: callback.cc:129
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsEqual(const CallbackBase &other) const
Equality test.
Definition: callback.h:1201
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:896
Callback(OBJ_PTR const &objPtr, MEM_PTR memPtr)
Construct a member function pointer call back.
Definition: callback.h:1009
Declaration of Attribute helper macros.
T m_functor
the functor
Definition: callback.h:382
#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:690
virtual ~CallbackImpl()
Definition: callback.h:233
TypeTraits< TX1 >::ReferencedType m_a1
first bound argument
Definition: callback.h:786
Callback(FUNCTOR const &functor, bool, bool)
Construct a functor call back, supporting operator() calls.
Definition: callback.h:998
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:368
CallbackImpl for functors with first argument bound at construction.
Definition: callback.h:539
TwoBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2)
Construct from functor and two arguments.
Definition: callback.h:682
CallbackImpl with functors.
Definition: callback.h:244
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.
Type trait reference values.
Definition: type-traits.h:31
virtual std::string SerializeToString(Ptr< const AttributeChecker > checker) const
Serialize to string.
Definition: callback.cc:61
T m_functor
The functor.
Definition: callback.h:664
virtual bool IsEqual(Ptr< const CallbackImplBase > other) const
Equality test.
Definition: callback.h:880
void Nullify(void)
Discard the implementation, set it to null.
Definition: callback.h:1082
Definition of class ns3::empty, used by callbacks.
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:897
CallbackBase(Ptr< CallbackImplBase > impl)
Construct from a pimpl.
Definition: callback.h:916
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:1224
Ptr< CallbackImplBase > m_impl
the pimpl
Definition: callback.h:917
void Set(CallbackBase base)
Definition: callback.cc:48
Reference counting for smart pointers.
TypeTraits< TX2 >::ReferencedType m_a2
second bound argument
Definition: callback.h:787
Ptr< CallbackImplBase > GetImpl(void) const
Definition: callback.h:910
TypeTraits introspection template.
ThreeBoundFunctorCallbackImpl(FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
Construct from functor and three arguments.
Definition: callback.h:805
R operator()(void)
Functor with varying numbers of arguments.
Definition: callback.h:813