00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CALLBACK_H
00022 #define CALLBACK_H
00023
00024 #include "ptr.h"
00025 #include "fatal-error.h"
00026 #include "empty.h"
00027 #include "type-traits.h"
00028 #include "attribute.h"
00029 #include "attribute-helper.h"
00030 #include <typeinfo>
00031
00032 namespace ns3 {
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 template <typename T>
00064 struct CallbackTraits;
00065
00066 template <typename T>
00067 struct CallbackTraits<T *>
00068 {
00069 static T & GetReference (T * const p)
00070 {
00071 return *p;
00072 }
00073 };
00074
00075 class CallbackImplBase
00076 {
00077 public:
00078 CallbackImplBase ()
00079 : m_count (1) {}
00080 virtual ~CallbackImplBase () {}
00081 void Ref (void) const {
00082 m_count++;
00083 }
00084 void Unref (void) const {
00085 m_count--;
00086 if (m_count == 0) {
00087 delete this;
00088 }
00089 }
00090 uint32_t GetReferenceCount (void) const { return m_count; }
00091 virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
00092 private:
00093 mutable uint32_t m_count;
00094 };
00095
00096
00097 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
00098 class CallbackImpl;
00099
00100 template <typename R>
00101 class CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
00102 public:
00103 virtual ~CallbackImpl () {}
00104 virtual R operator() (void) = 0;
00105 };
00106
00107 template <typename R, typename T1>
00108 class CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
00109 public:
00110 virtual ~CallbackImpl () {}
00111 virtual R operator() (T1) = 0;
00112 };
00113
00114 template <typename R, typename T1, typename T2>
00115 class CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
00116 public:
00117 virtual ~CallbackImpl () {}
00118 virtual R operator() (T1, T2) = 0;
00119 };
00120
00121 template <typename R, typename T1, typename T2, typename T3>
00122 class CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
00123 public:
00124 virtual ~CallbackImpl () {}
00125 virtual R operator() (T1, T2, T3) = 0;
00126 };
00127
00128 template <typename R, typename T1, typename T2, typename T3, typename T4>
00129 class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
00130 public:
00131 virtual ~CallbackImpl () {}
00132 virtual R operator() (T1, T2, T3, T4) = 0;
00133 };
00134
00135 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
00136 class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
00137 public:
00138 virtual ~CallbackImpl () {}
00139 virtual R operator() (T1, T2, T3, T4, T5) = 0;
00140 };
00141
00142 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
00143 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
00144 public:
00145 virtual ~CallbackImpl () {}
00146 virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
00147 };
00148
00149 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
00150 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
00151 public:
00152 virtual ~CallbackImpl () {}
00153 virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
00154 };
00155
00156 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
00157 class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
00158 public:
00159 virtual ~CallbackImpl () {}
00160 virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
00161 };
00162
00163 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
00164 class CallbackImpl : public CallbackImplBase {
00165 public:
00166 virtual ~CallbackImpl () {}
00167 virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
00168 };
00169
00170
00171
00172 template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
00173 class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
00174 public:
00175 FunctorCallbackImpl (T const &functor)
00176 : m_functor (functor) {}
00177 virtual ~FunctorCallbackImpl () {}
00178 R operator() (void) {
00179 return m_functor ();
00180 }
00181 R operator() (T1 a1) {
00182 return m_functor (a1);
00183 }
00184 R operator() (T1 a1,T2 a2) {
00185 return m_functor (a1,a2);
00186 }
00187 R operator() (T1 a1,T2 a2,T3 a3) {
00188 return m_functor (a1,a2,a3);
00189 }
00190 R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
00191 return m_functor (a1,a2,a3,a4);
00192 }
00193 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
00194 return m_functor (a1,a2,a3,a4,a5);
00195 }
00196 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
00197 return m_functor (a1,a2,a3,a4,a5,a6);
00198 }
00199 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
00200 return m_functor (a1,a2,a3,a4,a5,a6,a7);
00201 }
00202 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
00203 return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
00204 }
00205 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
00206 return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
00207 }
00208 virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
00209 FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived =
00210 dynamic_cast<FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer(other));
00211 if (otherDerived == 0)
00212 {
00213 return false;
00214 }
00215 else if (otherDerived->m_functor != m_functor)
00216 {
00217 return false;
00218 }
00219 return true;
00220 }
00221 private:
00222 T m_functor;
00223 };
00224
00225
00226 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>
00227 class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
00228 public:
00229 MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR mem_ptr)
00230 : m_objPtr (objPtr), m_memPtr (mem_ptr) {}
00231 virtual ~MemPtrCallbackImpl () {}
00232 R operator() (void) {
00233 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) ();
00234 }
00235 R operator() (T1 a1) {
00236 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1);
00237 }
00238 R operator() (T1 a1,T2 a2) {
00239 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2);
00240 }
00241 R operator() (T1 a1,T2 a2,T3 a3) {
00242 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3);
00243 }
00244 R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
00245 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4);
00246 }
00247 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
00248 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5);
00249 }
00250 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
00251 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6);
00252 }
00253 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
00254 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7);
00255 }
00256 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
00257 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8);
00258 }
00259 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
00260 return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8, a9);
00261 }
00262 virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
00263 MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived =
00264 dynamic_cast<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer (other));
00265 if (otherDerived == 0)
00266 {
00267 return false;
00268 }
00269 else if (otherDerived->m_objPtr != m_objPtr ||
00270 otherDerived->m_memPtr != m_memPtr)
00271 {
00272 return false;
00273 }
00274 return true;
00275 }
00276 private:
00277 OBJ_PTR const m_objPtr;
00278 MEM_PTR m_memPtr;
00279 };
00280
00281
00282 template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
00283 class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
00284 public:
00285 template <typename FUNCTOR, typename ARG>
00286 BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
00287 : m_functor (functor), m_a (a) {}
00288 virtual ~BoundFunctorCallbackImpl () {}
00289 R operator() (void) {
00290 return m_functor (m_a);
00291 }
00292 R operator() (T1 a1) {
00293 return m_functor (m_a,a1);
00294 }
00295 R operator() (T1 a1,T2 a2) {
00296 return m_functor (m_a,a1,a2);
00297 }
00298 R operator() (T1 a1,T2 a2,T3 a3) {
00299 return m_functor (m_a,a1,a2,a3);
00300 }
00301 R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
00302 return m_functor (m_a,a1,a2,a3,a4);
00303 }
00304 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
00305 return m_functor (m_a,a1,a2,a3,a4,a5);
00306 }
00307 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
00308 return m_functor (m_a,a1,a2,a3,a4,a5,a6);
00309 }
00310 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
00311 return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
00312 }
00313 R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
00314 return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
00315 }
00316 virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
00317 BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *otherDerived =
00318 dynamic_cast<BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *> (PeekPointer (other));
00319 if (otherDerived == 0)
00320 {
00321 return false;
00322 }
00323 else if (otherDerived->m_functor != m_functor ||
00324 otherDerived->m_a != m_a)
00325 {
00326 return false;
00327 }
00328 return true;
00329 }
00330 private:
00331 T m_functor;
00332 typename TypeTraits<TX>::ReferencedType m_a;
00333 };
00334
00335
00336 class CallbackBase {
00337 public:
00338 CallbackBase () : m_impl () {}
00339 Ptr<CallbackImplBase> GetImpl (void) const {return m_impl;}
00340 protected:
00341 CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
00342 Ptr<CallbackImplBase> m_impl;
00343 };
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374 template<typename R,
00375 typename T1 = empty, typename T2 = empty,
00376 typename T3 = empty, typename T4 = empty,
00377 typename T5 = empty, typename T6 = empty,
00378 typename T7 = empty, typename T8 = empty,
00379 typename T9 = empty>
00380 class Callback : public CallbackBase {
00381 public:
00382 Callback () {}
00383
00384
00385
00386 template <typename FUNCTOR>
00387 Callback (FUNCTOR const &functor, bool, bool)
00388 : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
00389 {}
00390
00391 template <typename OBJ_PTR, typename MEM_PTR>
00392 Callback (OBJ_PTR const &objPtr, MEM_PTR mem_ptr)
00393 : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, mem_ptr))
00394 {}
00395
00396 Callback (Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > const &impl)
00397 : CallbackBase (impl)
00398 {}
00399
00400 template <typename T>
00401 Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> Bind (T a) {
00402 Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > impl =
00403 Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > (
00404 new BoundFunctorCallbackImpl<
00405 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9>,
00406 R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
00407 return Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> (impl);
00408 }
00409
00410 bool IsNull (void) const {
00411 return (DoPeekImpl () == 0)?true:false;
00412 }
00413 void Nullify (void) {
00414 m_impl = 0;
00415 }
00416
00417 R operator() (void) const {
00418 return (*(DoPeekImpl ())) ();
00419 }
00420 R operator() (T1 a1) const {
00421 return (*(DoPeekImpl ())) (a1);
00422 }
00423 R operator() (T1 a1, T2 a2) const {
00424 return (*(DoPeekImpl ())) (a1,a2);
00425 }
00426 R operator() (T1 a1, T2 a2, T3 a3) const {
00427 return (*(DoPeekImpl ())) (a1,a2,a3);
00428 }
00429 R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
00430 return (*(DoPeekImpl ())) (a1,a2,a3,a4);
00431 }
00432 R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
00433 return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5);
00434 }
00435 R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
00436 return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6);
00437 }
00438 R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
00439 return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7);
00440 }
00441 R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
00442 return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8);
00443 }
00444 R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
00445 return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8,a9);
00446 }
00447
00448 bool IsEqual (const CallbackBase &other) const {
00449 return m_impl->IsEqual (other.GetImpl ());
00450 }
00451
00452 bool CheckType (const CallbackBase & other) const {
00453 return DoCheckType (other.GetImpl ());
00454 }
00455 void Assign (const CallbackBase &other) {
00456 DoAssign (other.GetImpl ());
00457 }
00458 private:
00459 CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *DoPeekImpl (void) const {
00460 return static_cast<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (m_impl));
00461 }
00462 bool DoCheckType (Ptr<const CallbackImplBase> other) const {
00463 if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
00464 {
00465 return true;
00466 }
00467 else if (other == 0)
00468 {
00469 return true;
00470 }
00471 else
00472 {
00473 return false;
00474 }
00475 }
00476 void DoAssign (Ptr<const CallbackImplBase> other) {
00477 if (!DoCheckType (other))
00478 {
00479 NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\")"
00480 " got=" << typeid (*other).name () <<
00481 ", expected=" << typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name ());
00482 }
00483 m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
00484 }
00485 };
00486
00487
00488 template <typename R, typename T1, typename T2,
00489 typename T3, typename T4,
00490 typename T5, typename T6,
00491 typename T7, typename T8,
00492 typename T9>
00493 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)
00494 {
00495 return !a.IsEqual (b);
00496 }
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512 template <typename T, typename OBJ, typename R>
00513 Callback<R> MakeCallback (R (T::*memPtr) (void), OBJ objPtr) {
00514 return Callback<R> (objPtr, memPtr);
00515 }
00516 template <typename T, typename OBJ, typename R>
00517 Callback<R> MakeCallback (R (T::*mem_ptr) () const, OBJ objPtr) {
00518 return Callback<R> (objPtr, mem_ptr);
00519 }
00520
00521
00522
00523
00524
00525
00526
00527
00528 template <typename T, typename OBJ, typename R, typename T1>
00529 Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1), OBJ objPtr) {
00530 return Callback<R,T1> (objPtr, mem_ptr);
00531 }
00532 template <typename T, typename OBJ, typename R, typename T1>
00533 Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1) const, OBJ objPtr) {
00534 return Callback<R,T1> (objPtr, mem_ptr);
00535 }
00536
00537
00538
00539
00540
00541
00542
00543
00544 template <typename T, typename OBJ, typename R, typename T1, typename T2>
00545 Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2), OBJ objPtr) {
00546 return Callback<R,T1,T2> (objPtr, mem_ptr);
00547 }
00548 template <typename T, typename OBJ, typename R, typename T1, typename T2>
00549 Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2) const, OBJ objPtr) {
00550 return Callback<R,T1,T2> (objPtr, mem_ptr);
00551 }
00552
00553
00554
00555
00556
00557
00558
00559
00560 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
00561 Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3), OBJ objPtr) {
00562 return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
00563 }
00564 template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
00565 Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3) const, OBJ objPtr) {
00566 return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
00567 }
00568
00569
00570
00571
00572
00573
00574
00575
00576 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
00577 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4), OBJ objPtr) {
00578 return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
00579 }
00580 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
00581 Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4) const, OBJ objPtr) {
00582 return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
00583 }
00584
00585
00586
00587
00588
00589
00590
00591
00592 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
00593 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ objPtr) {
00594 return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
00595 }
00596 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
00597 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5) const, OBJ objPtr) {
00598 return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
00599 }
00600
00601
00602
00603
00604
00605
00606
00607
00608 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
00609 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6), OBJ objPtr) {
00610 return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
00611 }
00612 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
00613 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
00614 return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
00615 }
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
00626 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
00627 return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
00628 }
00629 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
00630 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
00631 return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
00632 }
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
00644 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
00645 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
00646 }
00647 template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
00648 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8) const, OBJ objPtr) {
00649 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
00650 }
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660 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>
00661 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8,T9), OBJ objPtr) {
00662 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
00663 }
00664 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>
00665 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8,T9) const, OBJ objPtr) {
00666 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
00667 }
00668
00669
00670
00671
00672
00673
00674
00675
00676 template <typename R>
00677 Callback<R> MakeCallback (R (*fnPtr) ()) {
00678 return Callback<R> (fnPtr, true, true);
00679 }
00680
00681
00682
00683
00684
00685
00686
00687 template <typename R, typename T1>
00688 Callback<R,T1> MakeCallback (R (*fnPtr) (T1)) {
00689 return Callback<R,T1> (fnPtr, true, true);
00690 }
00691
00692
00693
00694
00695
00696
00697
00698 template <typename R, typename T1, typename T2>
00699 Callback<R,T1,T2> MakeCallback (R (*fnPtr) (T1,T2)) {
00700 return Callback<R,T1,T2> (fnPtr, true, true);
00701 }
00702
00703
00704
00705
00706
00707
00708
00709 template <typename R, typename T1, typename T2,typename T3>
00710 Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr) (T1,T2,T3)) {
00711 return Callback<R,T1,T2,T3> (fnPtr, true, true);
00712 }
00713
00714
00715
00716
00717
00718
00719
00720 template <typename R, typename T1, typename T2,typename T3,typename T4>
00721 Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr) (T1,T2,T3,T4)) {
00722 return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
00723 }
00724
00725
00726
00727
00728
00729
00730
00731 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
00732 Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5)) {
00733 return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
00734 }
00735
00736
00737
00738
00739
00740
00741
00742 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
00743 Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6)) {
00744 return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
00745 }
00746
00747
00748
00749
00750
00751
00752
00753
00754 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
00755 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7)) {
00756 return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
00757 }
00758
00759
00760
00761
00762
00763
00764
00765
00766 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
00767 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8)) {
00768 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
00769 }
00770
00771
00772
00773
00774
00775
00776
00777
00778 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
00779 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
00780 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
00781 }
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791 template <typename R>
00792 Callback<R> MakeNullCallback (void) {
00793 return Callback<R> ();
00794 }
00795
00796
00797
00798
00799
00800
00801
00802 template <typename R, typename T1>
00803 Callback<R,T1> MakeNullCallback (void) {
00804 return Callback<R,T1> ();
00805 }
00806
00807
00808
00809
00810
00811
00812
00813 template <typename R, typename T1, typename T2>
00814 Callback<R,T1,T2> MakeNullCallback (void) {
00815 return Callback<R,T1,T2> ();
00816 }
00817
00818
00819
00820
00821
00822
00823
00824 template <typename R, typename T1, typename T2,typename T3>
00825 Callback<R,T1,T2,T3> MakeNullCallback (void) {
00826 return Callback<R,T1,T2,T3> ();
00827 }
00828
00829
00830
00831
00832
00833
00834
00835 template <typename R, typename T1, typename T2,typename T3,typename T4>
00836 Callback<R,T1,T2,T3,T4> MakeNullCallback (void) {
00837 return Callback<R,T1,T2,T3,T4> ();
00838 }
00839
00840
00841
00842
00843
00844
00845
00846 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
00847 Callback<R,T1,T2,T3,T4,T5> MakeNullCallback (void) {
00848 return Callback<R,T1,T2,T3,T4,T5> ();
00849 }
00850
00851
00852
00853
00854
00855
00856
00857 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
00858 Callback<R,T1,T2,T3,T4,T5,T6> MakeNullCallback (void) {
00859 return Callback<R,T1,T2,T3,T4,T5,T6> ();
00860 }
00861
00862
00863
00864
00865
00866
00867
00868
00869 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
00870 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeNullCallback (void) {
00871 return Callback<R,T1,T2,T3,T4,T5,T6,T7> ();
00872 }
00873
00874
00875
00876
00877
00878
00879
00880
00881 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
00882 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeNullCallback (void) {
00883 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> ();
00884 }
00885
00886
00887
00888
00889
00890
00891
00892
00893 template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
00894 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeNullCallback (void) {
00895 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> ();
00896 }
00897
00898
00899
00900
00901
00902
00903
00904
00905 template <typename R, typename TX, typename ARG>
00906 Callback<R> MakeBoundCallback (R (*fnPtr) (TX), ARG a) {
00907 Ptr<CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
00908 Create<BoundFunctorCallbackImpl<R (*) (TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a);
00909 return Callback<R> (impl);
00910 }
00911
00912 template <typename R, typename TX, typename ARG,
00913 typename T1>
00914 Callback<R,T1> MakeBoundCallback (R (*fnPtr) (TX,T1), ARG a) {
00915 Ptr<CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
00916 Create<BoundFunctorCallbackImpl<R (*) (TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
00917 return Callback<R,T1> (impl);
00918 }
00919 template <typename R, typename TX, typename ARG,
00920 typename T1, typename T2>
00921 Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr) (TX,T1,T2), ARG a) {
00922 Ptr<CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> > impl =
00923 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
00924 return Callback<R,T1,T2> (impl);
00925 }
00926 template <typename R, typename TX, typename ARG,
00927 typename T1, typename T2,typename T3>
00928 Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3), ARG a) {
00929 Ptr<CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> > impl =
00930 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a);
00931 return Callback<R,T1,T2,T3> (impl);
00932 }
00933 template <typename R, typename TX, typename ARG,
00934 typename T1, typename T2,typename T3,typename T4>
00935 Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4), ARG a) {
00936 Ptr<CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> > impl =
00937 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a);
00938 return Callback<R,T1,T2,T3,T4> (impl);
00939 }
00940 template <typename R, typename TX, typename ARG,
00941 typename T1, typename T2,typename T3,typename T4,typename T5>
00942 Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5), ARG a) {
00943 Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> > impl =
00944 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a);
00945 return Callback<R,T1,T2,T3,T4,T5> (impl);
00946 }
00947 template <typename R, typename TX, typename ARG,
00948 typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
00949 Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6), ARG a) {
00950 Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> > impl =
00951 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a);
00952 return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
00953 }
00954 template <typename R, typename TX, typename ARG,
00955 typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
00956 Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7), ARG a) {
00957 Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> > impl =
00958 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a);
00959 return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
00960 }
00961 template <typename R, typename TX, typename ARG,
00962 typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
00963 Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a) {
00964 Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> > impl =
00965 Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a);
00966 return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (impl);
00967 }
00968 }
00969
00970 namespace ns3 {
00971
00972 class CallbackValue : public AttributeValue
00973 {
00974 public:
00975 CallbackValue ();
00976 CallbackValue (const CallbackBase &base);
00977 virtual ~CallbackValue ();
00978 void Set (CallbackBase base);
00979 template <typename T>
00980 bool GetAccessor (T &value) const;
00981 virtual Ptr<AttributeValue> Copy (void) const;
00982 virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
00983 virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
00984 private:
00985 CallbackBase m_value;
00986 };
00987
00988 ATTRIBUTE_ACCESSOR_DEFINE(Callback);
00989 ATTRIBUTE_CHECKER_DEFINE (Callback);
00990
00991 }
00992
00993 namespace ns3 {
00994
00995 template <typename T>
00996 bool CallbackValue::GetAccessor (T &value) const
00997 {
00998 if (value.CheckType (m_value))
00999 {
01000 value.Assign (m_value);
01001 return true;
01002 }
01003 return false;
01004 }
01005
01006 }
01007
01008
01009 #endif