1.1 --- a/src/core/callback.h Sun Nov 30 22:53:13 2008 +0100
1.2 +++ b/src/core/callback.h Mon Dec 01 09:22:24 2008 +0100
1.3 @@ -31,977 +31,977 @@
1.4
1.5 namespace ns3 {
1.6
1.7 - /***
1.8 - * \internal
1.9 - * This code was originally written based on the techniques
1.10 - * described in http://www.codeproject.com/cpp/TTLFunction.asp
1.11 - * It was subsequently rewritten to follow the architecture
1.12 - * outlined in "Modern C++ Design" by Andrei Alexandrescu in
1.13 - * chapter 5, "Generalized Functors".
1.14 - *
1.15 - * This code uses:
1.16 - * - default template parameters to saves users from having to
1.17 - * specify empty parameters when the number of parameters
1.18 - * is smaller than the maximum supported number
1.19 - * - the pimpl idiom: the Callback class is passed around by
1.20 - * value and delegates the crux of the work to its pimpl
1.21 - * pointer.
1.22 - * - two pimpl implementations which derive from CallbackImpl
1.23 - * FunctorCallbackImpl can be used with any functor-type
1.24 - * while MemPtrCallbackImpl can be used with pointers to
1.25 - * member functions.
1.26 - * - a reference list implementation to implement the Callback's
1.27 - * value semantics.
1.28 - *
1.29 - * This code most notably departs from the alexandrescu
1.30 - * implementation in that it does not use type lists to specify
1.31 - * and pass around the types of the callback arguments.
1.32 - * Of course, it also does not use copy-destruction semantics
1.33 - * and relies on a reference list rather than autoPtr to hold
1.34 - * the pointer.
1.35 - */
1.36 - template <typename T>
1.37 - struct CallbackTraits;
1.38 +/***
1.39 + * \internal
1.40 + * This code was originally written based on the techniques
1.41 + * described in http://www.codeproject.com/cpp/TTLFunction.asp
1.42 + * It was subsequently rewritten to follow the architecture
1.43 + * outlined in "Modern C++ Design" by Andrei Alexandrescu in
1.44 + * chapter 5, "Generalized Functors".
1.45 + *
1.46 + * This code uses:
1.47 + * - default template parameters to saves users from having to
1.48 + * specify empty parameters when the number of parameters
1.49 + * is smaller than the maximum supported number
1.50 + * - the pimpl idiom: the Callback class is passed around by
1.51 + * value and delegates the crux of the work to its pimpl
1.52 + * pointer.
1.53 + * - two pimpl implementations which derive from CallbackImpl
1.54 + * FunctorCallbackImpl can be used with any functor-type
1.55 + * while MemPtrCallbackImpl can be used with pointers to
1.56 + * member functions.
1.57 + * - a reference list implementation to implement the Callback's
1.58 + * value semantics.
1.59 + *
1.60 + * This code most notably departs from the alexandrescu
1.61 + * implementation in that it does not use type lists to specify
1.62 + * and pass around the types of the callback arguments.
1.63 + * Of course, it also does not use copy-destruction semantics
1.64 + * and relies on a reference list rather than autoPtr to hold
1.65 + * the pointer.
1.66 + */
1.67 +template <typename T>
1.68 +struct CallbackTraits;
1.69 +
1.70 +template <typename T>
1.71 +struct CallbackTraits<T *>
1.72 +{
1.73 + static T & GetReference (T * const p)
1.74 + {
1.75 + return *p;
1.76 + }
1.77 +};
1.78 +
1.79 +class CallbackImplBase
1.80 +{
1.81 +public:
1.82 + CallbackImplBase ()
1.83 + : m_count (1) {}
1.84 + virtual ~CallbackImplBase () {}
1.85 + void Ref (void) const {
1.86 + m_count++;
1.87 + }
1.88 + void Unref (void) const {
1.89 + m_count--;
1.90 + if (m_count == 0) {
1.91 + delete this;
1.92 + }
1.93 + }
1.94 + uint32_t GetReferenceCount (void) const { return m_count; }
1.95 + virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
1.96 +private:
1.97 + mutable uint32_t m_count;
1.98 +};
1.99 +
1.100 +// declare the CallbackImpl class
1.101 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
1.102 +class CallbackImpl;
1.103 +// define CallbackImpl for 0 params
1.104 +template <typename R>
1.105 +class CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.106 +public:
1.107 + virtual ~CallbackImpl () {}
1.108 + virtual R operator() (void) = 0;
1.109 +};
1.110 +// define CallbackImpl for 1 params
1.111 +template <typename R, typename T1>
1.112 +class CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.113 +public:
1.114 + virtual ~CallbackImpl () {}
1.115 + virtual R operator() (T1) = 0;
1.116 +};
1.117 +// define CallbackImpl for 2 params
1.118 +template <typename R, typename T1, typename T2>
1.119 +class CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.120 +public:
1.121 + virtual ~CallbackImpl () {}
1.122 + virtual R operator() (T1, T2) = 0;
1.123 +};
1.124 +// define CallbackImpl for 3 params
1.125 +template <typename R, typename T1, typename T2, typename T3>
1.126 +class CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.127 +public:
1.128 + virtual ~CallbackImpl () {}
1.129 + virtual R operator() (T1, T2, T3) = 0;
1.130 +};
1.131 +// define CallbackImpl for 4 params
1.132 +template <typename R, typename T1, typename T2, typename T3, typename T4>
1.133 +class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.134 +public:
1.135 + virtual ~CallbackImpl () {}
1.136 + virtual R operator() (T1, T2, T3, T4) = 0;
1.137 +};
1.138 +// define CallbackImpl for 5 params
1.139 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
1.140 +class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
1.141 +public:
1.142 + virtual ~CallbackImpl () {}
1.143 + virtual R operator() (T1, T2, T3, T4, T5) = 0;
1.144 +};
1.145 +// define CallbackImpl for 6 params
1.146 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
1.147 +class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
1.148 +public:
1.149 + virtual ~CallbackImpl () {}
1.150 + virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
1.151 +};
1.152 +// define CallbackImpl for 7 params
1.153 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
1.154 +class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
1.155 +public:
1.156 + virtual ~CallbackImpl () {}
1.157 + virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
1.158 +};
1.159 +// define CallbackImpl for 8 params
1.160 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1.161 +class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
1.162 +public:
1.163 + virtual ~CallbackImpl () {}
1.164 + virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
1.165 +};
1.166 +// define CallbackImpl for 9 params
1.167 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
1.168 +class CallbackImpl : public CallbackImplBase {
1.169 +public:
1.170 + virtual ~CallbackImpl () {}
1.171 + virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
1.172 +};
1.173 +
1.174 +
1.175 +// an impl for Functors:
1.176 +template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
1.177 +class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
1.178 +public:
1.179 + FunctorCallbackImpl (T const &functor)
1.180 + : m_functor (functor) {}
1.181 + virtual ~FunctorCallbackImpl () {}
1.182 + R operator() (void) {
1.183 + return m_functor ();
1.184 + }
1.185 + R operator() (T1 a1) {
1.186 + return m_functor (a1);
1.187 + }
1.188 + R operator() (T1 a1,T2 a2) {
1.189 + return m_functor (a1,a2);
1.190 + }
1.191 + R operator() (T1 a1,T2 a2,T3 a3) {
1.192 + return m_functor (a1,a2,a3);
1.193 + }
1.194 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1.195 + return m_functor (a1,a2,a3,a4);
1.196 + }
1.197 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1.198 + return m_functor (a1,a2,a3,a4,a5);
1.199 + }
1.200 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1.201 + return m_functor (a1,a2,a3,a4,a5,a6);
1.202 + }
1.203 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
1.204 + return m_functor (a1,a2,a3,a4,a5,a6,a7);
1.205 + }
1.206 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
1.207 + return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
1.208 + }
1.209 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
1.210 + return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
1.211 + }
1.212 + virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1.213 + FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived =
1.214 + dynamic_cast<FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer(other));
1.215 + if (otherDerived == 0)
1.216 + {
1.217 + return false;
1.218 + }
1.219 + else if (otherDerived->m_functor != m_functor)
1.220 + {
1.221 + return false;
1.222 + }
1.223 + return true;
1.224 + }
1.225 +private:
1.226 + T m_functor;
1.227 +};
1.228 +
1.229 +// an impl for pointer to member functions
1.230 +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>
1.231 +class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
1.232 +public:
1.233 + MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR mem_ptr)
1.234 + : m_objPtr (objPtr), m_memPtr (mem_ptr) {}
1.235 + virtual ~MemPtrCallbackImpl () {}
1.236 + R operator() (void) {
1.237 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) ();
1.238 + }
1.239 + R operator() (T1 a1) {
1.240 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1);
1.241 + }
1.242 + R operator() (T1 a1,T2 a2) {
1.243 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2);
1.244 + }
1.245 + R operator() (T1 a1,T2 a2,T3 a3) {
1.246 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3);
1.247 + }
1.248 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1.249 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4);
1.250 + }
1.251 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1.252 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5);
1.253 + }
1.254 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1.255 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6);
1.256 + }
1.257 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
1.258 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7);
1.259 + }
1.260 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
1.261 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8);
1.262 + }
1.263 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
1.264 + return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8, a9);
1.265 + }
1.266 + virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1.267 + MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived =
1.268 + dynamic_cast<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer (other));
1.269 + if (otherDerived == 0)
1.270 + {
1.271 + return false;
1.272 + }
1.273 + else if (otherDerived->m_objPtr != m_objPtr ||
1.274 + otherDerived->m_memPtr != m_memPtr)
1.275 + {
1.276 + return false;
1.277 + }
1.278 + return true;
1.279 + }
1.280 +private:
1.281 + OBJ_PTR const m_objPtr;
1.282 + MEM_PTR m_memPtr;
1.283 +};
1.284 +
1.285 +// an impl for Bound Functors:
1.286 +template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1.287 +class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
1.288 +public:
1.289 + template <typename FUNCTOR, typename ARG>
1.290 + BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
1.291 + : m_functor (functor), m_a (a) {}
1.292 + virtual ~BoundFunctorCallbackImpl () {}
1.293 + R operator() (void) {
1.294 + return m_functor (m_a);
1.295 + }
1.296 + R operator() (T1 a1) {
1.297 + return m_functor (m_a,a1);
1.298 + }
1.299 + R operator() (T1 a1,T2 a2) {
1.300 + return m_functor (m_a,a1,a2);
1.301 + }
1.302 + R operator() (T1 a1,T2 a2,T3 a3) {
1.303 + return m_functor (m_a,a1,a2,a3);
1.304 + }
1.305 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1.306 + return m_functor (m_a,a1,a2,a3,a4);
1.307 + }
1.308 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1.309 + return m_functor (m_a,a1,a2,a3,a4,a5);
1.310 + }
1.311 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1.312 + return m_functor (m_a,a1,a2,a3,a4,a5,a6);
1.313 + }
1.314 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
1.315 + return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
1.316 + }
1.317 + R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
1.318 + return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
1.319 + }
1.320 + virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1.321 + BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *otherDerived =
1.322 + dynamic_cast<BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *> (PeekPointer (other));
1.323 + if (otherDerived == 0)
1.324 + {
1.325 + return false;
1.326 + }
1.327 + else if (otherDerived->m_functor != m_functor ||
1.328 + otherDerived->m_a != m_a)
1.329 + {
1.330 + return false;
1.331 + }
1.332 + return true;
1.333 + }
1.334 +private:
1.335 + T m_functor;
1.336 + typename TypeTraits<TX>::ReferencedType m_a;
1.337 +};
1.338 +
1.339 +
1.340 +class CallbackBase {
1.341 +public:
1.342 + CallbackBase () : m_impl () {}
1.343 + Ptr<CallbackImplBase> GetImpl (void) const {return m_impl;}
1.344 +protected:
1.345 + CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
1.346 + Ptr<CallbackImplBase> m_impl;
1.347 +};
1.348 +
1.349 +/**
1.350 + * \brief Callback template class
1.351 + *
1.352 + * This class template implements the Functor Design Pattern.
1.353 + * It is used to declare the type of a Callback:
1.354 + * - the first non-optional template argument represents
1.355 + * the return type of the callback.
1.356 + * - the second optional template argument represents
1.357 + * the type of the first argument to the callback.
1.358 + * - the third optional template argument represents
1.359 + * the type of the second argument to the callback.
1.360 + * - the fourth optional template argument represents
1.361 + * the type of the third argument to the callback.
1.362 + * - the fifth optional template argument represents
1.363 + * the type of the fourth argument to the callback.
1.364 + * - the sixth optional template argument represents
1.365 + * the type of the fifth argument to the callback.
1.366 + *
1.367 + * Callback instances are built with the \ref MakeCallback
1.368 + * template functions. Callback instances have POD semantics:
1.369 + * the memory they allocate is managed automatically, without
1.370 + * user intervention which allows you to pass around Callback
1.371 + * instances by value.
1.372 + *
1.373 + * Sample code which shows how to use this class template
1.374 + * as well as the function templates \ref MakeCallback :
1.375 + * \include samples/main-callback.cc
1.376 + */
1.377 +
1.378 +template<typename R,
1.379 + typename T1 = empty, typename T2 = empty,
1.380 + typename T3 = empty, typename T4 = empty,
1.381 + typename T5 = empty, typename T6 = empty,
1.382 + typename T7 = empty, typename T8 = empty,
1.383 + typename T9 = empty>
1.384 +class Callback : public CallbackBase {
1.385 +public:
1.386 + Callback () {}
1.387 +
1.388 + // There are two dummy args below to ensure that this constructor is
1.389 + // always properly disambiguited by the c++ compiler
1.390 + template <typename FUNCTOR>
1.391 + Callback (FUNCTOR const &functor, bool, bool)
1.392 + : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
1.393 + {}
1.394 +
1.395 + template <typename OBJ_PTR, typename MEM_PTR>
1.396 + Callback (OBJ_PTR const &objPtr, MEM_PTR mem_ptr)
1.397 + : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, mem_ptr))
1.398 + {}
1.399 +
1.400 + Callback (Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > const &impl)
1.401 + : CallbackBase (impl)
1.402 + {}
1.403
1.404 template <typename T>
1.405 - struct CallbackTraits<T *>
1.406 - {
1.407 - static T & GetReference (T * const p)
1.408 - {
1.409 - return *p;
1.410 - }
1.411 - };
1.412 -
1.413 - class CallbackImplBase
1.414 - {
1.415 - public:
1.416 - CallbackImplBase ()
1.417 - : m_count (1) {}
1.418 - virtual ~CallbackImplBase () {}
1.419 - void Ref (void) const {
1.420 - m_count++;
1.421 - }
1.422 - void Unref (void) const {
1.423 - m_count--;
1.424 - if (m_count == 0) {
1.425 - delete this;
1.426 - }
1.427 - }
1.428 - uint32_t GetReferenceCount (void) const { return m_count; }
1.429 - virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
1.430 - private:
1.431 - mutable uint32_t m_count;
1.432 - };
1.433 -
1.434 - // declare the CallbackImpl class
1.435 - template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
1.436 - class CallbackImpl;
1.437 - // define CallbackImpl for 0 params
1.438 - template <typename R>
1.439 - class CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.440 - public:
1.441 - virtual ~CallbackImpl () {}
1.442 - virtual R operator() (void) = 0;
1.443 - };
1.444 - // define CallbackImpl for 1 params
1.445 - template <typename R, typename T1>
1.446 - class CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.447 - public:
1.448 - virtual ~CallbackImpl () {}
1.449 - virtual R operator() (T1) = 0;
1.450 - };
1.451 - // define CallbackImpl for 2 params
1.452 - template <typename R, typename T1, typename T2>
1.453 - class CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.454 - public:
1.455 - virtual ~CallbackImpl () {}
1.456 - virtual R operator() (T1, T2) = 0;
1.457 - };
1.458 - // define CallbackImpl for 3 params
1.459 - template <typename R, typename T1, typename T2, typename T3>
1.460 - class CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.461 - public:
1.462 - virtual ~CallbackImpl () {}
1.463 - virtual R operator() (T1, T2, T3) = 0;
1.464 - };
1.465 - // define CallbackImpl for 4 params
1.466 - template <typename R, typename T1, typename T2, typename T3, typename T4>
1.467 - class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
1.468 - public:
1.469 - virtual ~CallbackImpl () {}
1.470 - virtual R operator() (T1, T2, T3, T4) = 0;
1.471 - };
1.472 - // define CallbackImpl for 5 params
1.473 - template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
1.474 - class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
1.475 - public:
1.476 - virtual ~CallbackImpl () {}
1.477 - virtual R operator() (T1, T2, T3, T4, T5) = 0;
1.478 - };
1.479 - // define CallbackImpl for 6 params
1.480 - template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
1.481 - class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
1.482 - public:
1.483 - virtual ~CallbackImpl () {}
1.484 - virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
1.485 - };
1.486 - // define CallbackImpl for 7 params
1.487 - template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
1.488 - class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
1.489 - public:
1.490 - virtual ~CallbackImpl () {}
1.491 - virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
1.492 - };
1.493 - // define CallbackImpl for 8 params
1.494 - template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1.495 - class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
1.496 - public:
1.497 - virtual ~CallbackImpl () {}
1.498 - virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
1.499 - };
1.500 - // define CallbackImpl for 9 params
1.501 - template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
1.502 - class CallbackImpl : public CallbackImplBase {
1.503 - public:
1.504 - virtual ~CallbackImpl () {}
1.505 - virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
1.506 - };
1.507 -
1.508 -
1.509 - // an impl for Functors:
1.510 - template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
1.511 - class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
1.512 - public:
1.513 - FunctorCallbackImpl (T const &functor)
1.514 - : m_functor (functor) {}
1.515 - virtual ~FunctorCallbackImpl () {}
1.516 - R operator() (void) {
1.517 - return m_functor ();
1.518 - }
1.519 - R operator() (T1 a1) {
1.520 - return m_functor (a1);
1.521 - }
1.522 - R operator() (T1 a1,T2 a2) {
1.523 - return m_functor (a1,a2);
1.524 - }
1.525 - R operator() (T1 a1,T2 a2,T3 a3) {
1.526 - return m_functor (a1,a2,a3);
1.527 - }
1.528 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1.529 - return m_functor (a1,a2,a3,a4);
1.530 - }
1.531 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1.532 - return m_functor (a1,a2,a3,a4,a5);
1.533 - }
1.534 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1.535 - return m_functor (a1,a2,a3,a4,a5,a6);
1.536 - }
1.537 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
1.538 - return m_functor (a1,a2,a3,a4,a5,a6,a7);
1.539 - }
1.540 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
1.541 - return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
1.542 - }
1.543 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
1.544 - return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
1.545 - }
1.546 - virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1.547 - FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived =
1.548 - dynamic_cast<FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer(other));
1.549 - if (otherDerived == 0)
1.550 - {
1.551 - return false;
1.552 - }
1.553 - else if (otherDerived->m_functor != m_functor)
1.554 - {
1.555 - return false;
1.556 - }
1.557 - return true;
1.558 - }
1.559 - private:
1.560 - T m_functor;
1.561 - };
1.562 -
1.563 - // an impl for pointer to member functions
1.564 - 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>
1.565 - class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
1.566 - public:
1.567 - MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR mem_ptr)
1.568 - : m_objPtr (objPtr), m_memPtr (mem_ptr) {}
1.569 - virtual ~MemPtrCallbackImpl () {}
1.570 - R operator() (void) {
1.571 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) ();
1.572 - }
1.573 - R operator() (T1 a1) {
1.574 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1);
1.575 - }
1.576 - R operator() (T1 a1,T2 a2) {
1.577 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2);
1.578 - }
1.579 - R operator() (T1 a1,T2 a2,T3 a3) {
1.580 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3);
1.581 - }
1.582 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1.583 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4);
1.584 - }
1.585 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1.586 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5);
1.587 - }
1.588 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1.589 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6);
1.590 - }
1.591 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
1.592 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7);
1.593 - }
1.594 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
1.595 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8);
1.596 - }
1.597 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
1.598 - return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8, a9);
1.599 - }
1.600 - virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1.601 - MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived =
1.602 - dynamic_cast<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer (other));
1.603 - if (otherDerived == 0)
1.604 - {
1.605 - return false;
1.606 - }
1.607 - else if (otherDerived->m_objPtr != m_objPtr ||
1.608 - otherDerived->m_memPtr != m_memPtr)
1.609 - {
1.610 - return false;
1.611 - }
1.612 - return true;
1.613 - }
1.614 - private:
1.615 - OBJ_PTR const m_objPtr;
1.616 - MEM_PTR m_memPtr;
1.617 - };
1.618 -
1.619 - // an impl for Bound Functors:
1.620 - template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1.621 - class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
1.622 - public:
1.623 - template <typename FUNCTOR, typename ARG>
1.624 - BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
1.625 - : m_functor (functor), m_a (a) {}
1.626 - virtual ~BoundFunctorCallbackImpl () {}
1.627 - R operator() (void) {
1.628 - return m_functor (m_a);
1.629 - }
1.630 - R operator() (T1 a1) {
1.631 - return m_functor (m_a,a1);
1.632 - }
1.633 - R operator() (T1 a1,T2 a2) {
1.634 - return m_functor (m_a,a1,a2);
1.635 - }
1.636 - R operator() (T1 a1,T2 a2,T3 a3) {
1.637 - return m_functor (m_a,a1,a2,a3);
1.638 - }
1.639 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
1.640 - return m_functor (m_a,a1,a2,a3,a4);
1.641 - }
1.642 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
1.643 - return m_functor (m_a,a1,a2,a3,a4,a5);
1.644 - }
1.645 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
1.646 - return m_functor (m_a,a1,a2,a3,a4,a5,a6);
1.647 - }
1.648 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
1.649 - return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
1.650 - }
1.651 - R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
1.652 - return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
1.653 - }
1.654 - virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
1.655 - BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *otherDerived =
1.656 - dynamic_cast<BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *> (PeekPointer (other));
1.657 - if (otherDerived == 0)
1.658 - {
1.659 - return false;
1.660 - }
1.661 - else if (otherDerived->m_functor != m_functor ||
1.662 - otherDerived->m_a != m_a)
1.663 - {
1.664 - return false;
1.665 - }
1.666 - return true;
1.667 - }
1.668 - private:
1.669 - T m_functor;
1.670 - typename TypeTraits<TX>::ReferencedType m_a;
1.671 - };
1.672 -
1.673 -
1.674 - class CallbackBase {
1.675 - public:
1.676 - CallbackBase () : m_impl () {}
1.677 - Ptr<CallbackImplBase> GetImpl (void) const {return m_impl;}
1.678 - protected:
1.679 - CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
1.680 - Ptr<CallbackImplBase> m_impl;
1.681 - };
1.682 -
1.683 - /**
1.684 - * \brief Callback template class
1.685 - *
1.686 - * This class template implements the Functor Design Pattern.
1.687 - * It is used to declare the type of a Callback:
1.688 - * - the first non-optional template argument represents
1.689 - * the return type of the callback.
1.690 - * - the second optional template argument represents
1.691 - * the type of the first argument to the callback.
1.692 - * - the third optional template argument represents
1.693 - * the type of the second argument to the callback.
1.694 - * - the fourth optional template argument represents
1.695 - * the type of the third argument to the callback.
1.696 - * - the fifth optional template argument represents
1.697 - * the type of the fourth argument to the callback.
1.698 - * - the sixth optional template argument represents
1.699 - * the type of the fifth argument to the callback.
1.700 - *
1.701 - * Callback instances are built with the \ref MakeCallback
1.702 - * template functions. Callback instances have POD semantics:
1.703 - * the memory they allocate is managed automatically, without
1.704 - * user intervention which allows you to pass around Callback
1.705 - * instances by value.
1.706 - *
1.707 - * Sample code which shows how to use this class template
1.708 - * as well as the function templates \ref MakeCallback :
1.709 - * \include samples/main-callback.cc
1.710 - */
1.711 -
1.712 - template<typename R,
1.713 - typename T1 = empty, typename T2 = empty,
1.714 - typename T3 = empty, typename T4 = empty,
1.715 - typename T5 = empty, typename T6 = empty,
1.716 - typename T7 = empty, typename T8 = empty,
1.717 - typename T9 = empty>
1.718 - class Callback : public CallbackBase {
1.719 - public:
1.720 - Callback () {}
1.721 -
1.722 - // There are two dummy args below to ensure that this constructor is
1.723 - // always properly disambiguited by the c++ compiler
1.724 - template <typename FUNCTOR>
1.725 - Callback (FUNCTOR const &functor, bool, bool)
1.726 - : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
1.727 - {}
1.728 -
1.729 - template <typename OBJ_PTR, typename MEM_PTR>
1.730 - Callback (OBJ_PTR const &objPtr, MEM_PTR mem_ptr)
1.731 - : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, mem_ptr))
1.732 - {}
1.733 -
1.734 - Callback (Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > const &impl)
1.735 - : CallbackBase (impl)
1.736 - {}
1.737 -
1.738 - template <typename T>
1.739 - Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> Bind (T a) {
1.740 - Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > impl =
1.741 - Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > (
1.742 - new BoundFunctorCallbackImpl<
1.743 - Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9>,
1.744 - R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
1.745 - return Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> (impl);
1.746 - }
1.747 -
1.748 - bool IsNull (void) const {
1.749 - return (DoPeekImpl () == 0)?true:false;
1.750 - }
1.751 - void Nullify (void) {
1.752 - m_impl = 0;
1.753 - }
1.754 -
1.755 - R operator() (void) const {
1.756 - return (*(DoPeekImpl ())) ();
1.757 - }
1.758 - R operator() (T1 a1) const {
1.759 - return (*(DoPeekImpl ())) (a1);
1.760 - }
1.761 - R operator() (T1 a1, T2 a2) const {
1.762 - return (*(DoPeekImpl ())) (a1,a2);
1.763 - }
1.764 - R operator() (T1 a1, T2 a2, T3 a3) const {
1.765 - return (*(DoPeekImpl ())) (a1,a2,a3);
1.766 - }
1.767 - R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
1.768 - return (*(DoPeekImpl ())) (a1,a2,a3,a4);
1.769 - }
1.770 - R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
1.771 - return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5);
1.772 - }
1.773 - R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
1.774 - return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6);
1.775 - }
1.776 - R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
1.777 - return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7);
1.778 - }
1.779 - R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
1.780 - return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8);
1.781 - }
1.782 - R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
1.783 - return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8,a9);
1.784 - }
1.785 -
1.786 - bool IsEqual (const CallbackBase &other) const {
1.787 - return m_impl->IsEqual (other.GetImpl ());
1.788 - }
1.789 -
1.790 - bool CheckType (const CallbackBase & other) const {
1.791 - return DoCheckType (other.GetImpl ());
1.792 - }
1.793 - void Assign (const CallbackBase &other) {
1.794 - DoAssign (other.GetImpl ());
1.795 - }
1.796 - private:
1.797 - CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *DoPeekImpl (void) const {
1.798 - return static_cast<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (m_impl));
1.799 - }
1.800 - bool DoCheckType (Ptr<const CallbackImplBase> other) const {
1.801 - if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
1.802 - {
1.803 - return true;
1.804 - }
1.805 - else if (other == 0)
1.806 - {
1.807 - return true;
1.808 - }
1.809 - else
1.810 - {
1.811 - return false;
1.812 - }
1.813 - }
1.814 - void DoAssign (Ptr<const CallbackImplBase> other) {
1.815 - if (!DoCheckType (other))
1.816 - {
1.817 - NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\")"
1.818 - " got=" << typeid (*other).name () <<
1.819 - ", expected=" << typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name ());
1.820 - }
1.821 - m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
1.822 - }
1.823 - };
1.824 -
1.825 -
1.826 - template <typename R, typename T1, typename T2,
1.827 - typename T3, typename T4,
1.828 - typename T5, typename T6,
1.829 - typename T7, typename T8,
1.830 - typename T9>
1.831 - 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)
1.832 - {
1.833 - return !a.IsEqual (b);
1.834 + Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> Bind (T a) {
1.835 + Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > impl =
1.836 + Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > (
1.837 + new BoundFunctorCallbackImpl<
1.838 + Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9>,
1.839 + R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
1.840 + return Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> (impl);
1.841 }
1.842
1.843 - /**
1.844 - * \ingroup core
1.845 - * \defgroup MakeCallback MakeCallback
1.846 - *
1.847 - */
1.848 -
1.849 - /**
1.850 - * \ingroup MakeCallback
1.851 - * \param memPtr class method member pointer
1.852 - * \param objPtr class instance
1.853 - * \return a wrapper Callback
1.854 - * Build Callbacks for class method members which takes no arguments
1.855 - * and potentially return a value.
1.856 - */
1.857 - template <typename T, typename OBJ, typename R>
1.858 - Callback<R> MakeCallback (R (T::*memPtr) (void), OBJ objPtr) {
1.859 - return Callback<R> (objPtr, memPtr);
1.860 + bool IsNull (void) const {
1.861 + return (DoPeekImpl () == 0)?true:false;
1.862 }
1.863 - template <typename T, typename OBJ, typename R>
1.864 - Callback<R> MakeCallback (R (T::*mem_ptr) () const, OBJ objPtr) {
1.865 - return Callback<R> (objPtr, mem_ptr);
1.866 - }
1.867 - /**
1.868 - * \ingroup MakeCallback
1.869 - * \param mem_ptr class method member pointer
1.870 - * \param objPtr class instance
1.871 - * \return a wrapper Callback
1.872 - * Build Callbacks for class method members which takes one argument
1.873 - * and potentially return a value.
1.874 - */
1.875 - template <typename T, typename OBJ, typename R, typename T1>
1.876 - Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1), OBJ objPtr) {
1.877 - return Callback<R,T1> (objPtr, mem_ptr);
1.878 - }
1.879 - template <typename T, typename OBJ, typename R, typename T1>
1.880 - Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1) const, OBJ objPtr) {
1.881 - return Callback<R,T1> (objPtr, mem_ptr);
1.882 - }
1.883 - /**
1.884 - * \ingroup MakeCallback
1.885 - * \param mem_ptr class method member pointer
1.886 - * \param objPtr class instance
1.887 - * \return a wrapper Callback
1.888 - * Build Callbacks for class method members which takes two arguments
1.889 - * and potentially return a value.
1.890 - */
1.891 - template <typename T, typename OBJ, typename R, typename T1, typename T2>
1.892 - Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2), OBJ objPtr) {
1.893 - return Callback<R,T1,T2> (objPtr, mem_ptr);
1.894 - }
1.895 - template <typename T, typename OBJ, typename R, typename T1, typename T2>
1.896 - Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2) const, OBJ objPtr) {
1.897 - return Callback<R,T1,T2> (objPtr, mem_ptr);
1.898 - }
1.899 - /**
1.900 - * \ingroup MakeCallback
1.901 - * \param mem_ptr class method member pointer
1.902 - * \param objPtr class instance
1.903 - * \return a wrapper Callback
1.904 - * Build Callbacks for class method members which takes three arguments
1.905 - * and potentially return a value.
1.906 - */
1.907 - template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1.908 - Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3), OBJ objPtr) {
1.909 - return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
1.910 - }
1.911 - template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1.912 - Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3) const, OBJ objPtr) {
1.913 - return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
1.914 - }
1.915 - /**
1.916 - * \ingroup MakeCallback
1.917 - * \param mem_ptr class method member pointer
1.918 - * \param objPtr class instance
1.919 - * \return a wrapper Callback
1.920 - * Build Callbacks for class method members which takes four arguments
1.921 - * and potentially return a value.
1.922 - */
1.923 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1.924 - Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4), OBJ objPtr) {
1.925 - return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
1.926 - }
1.927 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1.928 - Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4) const, OBJ objPtr) {
1.929 - return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
1.930 - }
1.931 - /**
1.932 - * \ingroup MakeCallback
1.933 - * \param mem_ptr class method member pointer
1.934 - * \param objPtr class instance
1.935 - * \return a wrapper Callback
1.936 - * Build Callbacks for class method members which takes five arguments
1.937 - * and potentially return a value.
1.938 - */
1.939 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1.940 - Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ objPtr) {
1.941 - return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
1.942 - }
1.943 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1.944 - Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5) const, OBJ objPtr) {
1.945 - return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
1.946 - }
1.947 - /**
1.948 - * \ingroup MakeCallback
1.949 - * \param mem_ptr class method member pointer
1.950 - * \param objPtr class instance
1.951 - * \return a wrapper Callback
1.952 - * Build Callbacks for class method members which takes six arguments
1.953 - * and potentially return a value.
1.954 - */
1.955 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
1.956 - Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6), OBJ objPtr) {
1.957 - return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
1.958 - }
1.959 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
1.960 - Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
1.961 - return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
1.962 + void Nullify (void) {
1.963 + m_impl = 0;
1.964 }
1.965
1.966 - /**
1.967 - * \ingroup MakeCallback
1.968 - * \param mem_ptr class method member pointer
1.969 - * \param objPtr class instance
1.970 - * \return a wrapper Callback
1.971 - * Build Callbacks for class method members which takes seven arguments
1.972 - * and potentially return a value.
1.973 - */
1.974 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
1.975 - Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
1.976 - return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
1.977 + R operator() (void) const {
1.978 + return (*(DoPeekImpl ())) ();
1.979 }
1.980 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
1.981 - Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
1.982 - return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
1.983 + R operator() (T1 a1) const {
1.984 + return (*(DoPeekImpl ())) (a1);
1.985 + }
1.986 + R operator() (T1 a1, T2 a2) const {
1.987 + return (*(DoPeekImpl ())) (a1,a2);
1.988 + }
1.989 + R operator() (T1 a1, T2 a2, T3 a3) const {
1.990 + return (*(DoPeekImpl ())) (a1,a2,a3);
1.991 + }
1.992 + R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
1.993 + return (*(DoPeekImpl ())) (a1,a2,a3,a4);
1.994 + }
1.995 + R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
1.996 + return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5);
1.997 + }
1.998 + R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
1.999 + return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6);
1.1000 + }
1.1001 + R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
1.1002 + return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7);
1.1003 + }
1.1004 + R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
1.1005 + return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8);
1.1006 + }
1.1007 + R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
1.1008 + return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8,a9);
1.1009 }
1.1010
1.1011 -
1.1012 - /**
1.1013 - * \ingroup MakeCallback
1.1014 - * \param mem_ptr class method member pointer
1.1015 - * \param objPtr class instance
1.1016 - * \return a wrapper Callback
1.1017 - * Build Callbacks for class method members which takes eight arguments
1.1018 - * and potentially return a value.
1.1019 - */
1.1020 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
1.1021 - 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) {
1.1022 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
1.1023 - }
1.1024 - template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1.1025 - 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) {
1.1026 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
1.1027 + bool IsEqual (const CallbackBase &other) const {
1.1028 + return m_impl->IsEqual (other.GetImpl ());
1.1029 }
1.1030
1.1031 - /**
1.1032 - * \ingroup MakeCallback
1.1033 - * \param mem_ptr class method member pointer
1.1034 - * \param objPtr class instance
1.1035 - * \return a wrapper Callback
1.1036 - * Build Callbacks for class method members which takes nine arguments
1.1037 - * and potentially return a value.
1.1038 - */
1.1039 - 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>
1.1040 - 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) {
1.1041 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
1.1042 + bool CheckType (const CallbackBase & other) const {
1.1043 + return DoCheckType (other.GetImpl ());
1.1044 }
1.1045 - 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>
1.1046 - 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) {
1.1047 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
1.1048 + void Assign (const CallbackBase &other) {
1.1049 + DoAssign (other.GetImpl ());
1.1050 }
1.1051 +private:
1.1052 + CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *DoPeekImpl (void) const {
1.1053 + return static_cast<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (m_impl));
1.1054 + }
1.1055 + bool DoCheckType (Ptr<const CallbackImplBase> other) const {
1.1056 + if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
1.1057 + {
1.1058 + return true;
1.1059 + }
1.1060 + else if (other == 0)
1.1061 + {
1.1062 + return true;
1.1063 + }
1.1064 + else
1.1065 + {
1.1066 + return false;
1.1067 + }
1.1068 + }
1.1069 + void DoAssign (Ptr<const CallbackImplBase> other) {
1.1070 + if (!DoCheckType (other))
1.1071 + {
1.1072 + NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\")"
1.1073 + " got=" << typeid (*other).name () <<
1.1074 + ", expected=" << typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name ());
1.1075 + }
1.1076 + m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
1.1077 + }
1.1078 +};
1.1079
1.1080 - /**
1.1081 - * \ingroup MakeCallback
1.1082 - * \param fnPtr function pointer
1.1083 - * \return a wrapper Callback
1.1084 - * Build Callbacks for functions which takes no arguments
1.1085 - * and potentially return a value.
1.1086 - */
1.1087 - template <typename R>
1.1088 - Callback<R> MakeCallback (R (*fnPtr) ()) {
1.1089 - return Callback<R> (fnPtr, true, true);
1.1090 - }
1.1091 - /**
1.1092 - * \ingroup MakeCallback
1.1093 - * \param fnPtr function pointer
1.1094 - * \return a wrapper Callback
1.1095 - * Build Callbacks for functions which takes one argument
1.1096 - * and potentially return a value.
1.1097 - */
1.1098 - template <typename R, typename T1>
1.1099 - Callback<R,T1> MakeCallback (R (*fnPtr) (T1)) {
1.1100 - return Callback<R,T1> (fnPtr, true, true);
1.1101 - }
1.1102 - /**
1.1103 - * \ingroup MakeCallback
1.1104 - * \param fnPtr function pointer
1.1105 - * \return a wrapper Callback
1.1106 - * Build Callbacks for functions which takes two arguments
1.1107 - * and potentially return a value.
1.1108 - */
1.1109 - template <typename R, typename T1, typename T2>
1.1110 - Callback<R,T1,T2> MakeCallback (R (*fnPtr) (T1,T2)) {
1.1111 - return Callback<R,T1,T2> (fnPtr, true, true);
1.1112 - }
1.1113 - /**
1.1114 - * \ingroup MakeCallback
1.1115 - * \param fnPtr function pointer
1.1116 - * \return a wrapper Callback
1.1117 - * Build Callbacks for functions which takes three arguments
1.1118 - * and potentially return a value.
1.1119 - */
1.1120 - template <typename R, typename T1, typename T2,typename T3>
1.1121 - Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr) (T1,T2,T3)) {
1.1122 - return Callback<R,T1,T2,T3> (fnPtr, true, true);
1.1123 - }
1.1124 - /**
1.1125 - * \ingroup MakeCallback
1.1126 - * \param fnPtr function pointer
1.1127 - * \return a wrapper Callback
1.1128 - * Build Callbacks for functions which takes four arguments
1.1129 - * and potentially return a value.
1.1130 - */
1.1131 - template <typename R, typename T1, typename T2,typename T3,typename T4>
1.1132 - Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr) (T1,T2,T3,T4)) {
1.1133 - return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
1.1134 - }
1.1135 - /**
1.1136 - * \ingroup MakeCallback
1.1137 - * \param fnPtr function pointer
1.1138 - * \return a wrapper Callback
1.1139 - * Build Callbacks for functions which takes five arguments
1.1140 - * and potentially return a value.
1.1141 - */
1.1142 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1.1143 - Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5)) {
1.1144 - return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
1.1145 - }
1.1146 - /**
1.1147 - * \ingroup MakeCallback
1.1148 - * \param fnPtr function pointer
1.1149 - * \return a wrapper Callback
1.1150 - * Build Callbacks for functions which takes six arguments
1.1151 - * and potentially return a value.
1.1152 - */
1.1153 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1.1154 - Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6)) {
1.1155 - return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
1.1156 - }
1.1157
1.1158 - /**
1.1159 - * \ingroup MakeCallback
1.1160 - * \param fnPtr function pointer
1.1161 - * \return a wrapper Callback
1.1162 - * Build Callbacks for functions which takes seven arguments
1.1163 - * and potentially return a value.
1.1164 - */
1.1165 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1.1166 - Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7)) {
1.1167 - return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
1.1168 - }
1.1169 +template <typename R, typename T1, typename T2,
1.1170 + typename T3, typename T4,
1.1171 + typename T5, typename T6,
1.1172 + typename T7, typename T8,
1.1173 + typename T9>
1.1174 +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)
1.1175 +{
1.1176 + return !a.IsEqual (b);
1.1177 +}
1.1178
1.1179 - /**
1.1180 - * \ingroup MakeCallback
1.1181 - * \param fnPtr function pointer
1.1182 - * \return a wrapper Callback
1.1183 - * Build Callbacks for functions which takes eight arguments
1.1184 - * and potentially return a value.
1.1185 - */
1.1186 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1.1187 - Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8)) {
1.1188 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
1.1189 - }
1.1190 +/**
1.1191 + * \ingroup core
1.1192 + * \defgroup MakeCallback MakeCallback
1.1193 + *
1.1194 + */
1.1195
1.1196 - /**
1.1197 - * \ingroup MakeCallback
1.1198 - * \param fnPtr function pointer
1.1199 - * \return a wrapper Callback
1.1200 - * Build Callbacks for functions which takes nine arguments
1.1201 - * and potentially return a value.
1.1202 - */
1.1203 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1.1204 - Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
1.1205 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
1.1206 - }
1.1207 +/**
1.1208 + * \ingroup MakeCallback
1.1209 + * \param memPtr class method member pointer
1.1210 + * \param objPtr class instance
1.1211 + * \return a wrapper Callback
1.1212 + * Build Callbacks for class method members which takes no arguments
1.1213 + * and potentially return a value.
1.1214 + */
1.1215 +template <typename T, typename OBJ, typename R>
1.1216 +Callback<R> MakeCallback (R (T::*memPtr) (void), OBJ objPtr) {
1.1217 + return Callback<R> (objPtr, memPtr);
1.1218 +}
1.1219 +template <typename T, typename OBJ, typename R>
1.1220 +Callback<R> MakeCallback (R (T::*mem_ptr) () const, OBJ objPtr) {
1.1221 + return Callback<R> (objPtr, mem_ptr);
1.1222 +}
1.1223 +/**
1.1224 + * \ingroup MakeCallback
1.1225 + * \param mem_ptr class method member pointer
1.1226 + * \param objPtr class instance
1.1227 + * \return a wrapper Callback
1.1228 + * Build Callbacks for class method members which takes one argument
1.1229 + * and potentially return a value.
1.1230 + */
1.1231 +template <typename T, typename OBJ, typename R, typename T1>
1.1232 +Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1), OBJ objPtr) {
1.1233 + return Callback<R,T1> (objPtr, mem_ptr);
1.1234 +}
1.1235 +template <typename T, typename OBJ, typename R, typename T1>
1.1236 +Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1) const, OBJ objPtr) {
1.1237 + return Callback<R,T1> (objPtr, mem_ptr);
1.1238 +}
1.1239 +/**
1.1240 + * \ingroup MakeCallback
1.1241 + * \param mem_ptr class method member pointer
1.1242 + * \param objPtr class instance
1.1243 + * \return a wrapper Callback
1.1244 + * Build Callbacks for class method members which takes two arguments
1.1245 + * and potentially return a value.
1.1246 + */
1.1247 +template <typename T, typename OBJ, typename R, typename T1, typename T2>
1.1248 +Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2), OBJ objPtr) {
1.1249 + return Callback<R,T1,T2> (objPtr, mem_ptr);
1.1250 +}
1.1251 +template <typename T, typename OBJ, typename R, typename T1, typename T2>
1.1252 +Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2) const, OBJ objPtr) {
1.1253 + return Callback<R,T1,T2> (objPtr, mem_ptr);
1.1254 +}
1.1255 +/**
1.1256 + * \ingroup MakeCallback
1.1257 + * \param mem_ptr class method member pointer
1.1258 + * \param objPtr class instance
1.1259 + * \return a wrapper Callback
1.1260 + * Build Callbacks for class method members which takes three arguments
1.1261 + * and potentially return a value.
1.1262 + */
1.1263 +template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1.1264 +Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3), OBJ objPtr) {
1.1265 + return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
1.1266 +}
1.1267 +template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
1.1268 +Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3) const, OBJ objPtr) {
1.1269 + return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
1.1270 +}
1.1271 +/**
1.1272 + * \ingroup MakeCallback
1.1273 + * \param mem_ptr class method member pointer
1.1274 + * \param objPtr class instance
1.1275 + * \return a wrapper Callback
1.1276 + * Build Callbacks for class method members which takes four arguments
1.1277 + * and potentially return a value.
1.1278 + */
1.1279 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1.1280 +Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4), OBJ objPtr) {
1.1281 + return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
1.1282 +}
1.1283 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
1.1284 +Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4) const, OBJ objPtr) {
1.1285 + return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
1.1286 +}
1.1287 +/**
1.1288 + * \ingroup MakeCallback
1.1289 + * \param mem_ptr class method member pointer
1.1290 + * \param objPtr class instance
1.1291 + * \return a wrapper Callback
1.1292 + * Build Callbacks for class method members which takes five arguments
1.1293 + * and potentially return a value.
1.1294 + */
1.1295 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1.1296 +Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ objPtr) {
1.1297 + return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
1.1298 +}
1.1299 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
1.1300 +Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5) const, OBJ objPtr) {
1.1301 + return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
1.1302 +}
1.1303 +/**
1.1304 + * \ingroup MakeCallback
1.1305 + * \param mem_ptr class method member pointer
1.1306 + * \param objPtr class instance
1.1307 + * \return a wrapper Callback
1.1308 + * Build Callbacks for class method members which takes six arguments
1.1309 + * and potentially return a value.
1.1310 + */
1.1311 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
1.1312 +Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6), OBJ objPtr) {
1.1313 + return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
1.1314 +}
1.1315 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
1.1316 +Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
1.1317 + return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
1.1318 +}
1.1319
1.1320 +/**
1.1321 + * \ingroup MakeCallback
1.1322 + * \param mem_ptr class method member pointer
1.1323 + * \param objPtr class instance
1.1324 + * \return a wrapper Callback
1.1325 + * Build Callbacks for class method members which takes seven arguments
1.1326 + * and potentially return a value.
1.1327 + */
1.1328 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
1.1329 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
1.1330 + return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
1.1331 +}
1.1332 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
1.1333 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
1.1334 + return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
1.1335 +}
1.1336
1.1337
1.1338 - /**
1.1339 - * \ingroup MakeCallback
1.1340 - * \return a wrapper Callback
1.1341 - * Build a null callback which takes no arguments
1.1342 - * and potentially return a value.
1.1343 - */
1.1344 - template <typename R>
1.1345 - Callback<R> MakeNullCallback (void) {
1.1346 - return Callback<R> ();
1.1347 - }
1.1348 - /**
1.1349 - * \ingroup MakeCallback
1.1350 - * \overload Callback<R> MakeNullCallback (void)
1.1351 - * \return a wrapper Callback
1.1352 - * Build a null callback which takes one argument
1.1353 - * and potentially return a value.
1.1354 - */
1.1355 - template <typename R, typename T1>
1.1356 - Callback<R,T1> MakeNullCallback (void) {
1.1357 - return Callback<R,T1> ();
1.1358 - }
1.1359 - /**
1.1360 - * \ingroup MakeCallback
1.1361 - * \overload Callback<R> MakeNullCallback (void)
1.1362 - * \return a wrapper Callback
1.1363 - * Build a null callback which takes two arguments
1.1364 - * and potentially return a value.
1.1365 - */
1.1366 - template <typename R, typename T1, typename T2>
1.1367 - Callback<R,T1,T2> MakeNullCallback (void) {
1.1368 - return Callback<R,T1,T2> ();
1.1369 - }
1.1370 - /**
1.1371 - * \ingroup MakeCallback
1.1372 - * \overload Callback<R> MakeNullCallback (void)
1.1373 - * \return a wrapper Callback
1.1374 - * Build a null callback which takes three arguments
1.1375 - * and potentially return a value.
1.1376 - */
1.1377 - template <typename R, typename T1, typename T2,typename T3>
1.1378 - Callback<R,T1,T2,T3> MakeNullCallback (void) {
1.1379 - return Callback<R,T1,T2,T3> ();
1.1380 - }
1.1381 - /**
1.1382 - * \ingroup MakeCallback
1.1383 - * \overload Callback<R> MakeNullCallback (void)
1.1384 - * \return a wrapper Callback
1.1385 - * Build a null callback which takes four arguments
1.1386 - * and potentially return a value.
1.1387 - */
1.1388 - template <typename R, typename T1, typename T2,typename T3,typename T4>
1.1389 - Callback<R,T1,T2,T3,T4> MakeNullCallback (void) {
1.1390 - return Callback<R,T1,T2,T3,T4> ();
1.1391 - }
1.1392 - /**
1.1393 - * \ingroup MakeCallback
1.1394 - * \overload Callback<R> MakeNullCallback (void)
1.1395 - * \return a wrapper Callback
1.1396 - * Build a null callback which takes five arguments
1.1397 - * and potentially return a value.
1.1398 - */
1.1399 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1.1400 - Callback<R,T1,T2,T3,T4,T5> MakeNullCallback (void) {
1.1401 - return Callback<R,T1,T2,T3,T4,T5> ();
1.1402 - }
1.1403 - /**
1.1404 - * \ingroup MakeCallback
1.1405 - * \overload Callback<R> MakeNullCallback (void)
1.1406 - * \return a wrapper Callback
1.1407 - * Build a null callback which takes six arguments
1.1408 - * and potentially return a value.
1.1409 - */
1.1410 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1.1411 - Callback<R,T1,T2,T3,T4,T5,T6> MakeNullCallback (void) {
1.1412 - return Callback<R,T1,T2,T3,T4,T5,T6> ();
1.1413 - }
1.1414 +/**
1.1415 + * \ingroup MakeCallback
1.1416 + * \param mem_ptr class method member pointer
1.1417 + * \param objPtr class instance
1.1418 + * \return a wrapper Callback
1.1419 + * Build Callbacks for class method members which takes eight arguments
1.1420 + * and potentially return a value.
1.1421 + */
1.1422 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
1.1423 +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) {
1.1424 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
1.1425 +}
1.1426 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
1.1427 +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) {
1.1428 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
1.1429 +}
1.1430
1.1431 - /**
1.1432 - * \ingroup MakeCallback
1.1433 - * \overload Callback<R> MakeNullCallback (void)
1.1434 - * \return a wrapper Callback
1.1435 - * Build a null callback which takes seven arguments
1.1436 - * and potentially return a value.
1.1437 - */
1.1438 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1.1439 - Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeNullCallback (void) {
1.1440 - return Callback<R,T1,T2,T3,T4,T5,T6,T7> ();
1.1441 - }
1.1442 +/**
1.1443 + * \ingroup MakeCallback
1.1444 + * \param mem_ptr class method member pointer
1.1445 + * \param objPtr class instance
1.1446 + * \return a wrapper Callback
1.1447 + * Build Callbacks for class method members which takes nine arguments
1.1448 + * and potentially return a value.
1.1449 + */
1.1450 +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>
1.1451 +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) {
1.1452 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
1.1453 +}
1.1454 +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>
1.1455 +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) {
1.1456 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
1.1457 +}
1.1458
1.1459 - /**
1.1460 - * \ingroup MakeCallback
1.1461 - * \overload Callback<R> MakeNullCallback (void)
1.1462 - * \return a wrapper Callback
1.1463 - * Build a null callback which takes eight arguments
1.1464 - * and potentially return a value.
1.1465 - */
1.1466 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1.1467 - Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeNullCallback (void) {
1.1468 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> ();
1.1469 - }
1.1470 +/**
1.1471 + * \ingroup MakeCallback
1.1472 + * \param fnPtr function pointer
1.1473 + * \return a wrapper Callback
1.1474 + * Build Callbacks for functions which takes no arguments
1.1475 + * and potentially return a value.
1.1476 + */
1.1477 +template <typename R>
1.1478 +Callback<R> MakeCallback (R (*fnPtr) ()) {
1.1479 + return Callback<R> (fnPtr, true, true);
1.1480 +}
1.1481 +/**
1.1482 + * \ingroup MakeCallback
1.1483 + * \param fnPtr function pointer
1.1484 + * \return a wrapper Callback
1.1485 + * Build Callbacks for functions which takes one argument
1.1486 + * and potentially return a value.
1.1487 + */
1.1488 +template <typename R, typename T1>
1.1489 +Callback<R,T1> MakeCallback (R (*fnPtr) (T1)) {
1.1490 + return Callback<R,T1> (fnPtr, true, true);
1.1491 +}
1.1492 +/**
1.1493 + * \ingroup MakeCallback
1.1494 + * \param fnPtr function pointer
1.1495 + * \return a wrapper Callback
1.1496 + * Build Callbacks for functions which takes two arguments
1.1497 + * and potentially return a value.
1.1498 + */
1.1499 +template <typename R, typename T1, typename T2>
1.1500 +Callback<R,T1,T2> MakeCallback (R (*fnPtr) (T1,T2)) {
1.1501 + return Callback<R,T1,T2> (fnPtr, true, true);
1.1502 +}
1.1503 +/**
1.1504 + * \ingroup MakeCallback
1.1505 + * \param fnPtr function pointer
1.1506 + * \return a wrapper Callback
1.1507 + * Build Callbacks for functions which takes three arguments
1.1508 + * and potentially return a value.
1.1509 + */
1.1510 +template <typename R, typename T1, typename T2,typename T3>
1.1511 +Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr) (T1,T2,T3)) {
1.1512 + return Callback<R,T1,T2,T3> (fnPtr, true, true);
1.1513 +}
1.1514 +/**
1.1515 + * \ingroup MakeCallback
1.1516 + * \param fnPtr function pointer
1.1517 + * \return a wrapper Callback
1.1518 + * Build Callbacks for functions which takes four arguments
1.1519 + * and potentially return a value.
1.1520 + */
1.1521 +template <typename R, typename T1, typename T2,typename T3,typename T4>
1.1522 +Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr) (T1,T2,T3,T4)) {
1.1523 + return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
1.1524 +}
1.1525 +/**
1.1526 + * \ingroup MakeCallback
1.1527 + * \param fnPtr function pointer
1.1528 + * \return a wrapper Callback
1.1529 + * Build Callbacks for functions which takes five arguments
1.1530 + * and potentially return a value.
1.1531 + */
1.1532 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1.1533 +Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5)) {
1.1534 + return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
1.1535 +}
1.1536 +/**
1.1537 + * \ingroup MakeCallback
1.1538 + * \param fnPtr function pointer
1.1539 + * \return a wrapper Callback
1.1540 + * Build Callbacks for functions which takes six arguments
1.1541 + * and potentially return a value.
1.1542 + */
1.1543 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1.1544 +Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6)) {
1.1545 + return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
1.1546 +}
1.1547
1.1548 - /**
1.1549 - * \ingroup MakeCallback
1.1550 - * \overload Callback<R> MakeNullCallback (void)
1.1551 - * \return a wrapper Callback
1.1552 - * Build a null callback which takes nine arguments
1.1553 - * and potentially return a value.
1.1554 - */
1.1555 - template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1.1556 - Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeNullCallback (void) {
1.1557 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> ();
1.1558 - }
1.1559 +/**
1.1560 + * \ingroup MakeCallback
1.1561 + * \param fnPtr function pointer
1.1562 + * \return a wrapper Callback
1.1563 + * Build Callbacks for functions which takes seven arguments
1.1564 + * and potentially return a value.
1.1565 + */
1.1566 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1.1567 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7)) {
1.1568 + return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
1.1569 +}
1.1570
1.1571 +/**
1.1572 + * \ingroup MakeCallback
1.1573 + * \param fnPtr function pointer
1.1574 + * \return a wrapper Callback
1.1575 + * Build Callbacks for functions which takes eight arguments
1.1576 + * and potentially return a value.
1.1577 + */
1.1578 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1.1579 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8)) {
1.1580 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
1.1581 +}
1.1582
1.1583 - /*
1.1584 - * The following is experimental code. It works but we have
1.1585 - * not yet determined whether or not it is really useful and whether
1.1586 - * or not we really want to use it.
1.1587 - */
1.1588 +/**
1.1589 + * \ingroup MakeCallback
1.1590 + * \param fnPtr function pointer
1.1591 + * \return a wrapper Callback
1.1592 + * Build Callbacks for functions which takes nine arguments
1.1593 + * and potentially return a value.
1.1594 + */
1.1595 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1.1596 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
1.1597 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
1.1598 +}
1.1599
1.1600 - template <typename R, typename TX, typename ARG>
1.1601 - Callback<R> MakeBoundCallback (R (*fnPtr) (TX), ARG a) {
1.1602 - Ptr<CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
1.1603 - Create<BoundFunctorCallbackImpl<R (*) (TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a);
1.1604 - return Callback<R> (impl);
1.1605 - }
1.1606
1.1607 - template <typename R, typename TX, typename ARG,
1.1608 - typename T1>
1.1609 - Callback<R,T1> MakeBoundCallback (R (*fnPtr) (TX,T1), ARG a) {
1.1610 - Ptr<CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
1.1611 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
1.1612 - return Callback<R,T1> (impl);
1.1613 - }
1.1614 - template <typename R, typename TX, typename ARG,
1.1615 - typename T1, typename T2>
1.1616 - Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr) (TX,T1,T2), ARG a) {
1.1617 - Ptr<CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> > impl =
1.1618 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
1.1619 - return Callback<R,T1,T2> (impl);
1.1620 - }
1.1621 - template <typename R, typename TX, typename ARG,
1.1622 - typename T1, typename T2,typename T3>
1.1623 - Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3), ARG a) {
1.1624 - Ptr<CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> > impl =
1.1625 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a);
1.1626 - return Callback<R,T1,T2,T3> (impl);
1.1627 - }
1.1628 - template <typename R, typename TX, typename ARG,
1.1629 - typename T1, typename T2,typename T3,typename T4>
1.1630 - Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4), ARG a) {
1.1631 - Ptr<CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> > impl =
1.1632 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a);
1.1633 - return Callback<R,T1,T2,T3,T4> (impl);
1.1634 - }
1.1635 - template <typename R, typename TX, typename ARG,
1.1636 - typename T1, typename T2,typename T3,typename T4,typename T5>
1.1637 - Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5), ARG a) {
1.1638 - Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> > impl =
1.1639 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a);
1.1640 - return Callback<R,T1,T2,T3,T4,T5> (impl);
1.1641 - }
1.1642 - template <typename R, typename TX, typename ARG,
1.1643 - typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1.1644 - Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6), ARG a) {
1.1645 - Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> > impl =
1.1646 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a);
1.1647 - return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1.1648 - }
1.1649 - template <typename R, typename TX, typename ARG,
1.1650 - typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1.1651 - Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7), ARG a) {
1.1652 - Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> > impl =
1.1653 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a);
1.1654 - return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1.1655 - }
1.1656 - template <typename R, typename TX, typename ARG,
1.1657 - typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
1.1658 - Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a) {
1.1659 - Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> > impl =
1.1660 - Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a);
1.1661 - return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (impl);
1.1662 - }
1.1663 +
1.1664 +/**
1.1665 + * \ingroup MakeCallback
1.1666 + * \return a wrapper Callback
1.1667 + * Build a null callback which takes no arguments
1.1668 + * and potentially return a value.
1.1669 + */
1.1670 +template <typename R>
1.1671 +Callback<R> MakeNullCallback (void) {
1.1672 + return Callback<R> ();
1.1673 +}
1.1674 +/**
1.1675 + * \ingroup MakeCallback
1.1676 + * \overload Callback<R> MakeNullCallback (void)
1.1677 + * \return a wrapper Callback
1.1678 + * Build a null callback which takes one argument
1.1679 + * and potentially return a value.
1.1680 + */
1.1681 +template <typename R, typename T1>
1.1682 +Callback<R,T1> MakeNullCallback (void) {
1.1683 + return Callback<R,T1> ();
1.1684 +}
1.1685 +/**
1.1686 + * \ingroup MakeCallback
1.1687 + * \overload Callback<R> MakeNullCallback (void)
1.1688 + * \return a wrapper Callback
1.1689 + * Build a null callback which takes two arguments
1.1690 + * and potentially return a value.
1.1691 + */
1.1692 +template <typename R, typename T1, typename T2>
1.1693 +Callback<R,T1,T2> MakeNullCallback (void) {
1.1694 + return Callback<R,T1,T2> ();
1.1695 +}
1.1696 +/**
1.1697 + * \ingroup MakeCallback
1.1698 + * \overload Callback<R> MakeNullCallback (void)
1.1699 + * \return a wrapper Callback
1.1700 + * Build a null callback which takes three arguments
1.1701 + * and potentially return a value.
1.1702 + */
1.1703 +template <typename R, typename T1, typename T2,typename T3>
1.1704 +Callback<R,T1,T2,T3> MakeNullCallback (void) {
1.1705 + return Callback<R,T1,T2,T3> ();
1.1706 +}
1.1707 +/**
1.1708 + * \ingroup MakeCallback
1.1709 + * \overload Callback<R> MakeNullCallback (void)
1.1710 + * \return a wrapper Callback
1.1711 + * Build a null callback which takes four arguments
1.1712 + * and potentially return a value.
1.1713 + */
1.1714 +template <typename R, typename T1, typename T2,typename T3,typename T4>
1.1715 +Callback<R,T1,T2,T3,T4> MakeNullCallback (void) {
1.1716 + return Callback<R,T1,T2,T3,T4> ();
1.1717 +}
1.1718 +/**
1.1719 + * \ingroup MakeCallback
1.1720 + * \overload Callback<R> MakeNullCallback (void)
1.1721 + * \return a wrapper Callback
1.1722 + * Build a null callback which takes five arguments
1.1723 + * and potentially return a value.
1.1724 + */
1.1725 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
1.1726 +Callback<R,T1,T2,T3,T4,T5> MakeNullCallback (void) {
1.1727 + return Callback<R,T1,T2,T3,T4,T5> ();
1.1728 +}
1.1729 +/**
1.1730 + * \ingroup MakeCallback
1.1731 + * \overload Callback<R> MakeNullCallback (void)
1.1732 + * \return a wrapper Callback
1.1733 + * Build a null callback which takes six arguments
1.1734 + * and potentially return a value.
1.1735 + */
1.1736 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
1.1737 +Callback<R,T1,T2,T3,T4,T5,T6> MakeNullCallback (void) {
1.1738 + return Callback<R,T1,T2,T3,T4,T5,T6> ();
1.1739 +}
1.1740 +
1.1741 +/**
1.1742 + * \ingroup MakeCallback
1.1743 + * \overload Callback<R> MakeNullCallback (void)
1.1744 + * \return a wrapper Callback
1.1745 + * Build a null callback which takes seven arguments
1.1746 + * and potentially return a value.
1.1747 + */
1.1748 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
1.1749 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeNullCallback (void) {
1.1750 + return Callback<R,T1,T2,T3,T4,T5,T6,T7> ();
1.1751 +}
1.1752 +
1.1753 +/**
1.1754 + * \ingroup MakeCallback
1.1755 + * \overload Callback<R> MakeNullCallback (void)
1.1756 + * \return a wrapper Callback
1.1757 + * Build a null callback which takes eight arguments
1.1758 + * and potentially return a value.
1.1759 + */
1.1760 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
1.1761 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeNullCallback (void) {
1.1762 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> ();
1.1763 +}
1.1764 +
1.1765 +/**
1.1766 + * \ingroup MakeCallback
1.1767 + * \overload Callback<R> MakeNullCallback (void)
1.1768 + * \return a wrapper Callback
1.1769 + * Build a null callback which takes nine arguments
1.1770 + * and potentially return a value.
1.1771 + */
1.1772 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
1.1773 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeNullCallback (void) {
1.1774 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> ();
1.1775 +}
1.1776 +
1.1777 +
1.1778 +/*
1.1779 + * The following is experimental code. It works but we have
1.1780 + * not yet determined whether or not it is really useful and whether
1.1781 + * or not we really want to use it.
1.1782 + */
1.1783 +
1.1784 +template <typename R, typename TX, typename ARG>
1.1785 +Callback<R> MakeBoundCallback (R (*fnPtr) (TX), ARG a) {
1.1786 + Ptr<CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
1.1787 + Create<BoundFunctorCallbackImpl<R (*) (TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a);
1.1788 + return Callback<R> (impl);
1.1789 +}
1.1790 +
1.1791 +template <typename R, typename TX, typename ARG,
1.1792 + typename T1>
1.1793 +Callback<R,T1> MakeBoundCallback (R (*fnPtr) (TX,T1), ARG a) {
1.1794 + Ptr<CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
1.1795 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
1.1796 + return Callback<R,T1> (impl);
1.1797 +}
1.1798 +template <typename R, typename TX, typename ARG,
1.1799 + typename T1, typename T2>
1.1800 +Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr) (TX,T1,T2), ARG a) {
1.1801 + Ptr<CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> > impl =
1.1802 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
1.1803 + return Callback<R,T1,T2> (impl);
1.1804 +}
1.1805 +template <typename R, typename TX, typename ARG,
1.1806 + typename T1, typename T2,typename T3>
1.1807 +Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3), ARG a) {
1.1808 + Ptr<CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> > impl =
1.1809 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a);
1.1810 + return Callback<R,T1,T2,T3> (impl);
1.1811 +}
1.1812 +template <typename R, typename TX, typename ARG,
1.1813 + typename T1, typename T2,typename T3,typename T4>
1.1814 +Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4), ARG a) {
1.1815 + Ptr<CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> > impl =
1.1816 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a);
1.1817 + return Callback<R,T1,T2,T3,T4> (impl);
1.1818 +}
1.1819 +template <typename R, typename TX, typename ARG,
1.1820 + typename T1, typename T2,typename T3,typename T4,typename T5>
1.1821 +Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5), ARG a) {
1.1822 + Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> > impl =
1.1823 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a);
1.1824 + return Callback<R,T1,T2,T3,T4,T5> (impl);
1.1825 +}
1.1826 +template <typename R, typename TX, typename ARG,
1.1827 + typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
1.1828 +Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6), ARG a) {
1.1829 + Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> > impl =
1.1830 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a);
1.1831 + return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
1.1832 +}
1.1833 +template <typename R, typename TX, typename ARG,
1.1834 + typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
1.1835 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7), ARG a) {
1.1836 + Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> > impl =
1.1837 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a);
1.1838 + return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
1.1839 +}
1.1840 +template <typename R, typename TX, typename ARG,
1.1841 + typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
1.1842 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a) {
1.1843 + Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> > impl =
1.1844 + Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a);
1.1845 + return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (impl);
1.1846 +}
1.1847 } // namespace ns3
1.1848
1.1849 namespace ns3 {
1.1850
1.1851 - class CallbackValue : public AttributeValue
1.1852 - {
1.1853 - public:
1.1854 - CallbackValue ();
1.1855 - CallbackValue (const CallbackBase &base);
1.1856 - virtual ~CallbackValue ();
1.1857 - void Set (CallbackBase base);
1.1858 - template <typename T>
1.1859 - bool GetAccessor (T &value) const;
1.1860 - virtual Ptr<AttributeValue> Copy (void) const;
1.1861 - virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
1.1862 - virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
1.1863 - private:
1.1864 - CallbackBase m_value;
1.1865 - };
1.1866 +class CallbackValue : public AttributeValue
1.1867 +{
1.1868 +public:
1.1869 + CallbackValue ();
1.1870 + CallbackValue (const CallbackBase &base);
1.1871 + virtual ~CallbackValue ();
1.1872 + void Set (CallbackBase base);
1.1873 + template <typename T>
1.1874 + bool GetAccessor (T &value) const;
1.1875 + virtual Ptr<AttributeValue> Copy (void) const;
1.1876 + virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
1.1877 + virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
1.1878 +private:
1.1879 + CallbackBase m_value;
1.1880 +};
1.1881
1.1882 - ATTRIBUTE_ACCESSOR_DEFINE(Callback);
1.1883 - ATTRIBUTE_CHECKER_DEFINE (Callback);
1.1884 +ATTRIBUTE_ACCESSOR_DEFINE(Callback);
1.1885 +ATTRIBUTE_CHECKER_DEFINE (Callback);
1.1886
1.1887 } // namespace ns3
1.1888
1.1889 namespace ns3 {
1.1890
1.1891 - template <typename T>
1.1892 - bool CallbackValue::GetAccessor (T &value) const
1.1893 - {
1.1894 - if (value.CheckType (m_value))
1.1895 - {
1.1896 - value.Assign (m_value);
1.1897 - return true;
1.1898 - }
1.1899 - return false;
1.1900 - }
1.1901 +template <typename T>
1.1902 +bool CallbackValue::GetAccessor (T &value) const
1.1903 +{
1.1904 + if (value.CheckType (m_value))
1.1905 + {
1.1906 + value.Assign (m_value);
1.1907 + return true;
1.1908 + }
1.1909 + return false;
1.1910 +}
1.1911
1.1912 } // namespace ns3
1.1913
2.1 --- a/src/mih/mih-function.cc Sun Nov 30 22:53:13 2008 +0100
2.2 +++ b/src/mih/mih-function.cc Mon Dec 01 09:22:24 2008 +0100
2.3 @@ -230,7 +230,6 @@
2.4 NS_ASSERT_MSG (configurationInformation.GetLinkDetectedConfigurationN () == 0 &&
2.5 configurationInformation.GetLinkConfigurationParameterN () == 0,
2.6 "Additional configuration information is not supported yet!");
2.7 -// NS_ASSERT_MSG (FindMihLinkSap (linkIdentifier, mihLinkSapI), "Illegal MihLinkSap search!");
2.8 EventList events (EventList::INVALID);
2.9 if (!FindMihLinkSap (linkIdentifier, mihLinkSapI))
2.10 {
3.1 --- a/src/mih/mih-function.h Sun Nov 30 22:53:13 2008 +0100
3.2 +++ b/src/mih/mih-function.h Mon Dec 01 09:22:24 2008 +0100
3.3 @@ -151,7 +151,6 @@
3.4 TransportSupportList transportSupports,
3.5 MakeBeforeBreakSupportList makeBeforeBreakSupports,
3.6 MihCapabilityDiscoverResponseCallback capabilityDiscoverResponseCallback);
3.7 -
3.8 };
3.9 } // namespace mih
3.10 } // namespace ns3
4.1 --- a/src/mih/mih-link-parameter-report.h Sun Nov 30 22:53:13 2008 +0100
4.2 +++ b/src/mih/mih-link-parameter-report.h Mon Dec 01 09:22:24 2008 +0100
4.3 @@ -23,12 +23,13 @@
4.4
4.5 #include <vector>
4.6 #include "ns3/ptr.h"
4.7 +#include "ns3/ref-count-base.h"
4.8 #include "mih-link-parameter.h"
4.9 #include "mih-threshold.h"
4.10
4.11 namespace ns3 {
4.12 namespace mih {
4.13 - class LinkParameterReport {
4.14 + class LinkParameterReport : public RefCountBase {
4.15 public:
4.16 LinkParameterReport (Threshold threshold,
4.17 LinkParameter *linkParameter);
5.1 --- a/src/mih/mih-protocol.cc Sun Nov 30 22:53:13 2008 +0100
5.2 +++ b/src/mih/mih-protocol.cc Mon Dec 01 09:22:24 2008 +0100
5.3 @@ -24,6 +24,7 @@
5.4 #include "mih-function.h"
5.5 #include "mih-protocol.h"
5.6 #include "mih-header.h"
5.7 +#include "mih-remote-event-source-trap.h"
5.8
5.9 NS_LOG_COMPONENT_DEFINE ("ns3::mih::MihProtocol");
5.10
5.11 @@ -57,7 +58,11 @@
5.12 return found;
5.13 }
5.14 Ptr<Session>
5.15 - MihProtocol::GetSession (MihfId fromMihfid, Address from, MihfId toMihfId, Address to, Ptr<Socket> serverSocket)
5.16 + MihProtocol::GetSession (MihfId fromMihfid,
5.17 + Address from,
5.18 + MihfId toMihfId,
5.19 + Address to,
5.20 + Ptr<Socket> serverSocket)
5.21 {
5.22 NS_LOG_WARN ("Arm a destructor event for this session!");
5.23 SessionListI i;
5.24 @@ -65,7 +70,11 @@
5.25 {
5.26 return (*i);
5.27 }
5.28 - Ptr<Session> session = Create<Session> (fromMihfid, from, toMihfId, to, serverSocket);
5.29 + Ptr<Session> session = Create<Session> (fromMihfid,
5.30 + from,
5.31 + toMihfId,
5.32 + to,
5.33 + serverSocket);
5.34 m_sessions.push_back (session);
5.35 return session;
5.36 }
5.37 @@ -151,7 +160,43 @@
5.38 NS_ASSERT_MSG (0, "Not implemented yet!");
5.39 break;
5.40 case MihHeader::MIH_EVENT_SUBSCRIBE :
5.41 - NS_ASSERT_MSG (0, "Not implemented yet!");
5.42 + if (mihHeader.GetOpCode () == MihHeader::REQUEST)
5.43 + {
5.44 + LinkIdentifier linkIdentifier;
5.45 + EventList events;
5.46 + linkIdentifier.TlvDeserialize (buffer);
5.47 + events.TlvDeserialize (buffer);
5.48 + session = GetSession (toMihfId, Address (), fromMihfId, from, socket);
5.49 + RemoteEventSourceTrap remoteEventSourceTrap = session->GetRemoteEventSourceTrap ();
5.50 +
5.51 + mihFunction->EventSubcribe (toMihfId,
5.52 + linkIdentifier,
5.53 + EventConfigurationInformation (),
5.54 + events.GetEventList () & EventList::LINK_DETECTED ? EventList::LINK_DETECTED : EventList::INVALID,
5.55 + events.GetEventList () & EventList::LINK_DETECTED ? MakeCallback (&RemoteEventSourceTrap::LinkDetected, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkDetectedInformation> (),
5.56 + events.GetEventList () & EventList::LINK_UP ? EventList::LINK_UP : EventList::INVALID,
5.57 + events.GetEventList () & EventList::LINK_UP ? MakeCallback (&RemoteEventSourceTrap::LinkUp, &remoteEventSourceTrap): MakeNullCallback<void, MihfId, LinkIdentifier, Address, Address, bool, MobilityManagementSupport> (),
5.58 + events.GetEventList () & EventList::LINK_DOWN ? EventList::LINK_DOWN : EventList::INVALID,
5.59 + events.GetEventList () & EventList::LINK_DOWN ? MakeCallback (&RemoteEventSourceTrap::LinkDown, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, Address, LinkDownReason> (),
5.60 + events.GetEventList () & EventList::LINK_PARAMETERS_REPORT ? EventList::LINK_PARAMETERS_REPORT : EventList::INVALID,
5.61 + events.GetEventList () & EventList::LINK_PARAMETERS_REPORT ? MakeCallback (&RemoteEventSourceTrap::LinkParametersReport, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, Address, LinkDownReason> (),
5.62 + events.GetEventList () & EventList::LINK_GOING_DOWN ? EventList::LINK_GOING_DOWN : EventList::INVALID,
5.63 + events.GetEventList () & EventList::LINK_GOING_DOWN ? MakeCallback (&RemoteEventSourceTrap::LinkGoingDown, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, uint64_t, LinkGoingDownReason> (),
5.64 + events.GetEventList () & EventList::LINK_HANDOVER_IMMINENT ? EventList::LINK_HANDOVER_IMMINENT : EventList::INVALID,
5.65 + events.GetEventList () & EventList::LINK_HANDOVER_IMMINENT ? MakeCallback (&RemoteEventSourceTrap::LinkHandoverImminent, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, LinkIdentifier, Address, Address> (),
5.66 + events.GetEventList () & EventList::LINK_HANDOVER_COMPLETE ? EventList::LINK_HANDOVER_COMPLETE : EventList::INVALID,
5.67 + events.GetEventList () & EventList::LINK_HANDOVER_COMPLETE ? MakeCallback (&RemoteEventSourceTrap::LinkHandoverComplete, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, LinkIdentifier, Address, Address, Status> (),
5.68 + events.GetEventList () & EventList::LINK_PDU_TRANSMIT_STATUS ? EventList::LINK_PDU_TRANSMIT_STATUS : EventList::INVALID,
5.69 + events.GetEventList () & EventList::LINK_PDU_TRANSMIT_STATUS ? MakeCallback (&RemoteEventSourceTrap::LinkPduTxStatus, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, uint16_t, bool> (),
5.70 + session->ReceiveEventSubscribeRequest (packet, mihHeader.GetTransactionId ()));
5.71 + }
5.72 + else if (mihHeader.GetOpCode () == MihHeader::RESPONSE)
5.73 + {
5.74 + }
5.75 + else
5.76 + {
5.77 + NS_ASSERT_MSG (0, "Illegal MihHeader::MIH_EVENT_SUBSCRIBE opcode!");
5.78 + }
5.79 break;
5.80 case MihHeader::MIH_EVENT_UNSUBSCRIBE :
5.81 NS_ASSERT_MSG (0, "Not implemented yet!");
5.82 @@ -200,7 +245,10 @@
5.83 miisQueries.TlvDeserialize (buffer);
5.84 transportOptions.TlvDeserialize (buffer);
5.85 TlvDeserialize (buffer, mbbSupportList);
5.86 - session = GetSession (toMihfId, Address (), fromMihfId, from);
5.87 + session = GetSession (toMihfId,
5.88 + Address (),
5.89 + fromMihfId,
5.90 + from);
5.91 NS_ASSERT_MSG (session != 0, "An error occured while retrieving a session!");
5.92 session->ReceiveCapabilityDiscoverResponse (fromMihfId,
5.93 status,
5.94 @@ -406,8 +454,50 @@
5.95 NS_ASSERT_MSG (configurationInformation.GetLinkDetectedConfigurationN () == 0 &&
5.96 configurationInformation.GetLinkConfigurationParameterN () == 0,
5.97 "Additional configuration information is not supported yet!");
5.98 -
5.99 + MihfId selfMihfid = GetObject<MihFunction> ()->GetMihfId ();
5.100 + Buffer buffer;
5.101 + Address to = ResolveMihfIdToAddress (destinationIdentifier);
5.102 + Address from = ResolveMihfIdToAddress (selfMihfid);
5.103 + Ptr<Packet> packet;
5.104 + Ptr<Session> session;
5.105 + // Mih Event List to send in the request;
5.106 + EventList events (EventList::INVALID);
5.107 + events.SetEventList (events.GetEventList () | linkDetectedEventType1);
5.108 + events.SetEventList (events.GetEventList () | linkUpEventType2);
5.109 + events.SetEventList (events.GetEventList () | linkDownEventType3);
5.110 + events.SetEventList (events.GetEventList () | linkParamReportEventType4);
5.111 + events.SetEventList (events.GetEventList () | linkGoingDownEventType5);
5.112 + events.SetEventList (events.GetEventList () | linkHOImminentEventType6);
5.113 + events.SetEventList (events.GetEventList () | linkHOCompleteEventType7);
5.114 + events.SetEventList (events.GetEventList () | linkPduTxStatusEventType8);
5.115 + // Create room at start of buffer;
5.116 + buffer.AddAtStart (selfMihfid.GetTlvSerializedSize () +
5.117 + destinationIdentifier.GetTlvSerializedSize () +
5.118 + linkIdentifier.GetTlvSerializedSize () +
5.119 + events.GetTlvSerializedSize ()); // Option
5.120 + // event
5.121 + // configuration
5.122 + // info list
5.123 + // left aside.
5.124 + // TLV-Serialize in buffer;
5.125 + selfMihfid.TlvSerialize (buffer);
5.126 + destinationIdentifier.TlvSerialize (buffer);
5.127 + linkIdentifier.TlvSerialize (buffer);
5.128 + events.TlvSerialize (buffer);
5.129 + // Fill the packet with payload from buffer;
5.130 + packet = Create<Packet> (buffer.PeekData (), buffer.GetSize ());
5.131 + session = GetSession (selfMihfid, from, destinationIdentifier, to);
5.132 + session->SendEventSubscribe (packet,
5.133 + events,
5.134 + linkDetectedEventCallback1,
5.135 + linkUpEventCallback2,
5.136 + linkDownEventCallback3,
5.137 + linkParamReportEventCallback4,
5.138 + linkGoingDownEventCallback5,
5.139 + linkHOImminentEventCallback6,
5.140 + linkHOCompleteEventCallback7,
5.141 + linkPduTxStatusEventCallback8,
5.142 + subscribeConfirmCallback);
5.143 }
5.144 -
5.145 } // namespace mih
5.146 } // namespace ns3
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
6.2 +++ b/src/mih/mih-remote-event-destination-trap.cc Mon Dec 01 09:22:24 2008 +0100
6.3 @@ -0,0 +1,203 @@
6.4 +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
6.5 +/*
6.6 + * Copyright (c) 2008 IT-SUDPARIS
6.7 + *
6.8 + * This program is free software; you can redistribute it and/or modify
6.9 + * it under the terms of the GNU General Public License version 2 as
6.10 + * published by the Free Software Foundation;
6.11 + *
6.12 + * This program is distributed in the hope that it will be useful,
6.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6.15 + * GNU General Public License for more details.
6.16 + *
6.17 + * You should have received a copy of the GNU General Public License
6.18 + * along with this program; if not, write to the Free Software
6.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6.20 + *
6.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
6.22 + */
6.23 +
6.24 +#include "mih-remote-event-destination-trap.h"
6.25 +
6.26 +namespace ns3 {
6.27 + namespace mih {
6.28 + RemoteEventDestinationTrap::RemoteEventDestinationTrap (void)
6.29 + {
6.30 + }
6.31 + // AddRemove callback methods;
6.32 + void
6.33 + RemoteEventDestinationTrap::AddLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb)
6.34 + {
6.35 + m_linkDetectedIndication.ConnectWithoutContext (linkDetectedCb);
6.36 + }
6.37 + void
6.38 + RemoteEventDestinationTrap::RemoveLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb)
6.39 + {
6.40 + m_linkDetectedIndication.DisconnectWithoutContext (linkDetectedCb);
6.41 + }
6.42 + void
6.43 + RemoteEventDestinationTrap::AddLinkUpCallback (MihLinkUpIndicationCallback linkUpCb)
6.44 + {
6.45 + m_linkUpIndication.ConnectWithoutContext (linkUpCb);
6.46 + }
6.47 + void
6.48 + RemoteEventDestinationTrap::RemoveLinkUpCallback (MihLinkUpIndicationCallback linkUpCb)
6.49 + {
6.50 + m_linkUpIndication.DisconnectWithoutContext (linkUpCb);
6.51 + }
6.52 + void
6.53 + RemoteEventDestinationTrap::AddLinkDownCallback (MihLinkDownIndicationCallback linkDownCb)
6.54 + {
6.55 + m_linkDownIndication.ConnectWithoutContext (linkDownCb);
6.56 + }
6.57 + void
6.58 + RemoteEventDestinationTrap::RemoveLinkDownCallback (MihLinkDownIndicationCallback linkDownCb)
6.59 + {
6.60 + m_linkDownIndication.DisconnectWithoutContext (linkDownCb);
6.61 + }
6.62 + void
6.63 + RemoteEventDestinationTrap::AddLinkParamatersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb)
6.64 + {
6.65 + m_linkParametersReportIndication.ConnectWithoutContext (parametersReportCb);
6.66 + }
6.67 + void
6.68 + RemoteEventDestinationTrap::RemoveLinkParametersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb)
6.69 + {
6.70 + m_linkParametersReportIndication.DisconnectWithoutContext (parametersReportCb);
6.71 + }
6.72 + void
6.73 + RemoteEventDestinationTrap::AddLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb)
6.74 + {
6.75 + m_linkGoingDownIndication.ConnectWithoutContext (linkGoingDownCb);
6.76 + }
6.77 + void
6.78 + RemoteEventDestinationTrap::RemoveLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb)
6.79 + {
6.80 + m_linkGoingDownIndication.DisconnectWithoutContext (linkGoingDownCb);
6.81 + }
6.82 + void
6.83 + RemoteEventDestinationTrap::AddLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb)
6.84 + {
6.85 + m_linkHandoverImminentIndication.ConnectWithoutContext (linkHOImminentCb);
6.86 + }
6.87 + void
6.88 + RemoteEventDestinationTrap::RemoveLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb)
6.89 + {
6.90 + m_linkHandoverImminentIndication.DisconnectWithoutContext (linkHOImminentCb);
6.91 + }
6.92 + void
6.93 + RemoteEventDestinationTrap::AddLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb)
6.94 + {
6.95 + m_linkHandoverCompleteIndication.ConnectWithoutContext (linkHOCompleteCb);
6.96 + }
6.97 + void
6.98 + RemoteEventDestinationTrap::RemoveLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb)
6.99 + {
6.100 + m_linkHandoverCompleteIndication.DisconnectWithoutContext (linkHOCompleteCb);
6.101 + }
6.102 + void
6.103 + RemoteEventDestinationTrap::AddLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb)
6.104 + {
6.105 + m_linkPduTransmitStatusIndication.ConnectWithoutContext (linkPduTxStatusCb);
6.106 + }
6.107 + void
6.108 + RemoteEventDestinationTrap::RemoveLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb)
6.109 + {
6.110 + m_linkPduTransmitStatusIndication.DisconnectWithoutContext (linkPduTxStatusCb);
6.111 +
6.112 + }
6.113 + // Callback accessors;
6.114 + void
6.115 + RemoteEventDestinationTrap::LinkDetected (MihfId mihfId,
6.116 + LinkDetectedInformation linkDetectedInfo)
6.117 + {
6.118 + m_linkDetectedIndication (mihfId, linkDetectedInfo);
6.119 + }
6.120 + void
6.121 + RemoteEventDestinationTrap::LinkUp (MihfId mihfId,
6.122 + LinkIdentifier linkIdentifier,
6.123 + Address oldAR,
6.124 + Address newAR,
6.125 + bool ipRenewalFlag,
6.126 + MobilityManagementSupport mobilitySupport)
6.127 + {
6.128 + m_linkUpIndication (mihfId,
6.129 + linkIdentifier,
6.130 + oldAR,
6.131 + newAR,
6.132 + ipRenewalFlag,
6.133 + mobilitySupport);
6.134 + }
6.135 + void
6.136 + RemoteEventDestinationTrap::LinkDown (MihfId mihfId,
6.137 + LinkIdentifier linkIdentifier,
6.138 + Address oldAR,
6.139 + LinkDownReason reasonCode)
6.140 + {
6.141 + m_linkDownIndication (mihfId,
6.142 + linkIdentifier,
6.143 + oldAR,
6.144 + reasonCode);
6.145 + }
6.146 + void
6.147 + RemoteEventDestinationTrap::LinkParametersReport (MihfId mihfId,
6.148 + LinkIdentifier linkIdentifier,
6.149 + LinkParameterReportList params)
6.150 + {
6.151 + m_linkParametersReportIndication (mihfId,
6.152 + linkIdentifier,
6.153 + params);
6.154 + }
6.155 + void
6.156 + RemoteEventDestinationTrap::LinkGoingDown (MihfId mihfId,
6.157 + LinkIdentifier linkIdentifier,
6.158 + uint64_t timeInterval,
6.159 + LinkGoingDownReason reasonCode)
6.160 + {
6.161 + m_linkGoingDownIndication (mihfId,
6.162 + linkIdentifier,
6.163 + timeInterval,
6.164 + reasonCode);
6.165 + }
6.166 + void
6.167 + RemoteEventDestinationTrap::LinkHandoverImminent (MihfId mihfId,
6.168 + LinkIdentifier oldLinkIdentifier,
6.169 + LinkIdentifier newLinkidentifier,
6.170 + Address oldAR,
6.171 + Address newAR)
6.172 + {
6.173 + m_linkHandoverImminentIndication (mihfId,
6.174 + oldLinkIdentifier,
6.175 + newLinkidentifier,
6.176 + oldAR,
6.177 + newAR);
6.178 + }
6.179 + void
6.180 + RemoteEventDestinationTrap::LinkHandoverComplete (MihfId mihfId,
6.181 + LinkIdentifier oldLinkIdentifier,
6.182 + LinkIdentifier newLinkIdentifier,
6.183 + Address oldAR,
6.184 + Address newAR,
6.185 + Status handoverStatus)
6.186 + {
6.187 + m_linkHandoverCompleteIndication (mihfId,
6.188 + oldLinkIdentifier,
6.189 + newLinkIdentifier,
6.190 + oldAR,
6.191 + newAR,
6.192 + handoverStatus);
6.193 + }
6.194 + void
6.195 + RemoteEventDestinationTrap::LinkPduTxStatus (MihfId mihfId,
6.196 + LinkIdentifier linkIdentifier,
6.197 + uint16_t packetIdentifier,
6.198 + bool transmissionStatus)
6.199 + {
6.200 + m_linkPduTransmitStatusIndication (mihfId,
6.201 + linkIdentifier,
6.202 + packetIdentifier,
6.203 + transmissionStatus);
6.204 + }
6.205 + }
6.206 +}
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
7.2 +++ b/src/mih/mih-remote-event-destination-trap.h Mon Dec 01 09:22:24 2008 +0100
7.3 @@ -0,0 +1,98 @@
7.4 +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
7.5 +/*
7.6 + * Copyright (c) 2008 IT-SUDPARIS
7.7 + *
7.8 + * This program is free software; you can redistribute it and/or modify
7.9 + * it under the terms of the GNU General Public License version 2 as
7.10 + * published by the Free Software Foundation;
7.11 + *
7.12 + * This program is distributed in the hope that it will be useful,
7.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
7.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7.15 + * GNU General Public License for more details.
7.16 + *
7.17 + * You should have received a copy of the GNU General Public License
7.18 + * along with this program; if not, write to the Free Software
7.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
7.20 + *
7.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
7.22 + */
7.23 +
7.24 +#ifndef MIH_REMOTE_EVENT_DESTINATION_TRAP_H
7.25 +#define MIH_REMOTE_EVENT_DESTINATION_TRAP_H
7.26 +
7.27 +#include "ns3/ref-count-base.h"
7.28 +#include "mih-callbacks.h"
7.29 +
7.30 +namespace ns3 {
7.31 + namespace mih {
7.32 + class RemoteEventDestinationTrap : public RefCountBase {
7.33 + public:
7.34 + RemoteEventDestinationTrap (void);
7.35 + // AddRemove callback methods;
7.36 + void AddLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb);
7.37 + void RemoveLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb);
7.38 + void AddLinkUpCallback (MihLinkUpIndicationCallback linkUpCb);
7.39 + void RemoveLinkUpCallback (MihLinkUpIndicationCallback linkUpCb);
7.40 + void AddLinkDownCallback (MihLinkDownIndicationCallback linkDownCb);
7.41 + void RemoveLinkDownCallback (MihLinkDownIndicationCallback linkDownCb);
7.42 + void AddLinkParamatersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb);
7.43 + void RemoveLinkParametersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb);
7.44 + void AddLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb);
7.45 + void RemoveLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb);
7.46 + void AddLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb);
7.47 + void RemoveLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb);
7.48 + void AddLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb);
7.49 + void RemoveLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb);
7.50 + void AddLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb);
7.51 + void RemoveLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb);
7.52 + // Callback accessors;
7.53 + void LinkDetected (MihfId mihfId,
7.54 + LinkDetectedInformation linkDetectedInfo);
7.55 + void LinkUp (MihfId mihfId,
7.56 + LinkIdentifier linkIdentifier,
7.57 + Address oldAR,
7.58 + Address newAR,
7.59 + bool ipRenewalFlag,
7.60 + MobilityManagementSupport mobilitySupport);
7.61 + void LinkDown (MihfId mihfId,
7.62 + LinkIdentifier linkIdentifier,
7.63 + Address oldAR,
7.64 + LinkDownReason reasonCode);
7.65 + void LinkParametersReport (MihfId mihfId,
7.66 + LinkIdentifier linkIdentifier,
7.67 + LinkParameterReportList params);
7.68 + void LinkGoingDown (MihfId mihfId,
7.69 + LinkIdentifier linkIdentifier,
7.70 + uint64_t timeInterval,
7.71 + LinkGoingDownReason reasonCode);
7.72 + void LinkHandoverImminent (MihfId mihfId,
7.73 + LinkIdentifier oldLinkIdentifier,
7.74 + LinkIdentifier newLinkidentifier,
7.75 + Address oldAR,
7.76 + Address newAR);
7.77 + void LinkHandoverComplete (MihfId mihfId,
7.78 + LinkIdentifier oldLinkIdentifier,
7.79 + LinkIdentifier newLinkIdentifier,
7.80 + Address oldAR,
7.81 + Address newAR,
7.82 + Status handoverStatus);
7.83 + void LinkPduTxStatus (MihfId mihfId,
7.84 + LinkIdentifier linkIdentifier,
7.85 + uint16_t packetIdentifier,
7.86 + bool transmissionStatus);
7.87 +
7.88 + protected:
7.89 + MihLinkDetectedIndicationTracedCallback m_linkDetectedIndication;
7.90 + MihLinkUpIndicationTracedCallback m_linkUpIndication;
7.91 + MihLinkDownIndicationTracedCallback m_linkDownIndication;
7.92 + MihLinkParametersReportIndicationTracedCallback m_linkParametersReportIndication;
7.93 + MihLinkGoingDownIndicationTracedCallback m_linkGoingDownIndication;
7.94 + MihLinkHandoverImminentIndicationTracedCallback m_linkHandoverImminentIndication;
7.95 + MihLinkHandoverCompleteIndicationTracedCallback m_linkHandoverCompleteIndication;
7.96 + MihLinkPduTransmitStatusIndicationTracedCallback m_linkPduTransmitStatusIndication;
7.97 + };
7.98 + }
7.99 +}
7.100 +
7.101 +#endif /* !MIH_REMOTE_EVENT_DESTINATION_TRAP_H */
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
8.2 +++ b/src/mih/mih-remote-event-source-trap.cc Mon Dec 01 09:22:24 2008 +0100
8.3 @@ -0,0 +1,98 @@
8.4 +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
8.5 +/*
8.6 + * Copyright (c) 2008 IT-SUDPARIS
8.7 + *
8.8 + * This program is free software; you can redistribute it and/or modify
8.9 + * it under the terms of the GNU General Public License version 2 as
8.10 + * published by the Free Software Foundation;
8.11 + *
8.12 + * This program is distributed in the hope that it will be useful,
8.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8.15 + * GNU General Public License for more details.
8.16 + *
8.17 + * You should have received a copy of the GNU General Public License
8.18 + * along with this program; if not, write to the Free Software
8.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8.20 + *
8.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
8.22 + */
8.23 +
8.24 +#include "mih-session.h"
8.25 +#include "mih-remote-event-source-trap.h"
8.26 +
8.27 +namespace ns3 {
8.28 + namespace mih {
8.29 + RemoteEventSourceTrap::RemoteEventSourceTrap (void)
8.30 + {}
8.31 + RemoteEventSourceTrap::~RemoteEventSourceTrap (void)
8.32 + {
8.33 + m_session = 0;
8.34 + }
8.35 + void
8.36 + RemoteEventSourceTrap::SetSession (Ptr<Session> session)
8.37 + {
8.38 + m_session = session;
8.39 + }
8.40 + // Callback accessors;
8.41 + void
8.42 + RemoteEventSourceTrap::LinkDetected (MihfId,
8.43 + LinkDetectedInformation)
8.44 + {
8.45 +
8.46 + }
8.47 + void
8.48 + RemoteEventSourceTrap::LinkUp (MihfId,
8.49 + LinkIdentifier,
8.50 + Address,
8.51 + Address,
8.52 + bool,
8.53 + MobilityManagementSupport)
8.54 + {
8.55 + }
8.56 + void
8.57 + RemoteEventSourceTrap::LinkDown (MihfId,
8.58 + LinkIdentifier,
8.59 + Address,
8.60 + LinkDownReason)
8.61 + {
8.62 + }
8.63 + void
8.64 + RemoteEventSourceTrap::LinkParametersReport (MihfId,
8.65 + LinkIdentifier,
8.66 + LinkParameterReportList)
8.67 + {
8.68 + }
8.69 + void
8.70 + RemoteEventSourceTrap::LinkGoingDown (MihfId,
8.71 + LinkIdentifier,
8.72 + uint64_t,
8.73 + LinkGoingDownReason)
8.74 + {
8.75 + }
8.76 + void
8.77 + RemoteEventSourceTrap::LinkHandoverImminent (MihfId,
8.78 + LinkIdentifier,
8.79 + LinkIdentifier,
8.80 + Address,
8.81 + Address)
8.82 + {
8.83 + }
8.84 + void
8.85 + RemoteEventSourceTrap::LinkHandoverComplete (MihfId,
8.86 + LinkIdentifier,
8.87 + LinkIdentifier,
8.88 + Address,
8.89 + Address,
8.90 + Status)
8.91 + {
8.92 + }
8.93 + void
8.94 + RemoteEventSourceTrap::LinkPduTxStatus (MihfId,
8.95 + LinkIdentifier,
8.96 + uint16_t,
8.97 + bool)
8.98 + {
8.99 + }
8.100 + }
8.101 +}
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
9.2 +++ b/src/mih/mih-remote-event-source-trap.h Mon Dec 01 09:22:24 2008 +0100
9.3 @@ -0,0 +1,79 @@
9.4 +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
9.5 +/*
9.6 + * Copyright (c) 2008 IT-SUDPARIS
9.7 + *
9.8 + * This program is free software; you can redistribute it and/or modify
9.9 + * it under the terms of the GNU General Public License version 2 as
9.10 + * published by the Free Software Foundation;
9.11 + *
9.12 + * This program is distributed in the hope that it will be useful,
9.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
9.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9.15 + * GNU General Public License for more details.
9.16 + *
9.17 + * You should have received a copy of the GNU General Public License
9.18 + * along with this program; if not, write to the Free Software
9.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
9.20 + *
9.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
9.22 + */
9.23 +
9.24 +#ifndef MIH_REMOTE_EVENT_SOURCE_TRAP_H
9.25 +#define MIH_REMOTE_EVENT_SOURCE_TRAP_H
9.26 +
9.27 +#include "ns3/ptr.h"
9.28 +#include "ns3/ref-count-base.h"
9.29 +#include "mih-callbacks.h"
9.30 +
9.31 +namespace ns3 {
9.32 + namespace mih {
9.33 +
9.34 + class Session;
9.35 +
9.36 + class RemoteEventSourceTrap : public RefCountBase {
9.37 + public:
9.38 + RemoteEventSourceTrap (void);
9.39 + virtual ~RemoteEventSourceTrap (void);
9.40 + void SetSession (Ptr<Session> session);
9.41 + // Callback accessors;
9.42 + void LinkDetected (MihfId,
9.43 + LinkDetectedInformation);
9.44 + void LinkUp (MihfId,
9.45 + LinkIdentifier,
9.46 + Address,
9.47 + Address,
9.48 + bool,
9.49 + MobilityManagementSupport);
9.50 + void LinkDown (MihfId,
9.51 + LinkIdentifier,
9.52 + Address,
9.53 + LinkDownReason);
9.54 + void LinkParametersReport (MihfId,
9.55 + LinkIdentifier,
9.56 + LinkParameterReportList);
9.57 + void LinkGoingDown (MihfId,
9.58 + LinkIdentifier,
9.59 + uint64_t,
9.60 + LinkGoingDownReason);
9.61 + void LinkHandoverImminent (MihfId,
9.62 + LinkIdentifier,
9.63 + LinkIdentifier,
9.64 + Address,
9.65 + Address);
9.66 + void LinkHandoverComplete (MihfId,
9.67 + LinkIdentifier,
9.68 + LinkIdentifier,
9.69 + Address,
9.70 + Address,
9.71 + Status);
9.72 + void LinkPduTxStatus (MihfId,
9.73 + LinkIdentifier,
9.74 + uint16_t,
9.75 + bool);
9.76 + protected:
9.77 + Ptr<Session> m_session;
9.78 + };
9.79 + }
9.80 +}
9.81 +
9.82 +#endif /* !MIH_REMOTE_EVENT_SOURCE_TRAP_H */
10.1 --- a/src/mih/mih-session.cc Sun Nov 30 22:53:13 2008 +0100
10.2 +++ b/src/mih/mih-session.cc Mon Dec 01 09:22:24 2008 +0100
10.3 @@ -111,6 +111,17 @@
10.4 m_socket->SendTo (m_currentTransaction->GetPacket (), 0, m_destinationInetSocketAddress);
10.5 }
10.6 }
10.7 + // Remote events access methods;
10.8 + RemoteEventSourceTrap&
10.9 + Session::GetRemoteEventSourceTrap (void)
10.10 + {
10.11 + return m_remoteEventSourceTrap;
10.12 + }
10.13 + RemoteEventDestinationTrap&
10.14 + Session::GetRemoteEventDestinationTrap (void)
10.15 + {
10.16 + return m_remoteEventDestinationTrap;
10.17 + }
10.18 void
10.19 Session::SendRegisterRequest (Ptr<Packet> packet,
10.20 MihRegisterConfirmCallback registerConfirmCallback)
10.21 @@ -233,5 +244,67 @@
10.22 transaction->SetState (Transaction::SUCCESS);
10.23 transaction->SetToBeDeleted ();
10.24 }
10.25 + void
10.26 + Session::SendEventSubscribe (Ptr<Packet> packet,
10.27 + EventList events,
10.28 + MihLinkDetectedIndicationCallback linkDetectedEventCallback1,
10.29 + MihLinkUpIndicationCallback linkUpEventCallback2,
10.30 + MihLinkDownIndicationCallback linkDownEventCallback3,
10.31 + MihLinkParametersReportIndicationCallback linkParamReportEventCallback4,
10.32 + MihLinkGoingDownIndicationCallback linkGoingDownEventCallback5,
10.33 + MihLinkHandoverImminentIndicationCallback linkHOImminentEventCallback6,
10.34 + MihLinkHandoverCompleteIndicationCallback linkHOCompleteEventCallback7,
10.35 + MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusEventCallback8,
10.36 + MihEventSubscribeConfirmCallback subscribeConfirmCallback)
10.37 + {
10.38 + MihHeader mihHeader;
10.39 + uint16_t transactionId = m_nextTransactionId;
10.40 + m_nextTransactionId++;
10.41 + mihHeader.SetVersion (MihHeader::VERSION_ONE);
10.42 + mihHeader.SetServiceId (MihHeader::COMMAND);
10.43 + mihHeader.SetOpCode (MihHeader::REQUEST);
10.44 + mihHeader.SetActionId (MihHeader::MIH_EVENT_SUBSCRIBE);
10.45 + mihHeader.SetTransactionId (transactionId);
10.46 + mihHeader.SetPayloadLength (packet->GetSize ());
10.47 + packet->AddHeader (mihHeader);
10.48 +
10.49 + Ptr<EventSubscribeRequestTransaction> eventSubscribeRequestTransaction = Create<EventSubscribeRequestTransaction> (packet,
10.50 + GetFromMihfId (),
10.51 + GetToMihfId (),
10.52 + GetToAddress (),
10.53 + transactionId,
10.54 + subscribeConfirmCallback);
10.55 +
10.56 + eventSubscribeRequestTransaction->SetNotifyDoneCallback (MakeCallback (&Session::NotifyPendingCurrentRequestDone, this));
10.57 + m_pendingRequestQueue.push_back (eventSubscribeRequestTransaction);
10.58 +
10.59 + // Fill RemoteEventDestinationTrap;
10.60 + m_remoteEventDestinationTrap.AddLinkDetectedCallback (linkDetectedEventCallback1);
10.61 + m_remoteEventDestinationTrap.AddLinkUpCallback (linkUpEventCallback2);
10.62 + m_remoteEventDestinationTrap.AddLinkDownCallback (linkDownEventCallback3) ;
10.63 + m_remoteEventDestinationTrap.AddLinkParamatersReportCallback (linkParamReportEventCallback4) ;
10.64 + m_remoteEventDestinationTrap.AddLinkGoingDownCallback (linkGoingDownEventCallback5) ;
10.65 + m_remoteEventDestinationTrap.AddLinkHandoverImminentCallback (linkHOImminentEventCallback6) ;
10.66 + m_remoteEventDestinationTrap.AddLinkHandoverCompleteCallback (linkHOCompleteEventCallback7) ;
10.67 + m_remoteEventDestinationTrap.AddLinkPduTxStatusCallback (linkPduTxStatusEventCallback8) ;
10.68 +
10.69 + NotifyNewPendingRequest ();
10.70 + }
10.71 + MihEventSubscribeConfirmCallback
10.72 + Session::ReceiveEventSubscribeRequest (Ptr<Packet> packet,
10.73 + uint16_t transactionId)
10.74 + {
10.75 + Ptr<EventSubscribeResponseTransaction> eventSubscribeResponseTransaction = Create<EventSubscribeResponseTransaction> (packet,
10.76 + GetFromMihfId (),
10.77 + GetToMihfId (),
10.78 + GetToAddress (),
10.79 + transactionId,
10.80 + m_socket);
10.81 + eventSubscribeResponseTransaction->SetNotifyDoneCallback (MakeCallback (&Session::NotifyPendingResponseDone, this));
10.82 + NS_ASSERT_MSG (m_pendingResponseTransaction == 0, "Received Request while a pending Response is in the queue!");
10.83 + m_pendingResponseTransaction = eventSubscribeResponseTransaction;
10.84 + return MakeCallback (&EventSubscribeResponseTransaction::SendEventSubcribeResponse, eventSubscribeResponseTransaction);
10.85 + }
10.86 +
10.87 } // namespace mih
10.88 } // namespace ns3
11.1 --- a/src/mih/mih-session.h Sun Nov 30 22:53:13 2008 +0100
11.2 +++ b/src/mih/mih-session.h Mon Dec 01 09:22:24 2008 +0100
11.3 @@ -27,6 +27,8 @@
11.4 #include "ns3/socket.h"
11.5 #include "mih-transaction.h"
11.6 #include "mih-callbacks.h"
11.7 +#include "mih-remote-event-destination-trap.h"
11.8 +#include "mih-remote-event-source-trap.h"
11.9
11.10 namespace ns3 {
11.11 namespace mih {
11.12 @@ -41,6 +43,7 @@
11.13 MihfId GetFromMihfId (void);
11.14 Address GetFromAddress (void);
11.15 void SetSocket (Ptr<Socket> socket);
11.16 + // Register
11.17 void SendRegisterRequest (Ptr<Packet> packet,
11.18 MihRegisterConfirmCallback registerConfirmCallback);
11.19 MihRegisterResponseCallback ReceiveRegisterRequest (Ptr<Packet> packet,
11.20 @@ -48,6 +51,7 @@
11.21 void ReceiveRegisterResponse (MihfId from,
11.22 Status status,
11.23 uint32_t validLifeTime = 0);
11.24 + // Capability Discover
11.25 void SendCapabilityDiscoverRequest (Ptr<Packet> packet,
11.26 MihCapabilityDiscoverConfirmCallback capabilityDiscoverConfirmCallback);
11.27 MihCapabilityDiscoverResponseCallback ReceiveCapabilityDiscoverRequest (Ptr<Packet> packet,
11.28 @@ -60,6 +64,24 @@
11.29 InformationServiceQueryTypeList miisQueries,
11.30 TransportSupportList transportOptions,
11.31 MakeBeforeBreakSupportList mbbSupportList);
11.32 + // Event Subscribe
11.33 + void SendEventSubscribe (Ptr<Packet> packet,
11.34 + EventList events,
11.35 + MihLinkDetectedIndicationCallback linkDetectedEventCallback1,
11.36 + MihLinkUpIndicationCallback linkUpEventCallback2,
11.37 + MihLinkDownIndicationCallback linkDownEventCallback3,
11.38 + MihLinkParametersReportIndicationCallback linkParamReportEventCallback4,
11.39 + MihLinkGoingDownIndicationCallback linkGoingDownEventCallback5,
11.40 + MihLinkHandoverImminentIndicationCallback linkHOImminentEventCallback6,
11.41 + MihLinkHandoverCompleteIndicationCallback linkHOCompleteEventCallback7,
11.42 + MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusEventCallback8,
11.43 + MihEventSubscribeConfirmCallback subscribeConfirmCallback);
11.44 + MihEventSubscribeConfirmCallback ReceiveEventSubscribeRequest (Ptr<Packet> packet,
11.45 + uint16_t transactionId);
11.46 +
11.47 + // Remote events access methods;
11.48 + RemoteEventSourceTrap& GetRemoteEventSourceTrap (void);
11.49 + RemoteEventDestinationTrap& GetRemoteEventDestinationTrap (void);
11.50 protected:
11.51
11.52 /* void Enqueue (Ptr<Transaction> transaction, TransactionQueue queue); */
11.53 @@ -89,6 +111,9 @@
11.54 Ptr<Transaction> m_currentTransaction;
11.55 Ptr<Transaction> m_pendingResponseTransaction;
11.56 TransactionQueue m_pendingEventQueue;
11.57 +
11.58 + RemoteEventDestinationTrap m_remoteEventDestinationTrap;
11.59 + RemoteEventSourceTrap m_remoteEventSourceTrap;
11.60 };
11.61 typedef std::vector<Ptr<Session> > SessionList;
11.62 typedef SessionList::iterator SessionListI;
12.1 --- a/src/mih/mih-transaction.cc Sun Nov 30 22:53:13 2008 +0100
12.2 +++ b/src/mih/mih-transaction.cc Mon Dec 01 09:22:24 2008 +0100
12.3 @@ -251,5 +251,78 @@
12.4 m_socket->SendTo (packet, 0, m_to);
12.5 SetToBeDeleted ();
12.6 }
12.7 + //class EventSubscribeRequestTransaction;
12.8 + EventSubscribeRequestTransaction::EventSubscribeRequestTransaction (Ptr<Packet> packet,
12.9 + MihfId fromMihfid,
12.10 + MihfId toMihfid,
12.11 + Address to,
12.12 + uint16_t tid,
12.13 + MihEventSubscribeConfirmCallback subscribeConfirmCallback) :
12.14 + Transaction (packet, fromMihfid, toMihfid, to, tid),
12.15 + m_subscribeConfirmCallback (subscribeConfirmCallback)
12.16 + {
12.17 + }
12.18 + EventSubscribeRequestTransaction::~EventSubscribeRequestTransaction (void)
12.19 + {}
12.20 + void
12.21 + EventSubscribeRequestTransaction::EventSubscribeConfirm (MihfId mihfId,
12.22 + Status status,
12.23 + LinkIdentifier linkIdentifier,
12.24 + EventList events)
12.25 + {
12.26 + m_subscribeConfirmCallback (mihfId, status,
12.27 + linkIdentifier, events);
12.28 + }
12.29 + // class EventSubscribeResponseTransaction;
12.30 + EventSubscribeResponseTransaction::EventSubscribeResponseTransaction (Ptr<Packet> packet,
12.31 + MihfId fromMihfid,
12.32 + MihfId toMihfid,
12.33 + Address to,
12.34 + uint16_t tid,
12.35 + Ptr<Socket> socket) :
12.36 + Transaction (packet, fromMihfid, toMihfid, to, tid),
12.37 + m_socket (socket)
12.38 + {}
12.39 + EventSubscribeResponseTransaction::~EventSubscribeResponseTransaction (void)
12.40 + {
12.41 + m_socket = 0;
12.42 + }
12.43 + void
12.44 + EventSubscribeResponseTransaction::SendEventSubcribeResponse (MihfId mihfId,
12.45 + Status status,
12.46 + LinkIdentifier linkIdentifier,
12.47 + EventList events)
12.48 + {
12.49 + NS_ASSERT_MSG (mihfId == m_toMihfId, "Destination transaction MihfId and required one mismatch!");
12.50 + Buffer buffer;
12.51 + Ptr<Packet> packet;
12.52 + // Create room at start of buffer;
12.53 + buffer.AddAtStart (m_fromMihfId.GetTlvSerializedSize () +
12.54 + mihfId.GetTlvSerializedSize () +
12.55 + status.GetTlvSerializedSize () +
12.56 + linkIdentifier.GetTlvSerializedSize () +
12.57 + events.GetTlvSerializedSize ());
12.58 + // TLV-Serialize in buffer;
12.59 + m_fromMihfId.TlvSerialize (buffer);
12.60 + mihfId.TlvSerialize (buffer);
12.61 + status.TlvSerialize (buffer);
12.62 + linkIdentifier.TlvSerialize (buffer);
12.63 + events.TlvSerialize (buffer);
12.64 + // Fill the packet with payload from buffer
12.65 + packet = Create<Packet> (buffer.PeekData (), buffer.GetSize ());
12.66 + // Mih Header;
12.67 + MihHeader mihHeader;
12.68 + mihHeader.SetVersion (MihHeader::VERSION_ONE);
12.69 + mihHeader.SetServiceId (MihHeader::COMMAND);
12.70 + mihHeader.SetOpCode (MihHeader::RESPONSE);
12.71 + mihHeader.SetActionId (MihHeader::MIH_EVENT_SUBSCRIBE);
12.72 + mihHeader.SetTransactionId (GetTransactionId ());
12.73 + mihHeader.SetPayloadLength (packet->GetSize ());
12.74 + packet->AddHeader (mihHeader);
12.75 + // Send via socket;
12.76 + // Add possibilities to select the source interface
12.77 + m_socket->SendTo (packet, 0, m_to);
12.78 + SetToBeDeleted ();
12.79 + }
12.80 } // namespace mih
12.81 } // namespace ns3
13.1 --- a/src/mih/mih-transaction.h Sun Nov 30 22:53:13 2008 +0100
13.2 +++ b/src/mih/mih-transaction.h Mon Dec 01 09:22:24 2008 +0100
13.3 @@ -139,6 +139,39 @@
13.4 protected:
13.5 Ptr<Socket> m_socket;
13.6 };
13.7 + class EventSubscribeRequestTransaction : public Transaction {
13.8 + public:
13.9 + EventSubscribeRequestTransaction (Ptr<Packet> packet,
13.10 + MihfId fromMihfid,
13.11 + MihfId toMihfid,
13.12 + Address to,
13.13 + uint16_t tid,
13.14 + MihEventSubscribeConfirmCallback subscribeConfirmCallback);
13.15 + virtual ~EventSubscribeRequestTransaction (void);
13.16 + void EventSubscribeConfirm (MihfId mihfId,
13.17 + Status status,
13.18 + LinkIdentifier linkIdentifier,
13.19 + EventList events);
13.20 + protected:
13.21 + MihEventSubscribeConfirmCallback m_subscribeConfirmCallback;
13.22 + };
13.23 + class EventSubscribeResponseTransaction : public Transaction {
13.24 + public:
13.25 + EventSubscribeResponseTransaction (Ptr<Packet> packet,
13.26 + MihfId fromMihfid,
13.27 + MihfId toMihfid,
13.28 + Address to,
13.29 + uint16_t tid,
13.30 + Ptr<Socket> socket);
13.31 + virtual ~EventSubscribeResponseTransaction (void);
13.32 + void SendEventSubcribeResponse (MihfId mihfId,
13.33 + Status status,
13.34 + LinkIdentifier linkIdentifier,
13.35 + EventList events);
13.36 +
13.37 + protected:
13.38 + Ptr<Socket> m_socket;
13.39 + };
13.40 typedef std::deque<Ptr<Transaction> > TransactionQueue;
13.41 typedef TransactionQueue::reverse_iterator TransactionQueueRI;
13.42 typedef TransactionQueue::iterator TransactionQueueI;
14.1 --- a/src/mih/wscript Sun Nov 30 22:53:13 2008 +0100
14.2 +++ b/src/mih/wscript Mon Dec 01 09:22:24 2008 +0100
14.3 @@ -64,6 +64,8 @@
14.4 'mih-link-capability-discover.cc',
14.5 'mih-link-sap.cc',
14.6 'mih-header.cc',
14.7 + 'mih-remote-event-destination-trap.cc',
14.8 + 'mih-remote-event-source-trap.cc',
14.9 'mih-transaction.cc',
14.10 'mih-session.cc',
14.11 'mih-function.cc',
14.12 @@ -135,6 +137,8 @@
14.13 'mih-link-capability-discover.h',
14.14 'mih-link-sap.h',
14.15 'mih-header.h',
14.16 + 'mih-remote-event-destination-trap.h',
14.17 + 'mih-remote-event-source-trap.h',
14.18 'mih-transaction.h',
14.19 'mih-session.h',
14.20 'mih-function.h',