Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
Callback.h
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2015 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #ifndef MBED_CALLBACK_H 00017 #define MBED_CALLBACK_H 00018 00019 #include <string.h> 00020 #include <stdint.h> 00021 #include <new> 00022 #include "platform/mbed_assert.h" 00023 #include "platform/mbed_toolchain.h" 00024 00025 namespace mbed { 00026 /** \addtogroup platform */ 00027 00028 00029 /** Callback class based on template specialization 00030 * 00031 * @note Synchronization level: Not protected 00032 * @ingroup platform 00033 */ 00034 template <typename F> 00035 class Callback; 00036 00037 // Internal sfinae declarations 00038 // 00039 // These are used to eliminate overloads based on type attributes 00040 // 1. Does a function object have a call operator 00041 // 2. Does a function object fit in the available storage 00042 // 00043 // These eliminations are handled cleanly by the compiler and avoid 00044 // massive and misleading error messages when confronted with an 00045 // invalid type (or worse, runtime failures) 00046 namespace detail { 00047 struct nil {}; 00048 00049 template <bool B, typename R = nil> 00050 struct enable_if { typedef R type; }; 00051 00052 template <typename R> 00053 struct enable_if<false, R> {}; 00054 00055 template <typename M, M> 00056 struct is_type { 00057 static const bool value = true; 00058 }; 00059 } 00060 00061 #define MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, M) \ 00062 typename detail::enable_if< \ 00063 detail::is_type<M, &F::operator()>::value && \ 00064 sizeof(F) <= sizeof(uintptr_t) \ 00065 >::type = detail::nil() 00066 00067 /** Callback class based on template specialization 00068 * 00069 * @note Synchronization level: Not protected 00070 * @ingroup platform 00071 */ 00072 template <typename R> 00073 class Callback<R()> { 00074 public: 00075 /** Create a Callback with a static function 00076 * @param func Static function to attach 00077 */ 00078 Callback(R (*func)() = 0) { 00079 if (!func) { 00080 _ops = 0; 00081 } else { 00082 generate(func); 00083 } 00084 } 00085 00086 /** Attach a Callback 00087 * @param func The Callback to attach 00088 */ 00089 Callback(const Callback<R()> &func) { 00090 if (func._ops) { 00091 func._ops->move(this, &func); 00092 } 00093 _ops = func._ops; 00094 } 00095 00096 /** Create a Callback with a member function 00097 * @param obj Pointer to object to invoke member function on 00098 * @param method Member function to attach 00099 */ 00100 template<typename T, typename U> 00101 Callback(U *obj, R (T::*method)()) { 00102 generate(method_context<T, R (T::*)()>(obj, method)); 00103 } 00104 00105 /** Create a Callback with a member function 00106 * @param obj Pointer to object to invoke member function on 00107 * @param method Member function to attach 00108 */ 00109 template<typename T, typename U> 00110 Callback(const U *obj, R (T::*method)() const) { 00111 generate(method_context<const T, R (T::*)() const>(obj, method)); 00112 } 00113 00114 /** Create a Callback with a member function 00115 * @param obj Pointer to object to invoke member function on 00116 * @param method Member function to attach 00117 */ 00118 template<typename T, typename U> 00119 Callback(volatile U *obj, R (T::*method)() volatile) { 00120 generate(method_context<volatile T, R (T::*)() volatile>(obj, method)); 00121 } 00122 00123 /** Create a Callback with a member function 00124 * @param obj Pointer to object to invoke member function on 00125 * @param method Member function to attach 00126 */ 00127 template<typename T, typename U> 00128 Callback(const volatile U *obj, R (T::*method)() const volatile) { 00129 generate(method_context<const volatile T, R (T::*)() const volatile>(obj, method)); 00130 } 00131 00132 /** Create a Callback with a static function and bound pointer 00133 * @param func Static function to attach 00134 * @param arg Pointer argument to function 00135 */ 00136 template<typename T, typename U> 00137 Callback(R (*func)(T*), U *arg) { 00138 generate(function_context<R (*)(T*), T>(func, arg)); 00139 } 00140 00141 /** Create a Callback with a static function and bound pointer 00142 * @param func Static function to attach 00143 * @param arg Pointer argument to function 00144 */ 00145 template<typename T, typename U> 00146 Callback(R (*func)(const T*), const U *arg) { 00147 generate(function_context<R (*)(const T*), const T>(func, arg)); 00148 } 00149 00150 /** Create a Callback with a static function and bound pointer 00151 * @param func Static function to attach 00152 * @param arg Pointer argument to function 00153 */ 00154 template<typename T, typename U> 00155 Callback(R (*func)(volatile T*), volatile U *arg) { 00156 generate(function_context<R (*)(volatile T*), volatile T>(func, arg)); 00157 } 00158 00159 /** Create a Callback with a static function and bound pointer 00160 * @param func Static function to attach 00161 * @param arg Pointer argument to function 00162 */ 00163 template<typename T, typename U> 00164 Callback(R (*func)(const volatile T*), const volatile U *arg) { 00165 generate(function_context<R (*)(const volatile T*), const volatile T>(func, arg)); 00166 } 00167 00168 /** Create a Callback with a function object 00169 * @param f Function object to attach 00170 * @note The function object is limited to a single word of storage 00171 */ 00172 template <typename F> 00173 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)())) { 00174 generate(f); 00175 } 00176 00177 /** Create a Callback with a function object 00178 * @param f Function object to attach 00179 * @note The function object is limited to a single word of storage 00180 */ 00181 template <typename F> 00182 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const)) { 00183 generate(f); 00184 } 00185 00186 /** Create a Callback with a function object 00187 * @param f Function object to attach 00188 * @note The function object is limited to a single word of storage 00189 */ 00190 template <typename F> 00191 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() volatile)) { 00192 generate(f); 00193 } 00194 00195 /** Create a Callback with a function object 00196 * @param f Function object to attach 00197 * @note The function object is limited to a single word of storage 00198 */ 00199 template <typename F> 00200 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const volatile)) { 00201 generate(f); 00202 } 00203 00204 /** Create a Callback with a static function and bound pointer 00205 * @param obj Pointer to object to bind to function 00206 * @param func Static function to attach 00207 * @deprecated 00208 * Arguments to callback have been reordered to Callback(func, arg) 00209 */ 00210 template<typename T, typename U> 00211 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00212 "Arguments to callback have been reordered to Callback(func, arg)") 00213 Callback(U *obj, R (*func)(T*)) { 00214 new (this) Callback(func, obj); 00215 } 00216 00217 /** Create a Callback with a static function and bound pointer 00218 * @param obj Pointer to object to bind to function 00219 * @param func Static function to attach 00220 * @deprecated 00221 * Arguments to callback have been reordered to Callback(func, arg) 00222 */ 00223 template<typename T, typename U> 00224 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00225 "Arguments to callback have been reordered to Callback(func, arg)") 00226 Callback(const U *obj, R (*func)(const T*)) { 00227 new (this) Callback(func, obj); 00228 } 00229 00230 /** Create a Callback with a static function and bound pointer 00231 * @param obj Pointer to object to bind to function 00232 * @param func Static function to attach 00233 * @deprecated 00234 * Arguments to callback have been reordered to Callback(func, arg) 00235 */ 00236 template<typename T, typename U> 00237 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00238 "Arguments to callback have been reordered to Callback(func, arg)") 00239 Callback(volatile U *obj, R (*func)(volatile T*)) { 00240 new (this) Callback(func, obj); 00241 } 00242 00243 /** Create a Callback with a static function and bound pointer 00244 * @param obj Pointer to object to bind to function 00245 * @param func Static function to attach 00246 * @deprecated 00247 * Arguments to callback have been reordered to Callback(func, arg) 00248 */ 00249 template<typename T, typename U> 00250 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00251 "Arguments to callback have been reordered to Callback(func, arg)") 00252 Callback(const volatile U *obj, R (*func)(const volatile T*)) { 00253 new (this) Callback(func, obj); 00254 } 00255 00256 /** Destroy a callback 00257 */ 00258 ~Callback() { 00259 if (_ops) { 00260 _ops->dtor(this); 00261 } 00262 } 00263 00264 /** Attach a static function 00265 * @param func Static function to attach 00266 * @deprecated 00267 * Replaced by simple assignment 'Callback cb = func' 00268 */ 00269 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00270 "Replaced by simple assignment 'Callback cb = func") 00271 void attach(R (*func)()) { 00272 this->~Callback(); 00273 new (this) Callback(func); 00274 } 00275 00276 /** Attach a Callback 00277 * @param func The Callback to attach 00278 * @deprecated 00279 * Replaced by simple assignment 'Callback cb = func' 00280 */ 00281 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00282 "Replaced by simple assignment 'Callback cb = func") 00283 void attach(const Callback<R()> &func) { 00284 this->~Callback(); 00285 new (this) Callback(func); 00286 } 00287 00288 /** Attach a member function 00289 * @param obj Pointer to object to invoke member function on 00290 * @param method Member function to attach 00291 * @deprecated 00292 * Replaced by simple assignment 'Callback cb = func' 00293 */ 00294 template<typename T, typename U> 00295 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00296 "Replaced by simple assignment 'Callback cb = func") 00297 void attach(U *obj, R (T::*method)()) { 00298 this->~Callback(); 00299 new (this) Callback(obj, method); 00300 } 00301 00302 /** Attach a member function 00303 * @param obj Pointer to object to invoke member function on 00304 * @param method Member function to attach 00305 * @deprecated 00306 * Replaced by simple assignment 'Callback cb = func' 00307 */ 00308 template<typename T, typename U> 00309 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00310 "Replaced by simple assignment 'Callback cb = func") 00311 void attach(const U *obj, R (T::*method)() const) { 00312 this->~Callback(); 00313 new (this) Callback(obj, method); 00314 } 00315 00316 /** Attach a member function 00317 * @param obj Pointer to object to invoke member function on 00318 * @param method Member function to attach 00319 * @deprecated 00320 * Replaced by simple assignment 'Callback cb = func' 00321 */ 00322 template<typename T, typename U> 00323 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00324 "Replaced by simple assignment 'Callback cb = func") 00325 void attach(volatile U *obj, R (T::*method)() volatile) { 00326 this->~Callback(); 00327 new (this) Callback(obj, method); 00328 } 00329 00330 /** Attach a member function 00331 * @param obj Pointer to object to invoke member function on 00332 * @param method Member function to attach 00333 * @deprecated 00334 * Replaced by simple assignment 'Callback cb = func' 00335 */ 00336 template<typename T, typename U> 00337 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00338 "Replaced by simple assignment 'Callback cb = func") 00339 void attach(const volatile U *obj, R (T::*method)() const volatile) { 00340 this->~Callback(); 00341 new (this) Callback(obj, method); 00342 } 00343 00344 /** Attach a static function with a bound pointer 00345 * @param func Static function to attach 00346 * @param arg Pointer argument to function 00347 * @deprecated 00348 * Replaced by simple assignment 'Callback cb = func' 00349 */ 00350 template <typename T, typename U> 00351 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00352 "Replaced by simple assignment 'Callback cb = func") 00353 void attach(R (*func)(T*), U *arg) { 00354 this->~Callback(); 00355 new (this) Callback(func, arg); 00356 } 00357 00358 /** Attach a static function with a bound pointer 00359 * @param func Static function to attach 00360 * @param arg Pointer argument to function 00361 * @deprecated 00362 * Replaced by simple assignment 'Callback cb = func' 00363 */ 00364 template <typename T, typename U> 00365 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00366 "Replaced by simple assignment 'Callback cb = func") 00367 void attach(R (*func)(const T*), const U *arg) { 00368 this->~Callback(); 00369 new (this) Callback(func, arg); 00370 } 00371 00372 /** Attach a static function with a bound pointer 00373 * @param func Static function to attach 00374 * @param arg Pointer argument to function 00375 * @deprecated 00376 * Replaced by simple assignment 'Callback cb = func' 00377 */ 00378 template <typename T, typename U> 00379 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00380 "Replaced by simple assignment 'Callback cb = func") 00381 void attach(R (*func)(volatile T*), volatile U *arg) { 00382 this->~Callback(); 00383 new (this) Callback(func, arg); 00384 } 00385 00386 /** Attach a static function with a bound pointer 00387 * @param func Static function to attach 00388 * @param arg Pointer argument to function 00389 * @deprecated 00390 * Replaced by simple assignment 'Callback cb = func' 00391 */ 00392 template <typename T, typename U> 00393 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00394 "Replaced by simple assignment 'Callback cb = func") 00395 void attach(R (*func)(const volatile T*), const volatile U *arg) { 00396 this->~Callback(); 00397 new (this) Callback(func, arg); 00398 } 00399 00400 /** Attach a function object 00401 * @param f Function object to attach 00402 * @note The function object is limited to a single word of storage 00403 * @deprecated 00404 * Replaced by simple assignment 'Callback cb = func' 00405 */ 00406 template <typename F> 00407 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00408 "Replaced by simple assignment 'Callback cb = func") 00409 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)())) { 00410 this->~Callback(); 00411 new (this) Callback(f); 00412 } 00413 00414 /** Attach a function object 00415 * @param f Function object to attach 00416 * @note The function object is limited to a single word of storage 00417 * @deprecated 00418 * Replaced by simple assignment 'Callback cb = func' 00419 */ 00420 template <typename F> 00421 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00422 "Replaced by simple assignment 'Callback cb = func") 00423 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const)) { 00424 this->~Callback(); 00425 new (this) Callback(f); 00426 } 00427 00428 /** Attach a function object 00429 * @param f Function object to attach 00430 * @note The function object is limited to a single word of storage 00431 * @deprecated 00432 * Replaced by simple assignment 'Callback cb = func' 00433 */ 00434 template <typename F> 00435 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00436 "Replaced by simple assignment 'Callback cb = func") 00437 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() volatile)) { 00438 this->~Callback(); 00439 new (this) Callback(f); 00440 } 00441 00442 /** Attach a function object 00443 * @param f Function object to attach 00444 * @note The function object is limited to a single word of storage 00445 * @deprecated 00446 * Replaced by simple assignment 'Callback cb = func' 00447 */ 00448 template <typename F> 00449 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00450 "Replaced by simple assignment 'Callback cb = func") 00451 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const volatile)) { 00452 this->~Callback(); 00453 new (this) Callback(f); 00454 } 00455 00456 /** Attach a static function with a bound pointer 00457 * @param obj Pointer to object to bind to function 00458 * @param func Static function to attach 00459 * @deprecated 00460 * Arguments to callback have been reordered to attach(func, arg) 00461 */ 00462 template <typename T, typename U> 00463 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00464 "Arguments to callback have been reordered to attach(func, arg)") 00465 void attach(U *obj, R (*func)(T*)) { 00466 this->~Callback(); 00467 new (this) Callback(func, obj); 00468 } 00469 00470 /** Attach a static function with a bound pointer 00471 * @param obj Pointer to object to bind to function 00472 * @param func Static function to attach 00473 * @deprecated 00474 * Arguments to callback have been reordered to attach(func, arg) 00475 */ 00476 template <typename T, typename U> 00477 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00478 "Arguments to callback have been reordered to attach(func, arg)") 00479 void attach(const U *obj, R (*func)(const T*)) { 00480 this->~Callback(); 00481 new (this) Callback(func, obj); 00482 } 00483 00484 /** Attach a static function with a bound pointer 00485 * @param obj Pointer to object to bind to function 00486 * @param func Static function to attach 00487 * @deprecated 00488 * Arguments to callback have been reordered to attach(func, arg) 00489 */ 00490 template <typename T, typename U> 00491 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00492 "Arguments to callback have been reordered to attach(func, arg)") 00493 void attach(volatile U *obj, R (*func)(volatile T*)) { 00494 this->~Callback(); 00495 new (this) Callback(func, obj); 00496 } 00497 00498 /** Attach a static function with a bound pointer 00499 * @param obj Pointer to object to bind to function 00500 * @param func Static function to attach 00501 * @deprecated 00502 * Arguments to callback have been reordered to attach(func, arg) 00503 */ 00504 template <typename T, typename U> 00505 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00506 "Arguments to callback have been reordered to attach(func, arg)") 00507 void attach(const volatile U *obj, R (*func)(const volatile T*)) { 00508 this->~Callback(); 00509 new (this) Callback(func, obj); 00510 } 00511 00512 /** Assign a callback 00513 */ 00514 Callback &operator=(const Callback &that) { 00515 if (this != &that) { 00516 this->~Callback(); 00517 new (this) Callback(that); 00518 } 00519 00520 return *this; 00521 } 00522 00523 /** Call the attached function 00524 */ 00525 R call() const { 00526 MBED_ASSERT(_ops); 00527 return _ops->call(this); 00528 } 00529 00530 /** Call the attached function 00531 */ 00532 R operator()() const { 00533 return call(); 00534 } 00535 00536 /** Test if function has been attached 00537 */ 00538 operator bool() const { 00539 return _ops; 00540 } 00541 00542 /** Test for equality 00543 */ 00544 friend bool operator==(const Callback &l, const Callback &r) { 00545 return memcmp(&l, &r, sizeof(Callback)) == 0; 00546 } 00547 00548 /** Test for inequality 00549 */ 00550 friend bool operator!=(const Callback &l, const Callback &r) { 00551 return !(l == r); 00552 } 00553 00554 /** Static thunk for passing as C-style function 00555 * @param func Callback to call passed as void pointer 00556 * @return the value as determined by func which is of 00557 * type and determined by the signiture of func 00558 */ 00559 static R thunk(void *func) { 00560 return static_cast<Callback*>(func)->call(); 00561 } 00562 00563 private: 00564 // Stored as pointer to function and pointer to optional object 00565 // Function pointer is stored as union of possible function types 00566 // to garuntee proper size and alignment 00567 struct _class; 00568 union { 00569 void (*_staticfunc)(); 00570 void (*_boundfunc)(_class*); 00571 void (_class::*_methodfunc)(); 00572 } _func; 00573 void *_obj; 00574 00575 // Dynamically dispatched operations 00576 const struct ops { 00577 R (*call)(const void*); 00578 void (*move)(void*, const void*); 00579 void (*dtor)(void*); 00580 } *_ops; 00581 00582 // Generate operations for function object 00583 template <typename F> 00584 void generate(const F &f) { 00585 static const ops ops = { 00586 &Callback::function_call<F>, 00587 &Callback::function_move<F>, 00588 &Callback::function_dtor<F>, 00589 }; 00590 00591 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), 00592 "Type F must not exceed the size of the Callback class"); 00593 new (this) F(f); 00594 _ops = &ops; 00595 } 00596 00597 // Function attributes 00598 template <typename F> 00599 static R function_call(const void *p) { 00600 return (*(F*)p)(); 00601 } 00602 00603 template <typename F> 00604 static void function_move(void *d, const void *p) { 00605 new (d) F(*(F*)p); 00606 } 00607 00608 template <typename F> 00609 static void function_dtor(void *p) { 00610 ((F*)p)->~F(); 00611 } 00612 00613 // Wrappers for functions with context 00614 template <typename O, typename M> 00615 struct method_context { 00616 M method; 00617 O *obj; 00618 00619 method_context(O *obj, M method) 00620 : method(method), obj(obj) {} 00621 00622 R operator()() const { 00623 return (obj->*method)(); 00624 } 00625 }; 00626 00627 template <typename F, typename A> 00628 struct function_context { 00629 F func; 00630 A *arg; 00631 00632 function_context(F func, A *arg) 00633 : func(func), arg(arg) {} 00634 00635 R operator()() const { 00636 return func(arg); 00637 } 00638 }; 00639 }; 00640 00641 /** Callback class based on template specialization 00642 * 00643 * @note Synchronization level: Not protected 00644 * @ingroup platform 00645 */ 00646 template <typename R, typename A0> 00647 class Callback<R(A0)> { 00648 public: 00649 /** Create a Callback with a static function 00650 * @param func Static function to attach 00651 */ 00652 Callback(R (*func)(A0) = 0) { 00653 if (!func) { 00654 _ops = 0; 00655 } else { 00656 generate(func); 00657 } 00658 } 00659 00660 /** Attach a Callback 00661 * @param func The Callback to attach 00662 */ 00663 Callback(const Callback<R(A0)> &func) { 00664 if (func._ops) { 00665 func._ops->move(this, &func); 00666 } 00667 _ops = func._ops; 00668 } 00669 00670 /** Create a Callback with a member function 00671 * @param obj Pointer to object to invoke member function on 00672 * @param method Member function to attach 00673 */ 00674 template<typename T, typename U> 00675 Callback(U *obj, R (T::*method)(A0)) { 00676 generate(method_context<T, R (T::*)(A0)>(obj, method)); 00677 } 00678 00679 /** Create a Callback with a member function 00680 * @param obj Pointer to object to invoke member function on 00681 * @param method Member function to attach 00682 */ 00683 template<typename T, typename U> 00684 Callback(const U *obj, R (T::*method)(A0) const) { 00685 generate(method_context<const T, R (T::*)(A0) const>(obj, method)); 00686 } 00687 00688 /** Create a Callback with a member function 00689 * @param obj Pointer to object to invoke member function on 00690 * @param method Member function to attach 00691 */ 00692 template<typename T, typename U> 00693 Callback(volatile U *obj, R (T::*method)(A0) volatile) { 00694 generate(method_context<volatile T, R (T::*)(A0) volatile>(obj, method)); 00695 } 00696 00697 /** Create a Callback with a member function 00698 * @param obj Pointer to object to invoke member function on 00699 * @param method Member function to attach 00700 */ 00701 template<typename T, typename U> 00702 Callback(const volatile U *obj, R (T::*method)(A0) const volatile) { 00703 generate(method_context<const volatile T, R (T::*)(A0) const volatile>(obj, method)); 00704 } 00705 00706 /** Create a Callback with a static function and bound pointer 00707 * @param func Static function to attach 00708 * @param arg Pointer argument to function 00709 */ 00710 template<typename T, typename U> 00711 Callback(R (*func)(T*, A0), U *arg) { 00712 generate(function_context<R (*)(T*, A0), T>(func, arg)); 00713 } 00714 00715 /** Create a Callback with a static function and bound pointer 00716 * @param func Static function to attach 00717 * @param arg Pointer argument to function 00718 */ 00719 template<typename T, typename U> 00720 Callback(R (*func)(const T*, A0), const U *arg) { 00721 generate(function_context<R (*)(const T*, A0), const T>(func, arg)); 00722 } 00723 00724 /** Create a Callback with a static function and bound pointer 00725 * @param func Static function to attach 00726 * @param arg Pointer argument to function 00727 */ 00728 template<typename T, typename U> 00729 Callback(R (*func)(volatile T*, A0), volatile U *arg) { 00730 generate(function_context<R (*)(volatile T*, A0), volatile T>(func, arg)); 00731 } 00732 00733 /** Create a Callback with a static function and bound pointer 00734 * @param func Static function to attach 00735 * @param arg Pointer argument to function 00736 */ 00737 template<typename T, typename U> 00738 Callback(R (*func)(const volatile T*, A0), const volatile U *arg) { 00739 generate(function_context<R (*)(const volatile T*, A0), const volatile T>(func, arg)); 00740 } 00741 00742 /** Create a Callback with a function object 00743 * @param f Function object to attach 00744 * @note The function object is limited to a single word of storage 00745 */ 00746 template <typename F> 00747 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0))) { 00748 generate(f); 00749 } 00750 00751 /** Create a Callback with a function object 00752 * @param f Function object to attach 00753 * @note The function object is limited to a single word of storage 00754 */ 00755 template <typename F> 00756 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const)) { 00757 generate(f); 00758 } 00759 00760 /** Create a Callback with a function object 00761 * @param f Function object to attach 00762 * @note The function object is limited to a single word of storage 00763 */ 00764 template <typename F> 00765 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) volatile)) { 00766 generate(f); 00767 } 00768 00769 /** Create a Callback with a function object 00770 * @param f Function object to attach 00771 * @note The function object is limited to a single word of storage 00772 */ 00773 template <typename F> 00774 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const volatile)) { 00775 generate(f); 00776 } 00777 00778 /** Create a Callback with a static function and bound pointer 00779 * @param obj Pointer to object to bind to function 00780 * @param func Static function to attach 00781 * @deprecated 00782 * Arguments to callback have been reordered to Callback(func, arg) 00783 */ 00784 template<typename T, typename U> 00785 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00786 "Arguments to callback have been reordered to Callback(func, arg)") 00787 Callback(U *obj, R (*func)(T*, A0)) { 00788 new (this) Callback(func, obj); 00789 } 00790 00791 /** Create a Callback with a static function and bound pointer 00792 * @param obj Pointer to object to bind to function 00793 * @param func Static function to attach 00794 * @deprecated 00795 * Arguments to callback have been reordered to Callback(func, arg) 00796 */ 00797 template<typename T, typename U> 00798 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00799 "Arguments to callback have been reordered to Callback(func, arg)") 00800 Callback(const U *obj, R (*func)(const T*, A0)) { 00801 new (this) Callback(func, obj); 00802 } 00803 00804 /** Create a Callback with a static function and bound pointer 00805 * @param obj Pointer to object to bind to function 00806 * @param func Static function to attach 00807 * @deprecated 00808 * Arguments to callback have been reordered to Callback(func, arg) 00809 */ 00810 template<typename T, typename U> 00811 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00812 "Arguments to callback have been reordered to Callback(func, arg)") 00813 Callback(volatile U *obj, R (*func)(volatile T*, A0)) { 00814 new (this) Callback(func, obj); 00815 } 00816 00817 /** Create a Callback with a static function and bound pointer 00818 * @param obj Pointer to object to bind to function 00819 * @param func Static function to attach 00820 * @deprecated 00821 * Arguments to callback have been reordered to Callback(func, arg) 00822 */ 00823 template<typename T, typename U> 00824 MBED_DEPRECATED_SINCE("mbed-os-5.1", 00825 "Arguments to callback have been reordered to Callback(func, arg)") 00826 Callback(const volatile U *obj, R (*func)(const volatile T*, A0)) { 00827 new (this) Callback(func, obj); 00828 } 00829 00830 /** Destroy a callback 00831 */ 00832 ~Callback() { 00833 if (_ops) { 00834 _ops->dtor(this); 00835 } 00836 } 00837 00838 /** Attach a static function 00839 * @param func Static function to attach 00840 * @deprecated 00841 * Replaced by simple assignment 'Callback cb = func' 00842 */ 00843 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00844 "Replaced by simple assignment 'Callback cb = func") 00845 void attach(R (*func)(A0)) { 00846 this->~Callback(); 00847 new (this) Callback(func); 00848 } 00849 00850 /** Attach a Callback 00851 * @param func The Callback to attach 00852 * @deprecated 00853 * Replaced by simple assignment 'Callback cb = func' 00854 */ 00855 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00856 "Replaced by simple assignment 'Callback cb = func") 00857 void attach(const Callback<R(A0)> &func) { 00858 this->~Callback(); 00859 new (this) Callback(func); 00860 } 00861 00862 /** Attach a member function 00863 * @param obj Pointer to object to invoke member function on 00864 * @param method Member function to attach 00865 * @deprecated 00866 * Replaced by simple assignment 'Callback cb = func' 00867 */ 00868 template<typename T, typename U> 00869 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00870 "Replaced by simple assignment 'Callback cb = func") 00871 void attach(U *obj, R (T::*method)(A0)) { 00872 this->~Callback(); 00873 new (this) Callback(obj, method); 00874 } 00875 00876 /** Attach a member function 00877 * @param obj Pointer to object to invoke member function on 00878 * @param method Member function to attach 00879 * @deprecated 00880 * Replaced by simple assignment 'Callback cb = func' 00881 */ 00882 template<typename T, typename U> 00883 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00884 "Replaced by simple assignment 'Callback cb = func") 00885 void attach(const U *obj, R (T::*method)(A0) const) { 00886 this->~Callback(); 00887 new (this) Callback(obj, method); 00888 } 00889 00890 /** Attach a member function 00891 * @param obj Pointer to object to invoke member function on 00892 * @param method Member function to attach 00893 * @deprecated 00894 * Replaced by simple assignment 'Callback cb = func' 00895 */ 00896 template<typename T, typename U> 00897 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00898 "Replaced by simple assignment 'Callback cb = func") 00899 void attach(volatile U *obj, R (T::*method)(A0) volatile) { 00900 this->~Callback(); 00901 new (this) Callback(obj, method); 00902 } 00903 00904 /** Attach a member function 00905 * @param obj Pointer to object to invoke member function on 00906 * @param method Member function to attach 00907 * @deprecated 00908 * Replaced by simple assignment 'Callback cb = func' 00909 */ 00910 template<typename T, typename U> 00911 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00912 "Replaced by simple assignment 'Callback cb = func") 00913 void attach(const volatile U *obj, R (T::*method)(A0) const volatile) { 00914 this->~Callback(); 00915 new (this) Callback(obj, method); 00916 } 00917 00918 /** Attach a static function with a bound pointer 00919 * @param func Static function to attach 00920 * @param arg Pointer argument to function 00921 * @deprecated 00922 * Replaced by simple assignment 'Callback cb = func' 00923 */ 00924 template <typename T, typename U> 00925 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00926 "Replaced by simple assignment 'Callback cb = func") 00927 void attach(R (*func)(T*, A0), U *arg) { 00928 this->~Callback(); 00929 new (this) Callback(func, arg); 00930 } 00931 00932 /** Attach a static function with a bound pointer 00933 * @param func Static function to attach 00934 * @param arg Pointer argument to function 00935 * @deprecated 00936 * Replaced by simple assignment 'Callback cb = func' 00937 */ 00938 template <typename T, typename U> 00939 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00940 "Replaced by simple assignment 'Callback cb = func") 00941 void attach(R (*func)(const T*, A0), const U *arg) { 00942 this->~Callback(); 00943 new (this) Callback(func, arg); 00944 } 00945 00946 /** Attach a static function with a bound pointer 00947 * @param func Static function to attach 00948 * @param arg Pointer argument to function 00949 * @deprecated 00950 * Replaced by simple assignment 'Callback cb = func' 00951 */ 00952 template <typename T, typename U> 00953 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00954 "Replaced by simple assignment 'Callback cb = func") 00955 void attach(R (*func)(volatile T*, A0), volatile U *arg) { 00956 this->~Callback(); 00957 new (this) Callback(func, arg); 00958 } 00959 00960 /** Attach a static function with a bound pointer 00961 * @param func Static function to attach 00962 * @param arg Pointer argument to function 00963 * @deprecated 00964 * Replaced by simple assignment 'Callback cb = func' 00965 */ 00966 template <typename T, typename U> 00967 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00968 "Replaced by simple assignment 'Callback cb = func") 00969 void attach(R (*func)(const volatile T*, A0), const volatile U *arg) { 00970 this->~Callback(); 00971 new (this) Callback(func, arg); 00972 } 00973 00974 /** Attach a function object 00975 * @param f Function object to attach 00976 * @note The function object is limited to a single word of storage 00977 * @deprecated 00978 * Replaced by simple assignment 'Callback cb = func' 00979 */ 00980 template <typename F> 00981 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00982 "Replaced by simple assignment 'Callback cb = func") 00983 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0))) { 00984 this->~Callback(); 00985 new (this) Callback(f); 00986 } 00987 00988 /** Attach a function object 00989 * @param f Function object to attach 00990 * @note The function object is limited to a single word of storage 00991 * @deprecated 00992 * Replaced by simple assignment 'Callback cb = func' 00993 */ 00994 template <typename F> 00995 MBED_DEPRECATED_SINCE("mbed-os-5.4", 00996 "Replaced by simple assignment 'Callback cb = func") 00997 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const)) { 00998 this->~Callback(); 00999 new (this) Callback(f); 01000 } 01001 01002 /** Attach a function object 01003 * @param f Function object to attach 01004 * @note The function object is limited to a single word of storage 01005 * @deprecated 01006 * Replaced by simple assignment 'Callback cb = func' 01007 */ 01008 template <typename F> 01009 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01010 "Replaced by simple assignment 'Callback cb = func") 01011 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) volatile)) { 01012 this->~Callback(); 01013 new (this) Callback(f); 01014 } 01015 01016 /** Attach a function object 01017 * @param f Function object to attach 01018 * @note The function object is limited to a single word of storage 01019 * @deprecated 01020 * Replaced by simple assignment 'Callback cb = func' 01021 */ 01022 template <typename F> 01023 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01024 "Replaced by simple assignment 'Callback cb = func") 01025 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const volatile)) { 01026 this->~Callback(); 01027 new (this) Callback(f); 01028 } 01029 01030 /** Attach a static function with a bound pointer 01031 * @param obj Pointer to object to bind to function 01032 * @param func Static function to attach 01033 * @deprecated 01034 * Arguments to callback have been reordered to attach(func, arg) 01035 */ 01036 template <typename T, typename U> 01037 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01038 "Arguments to callback have been reordered to attach(func, arg)") 01039 void attach(U *obj, R (*func)(T*, A0)) { 01040 this->~Callback(); 01041 new (this) Callback(func, obj); 01042 } 01043 01044 /** Attach a static function with a bound pointer 01045 * @param obj Pointer to object to bind to function 01046 * @param func Static function to attach 01047 * @deprecated 01048 * Arguments to callback have been reordered to attach(func, arg) 01049 */ 01050 template <typename T, typename U> 01051 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01052 "Arguments to callback have been reordered to attach(func, arg)") 01053 void attach(const U *obj, R (*func)(const T*, A0)) { 01054 this->~Callback(); 01055 new (this) Callback(func, obj); 01056 } 01057 01058 /** Attach a static function with a bound pointer 01059 * @param obj Pointer to object to bind to function 01060 * @param func Static function to attach 01061 * @deprecated 01062 * Arguments to callback have been reordered to attach(func, arg) 01063 */ 01064 template <typename T, typename U> 01065 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01066 "Arguments to callback have been reordered to attach(func, arg)") 01067 void attach(volatile U *obj, R (*func)(volatile T*, A0)) { 01068 this->~Callback(); 01069 new (this) Callback(func, obj); 01070 } 01071 01072 /** Attach a static function with a bound pointer 01073 * @param obj Pointer to object to bind to function 01074 * @param func Static function to attach 01075 * @deprecated 01076 * Arguments to callback have been reordered to attach(func, arg) 01077 */ 01078 template <typename T, typename U> 01079 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01080 "Arguments to callback have been reordered to attach(func, arg)") 01081 void attach(const volatile U *obj, R (*func)(const volatile T*, A0)) { 01082 this->~Callback(); 01083 new (this) Callback(func, obj); 01084 } 01085 01086 /** Assign a callback 01087 */ 01088 Callback &operator=(const Callback &that) { 01089 if (this != &that) { 01090 this->~Callback(); 01091 new (this) Callback(that); 01092 } 01093 01094 return *this; 01095 } 01096 01097 /** Call the attached function 01098 */ 01099 R call(A0 a0) const { 01100 MBED_ASSERT(_ops); 01101 return _ops->call(this, a0); 01102 } 01103 01104 /** Call the attached function 01105 */ 01106 R operator()(A0 a0) const { 01107 return call(a0); 01108 } 01109 01110 /** Test if function has been attached 01111 */ 01112 operator bool() const { 01113 return _ops; 01114 } 01115 01116 /** Test for equality 01117 */ 01118 friend bool operator==(const Callback &l, const Callback &r) { 01119 return memcmp(&l, &r, sizeof(Callback)) == 0; 01120 } 01121 01122 /** Test for inequality 01123 */ 01124 friend bool operator!=(const Callback &l, const Callback &r) { 01125 return !(l == r); 01126 } 01127 01128 /** Static thunk for passing as C-style function 01129 * @param func Callback to call passed as void pointer 01130 * @param a0 An argument to be called with function func 01131 * @return the value as determined by func which is of 01132 * type and determined by the signiture of func 01133 */ 01134 static R thunk(void *func, A0 a0) { 01135 return static_cast<Callback*>(func)->call(a0); 01136 } 01137 01138 private: 01139 // Stored as pointer to function and pointer to optional object 01140 // Function pointer is stored as union of possible function types 01141 // to garuntee proper size and alignment 01142 struct _class; 01143 union { 01144 void (*_staticfunc)(A0); 01145 void (*_boundfunc)(_class*, A0); 01146 void (_class::*_methodfunc)(A0); 01147 } _func; 01148 void *_obj; 01149 01150 // Dynamically dispatched operations 01151 const struct ops { 01152 R (*call)(const void*, A0); 01153 void (*move)(void*, const void*); 01154 void (*dtor)(void*); 01155 } *_ops; 01156 01157 // Generate operations for function object 01158 template <typename F> 01159 void generate(const F &f) { 01160 static const ops ops = { 01161 &Callback::function_call<F>, 01162 &Callback::function_move<F>, 01163 &Callback::function_dtor<F>, 01164 }; 01165 01166 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), 01167 "Type F must not exceed the size of the Callback class"); 01168 new (this) F(f); 01169 _ops = &ops; 01170 } 01171 01172 // Function attributes 01173 template <typename F> 01174 static R function_call(const void *p, A0 a0) { 01175 return (*(F*)p)(a0); 01176 } 01177 01178 template <typename F> 01179 static void function_move(void *d, const void *p) { 01180 new (d) F(*(F*)p); 01181 } 01182 01183 template <typename F> 01184 static void function_dtor(void *p) { 01185 ((F*)p)->~F(); 01186 } 01187 01188 // Wrappers for functions with context 01189 template <typename O, typename M> 01190 struct method_context { 01191 M method; 01192 O *obj; 01193 01194 method_context(O *obj, M method) 01195 : method(method), obj(obj) {} 01196 01197 R operator()(A0 a0) const { 01198 return (obj->*method)(a0); 01199 } 01200 }; 01201 01202 template <typename F, typename A> 01203 struct function_context { 01204 F func; 01205 A *arg; 01206 01207 function_context(F func, A *arg) 01208 : func(func), arg(arg) {} 01209 01210 R operator()(A0 a0) const { 01211 return func(arg, a0); 01212 } 01213 }; 01214 }; 01215 01216 /** Callback class based on template specialization 01217 * 01218 * @note Synchronization level: Not protected 01219 * @ingroup platform 01220 */ 01221 template <typename R, typename A0, typename A1> 01222 class Callback<R(A0, A1)> { 01223 public: 01224 /** Create a Callback with a static function 01225 * @param func Static function to attach 01226 */ 01227 Callback(R (*func)(A0, A1) = 0) { 01228 if (!func) { 01229 _ops = 0; 01230 } else { 01231 generate(func); 01232 } 01233 } 01234 01235 /** Attach a Callback 01236 * @param func The Callback to attach 01237 */ 01238 Callback(const Callback<R(A0, A1)> &func) { 01239 if (func._ops) { 01240 func._ops->move(this, &func); 01241 } 01242 _ops = func._ops; 01243 } 01244 01245 /** Create a Callback with a member function 01246 * @param obj Pointer to object to invoke member function on 01247 * @param method Member function to attach 01248 */ 01249 template<typename T, typename U> 01250 Callback(U *obj, R (T::*method)(A0, A1)) { 01251 generate(method_context<T, R (T::*)(A0, A1)>(obj, method)); 01252 } 01253 01254 /** Create a Callback with a member function 01255 * @param obj Pointer to object to invoke member function on 01256 * @param method Member function to attach 01257 */ 01258 template<typename T, typename U> 01259 Callback(const U *obj, R (T::*method)(A0, A1) const) { 01260 generate(method_context<const T, R (T::*)(A0, A1) const>(obj, method)); 01261 } 01262 01263 /** Create a Callback with a member function 01264 * @param obj Pointer to object to invoke member function on 01265 * @param method Member function to attach 01266 */ 01267 template<typename T, typename U> 01268 Callback(volatile U *obj, R (T::*method)(A0, A1) volatile) { 01269 generate(method_context<volatile T, R (T::*)(A0, A1) volatile>(obj, method)); 01270 } 01271 01272 /** Create a Callback with a member function 01273 * @param obj Pointer to object to invoke member function on 01274 * @param method Member function to attach 01275 */ 01276 template<typename T, typename U> 01277 Callback(const volatile U *obj, R (T::*method)(A0, A1) const volatile) { 01278 generate(method_context<const volatile T, R (T::*)(A0, A1) const volatile>(obj, method)); 01279 } 01280 01281 /** Create a Callback with a static function and bound pointer 01282 * @param func Static function to attach 01283 * @param arg Pointer argument to function 01284 */ 01285 template<typename T, typename U> 01286 Callback(R (*func)(T*, A0, A1), U *arg) { 01287 generate(function_context<R (*)(T*, A0, A1), T>(func, arg)); 01288 } 01289 01290 /** Create a Callback with a static function and bound pointer 01291 * @param func Static function to attach 01292 * @param arg Pointer argument to function 01293 */ 01294 template<typename T, typename U> 01295 Callback(R (*func)(const T*, A0, A1), const U *arg) { 01296 generate(function_context<R (*)(const T*, A0, A1), const T>(func, arg)); 01297 } 01298 01299 /** Create a Callback with a static function and bound pointer 01300 * @param func Static function to attach 01301 * @param arg Pointer argument to function 01302 */ 01303 template<typename T, typename U> 01304 Callback(R (*func)(volatile T*, A0, A1), volatile U *arg) { 01305 generate(function_context<R (*)(volatile T*, A0, A1), volatile T>(func, arg)); 01306 } 01307 01308 /** Create a Callback with a static function and bound pointer 01309 * @param func Static function to attach 01310 * @param arg Pointer argument to function 01311 */ 01312 template<typename T, typename U> 01313 Callback(R (*func)(const volatile T*, A0, A1), const volatile U *arg) { 01314 generate(function_context<R (*)(const volatile T*, A0, A1), const volatile T>(func, arg)); 01315 } 01316 01317 /** Create a Callback with a function object 01318 * @param f Function object to attach 01319 * @note The function object is limited to a single word of storage 01320 */ 01321 template <typename F> 01322 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1))) { 01323 generate(f); 01324 } 01325 01326 /** Create a Callback with a function object 01327 * @param f Function object to attach 01328 * @note The function object is limited to a single word of storage 01329 */ 01330 template <typename F> 01331 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const)) { 01332 generate(f); 01333 } 01334 01335 /** Create a Callback with a function object 01336 * @param f Function object to attach 01337 * @note The function object is limited to a single word of storage 01338 */ 01339 template <typename F> 01340 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) volatile)) { 01341 generate(f); 01342 } 01343 01344 /** Create a Callback with a function object 01345 * @param f Function object to attach 01346 * @note The function object is limited to a single word of storage 01347 */ 01348 template <typename F> 01349 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const volatile)) { 01350 generate(f); 01351 } 01352 01353 /** Create a Callback with a static function and bound pointer 01354 * @param obj Pointer to object to bind to function 01355 * @param func Static function to attach 01356 * @deprecated 01357 * Arguments to callback have been reordered to Callback(func, arg) 01358 */ 01359 template<typename T, typename U> 01360 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01361 "Arguments to callback have been reordered to Callback(func, arg)") 01362 Callback(U *obj, R (*func)(T*, A0, A1)) { 01363 new (this) Callback(func, obj); 01364 } 01365 01366 /** Create a Callback with a static function and bound pointer 01367 * @param obj Pointer to object to bind to function 01368 * @param func Static function to attach 01369 * @deprecated 01370 * Arguments to callback have been reordered to Callback(func, arg) 01371 */ 01372 template<typename T, typename U> 01373 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01374 "Arguments to callback have been reordered to Callback(func, arg)") 01375 Callback(const U *obj, R (*func)(const T*, A0, A1)) { 01376 new (this) Callback(func, obj); 01377 } 01378 01379 /** Create a Callback with a static function and bound pointer 01380 * @param obj Pointer to object to bind to function 01381 * @param func Static function to attach 01382 * @deprecated 01383 * Arguments to callback have been reordered to Callback(func, arg) 01384 */ 01385 template<typename T, typename U> 01386 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01387 "Arguments to callback have been reordered to Callback(func, arg)") 01388 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1)) { 01389 new (this) Callback(func, obj); 01390 } 01391 01392 /** Create a Callback with a static function and bound pointer 01393 * @param obj Pointer to object to bind to function 01394 * @param func Static function to attach 01395 * @deprecated 01396 * Arguments to callback have been reordered to Callback(func, arg) 01397 */ 01398 template<typename T, typename U> 01399 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01400 "Arguments to callback have been reordered to Callback(func, arg)") 01401 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) { 01402 new (this) Callback(func, obj); 01403 } 01404 01405 /** Destroy a callback 01406 */ 01407 ~Callback() { 01408 if (_ops) { 01409 _ops->dtor(this); 01410 } 01411 } 01412 01413 /** Attach a static function 01414 * @param func Static function to attach 01415 * @deprecated 01416 * Replaced by simple assignment 'Callback cb = func' 01417 */ 01418 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01419 "Replaced by simple assignment 'Callback cb = func") 01420 void attach(R (*func)(A0, A1)) { 01421 this->~Callback(); 01422 new (this) Callback(func); 01423 } 01424 01425 /** Attach a Callback 01426 * @param func The Callback to attach 01427 * @deprecated 01428 * Replaced by simple assignment 'Callback cb = func' 01429 */ 01430 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01431 "Replaced by simple assignment 'Callback cb = func") 01432 void attach(const Callback<R(A0, A1)> &func) { 01433 this->~Callback(); 01434 new (this) Callback(func); 01435 } 01436 01437 /** Attach a member function 01438 * @param obj Pointer to object to invoke member function on 01439 * @param method Member function to attach 01440 * @deprecated 01441 * Replaced by simple assignment 'Callback cb = func' 01442 */ 01443 template<typename T, typename U> 01444 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01445 "Replaced by simple assignment 'Callback cb = func") 01446 void attach(U *obj, R (T::*method)(A0, A1)) { 01447 this->~Callback(); 01448 new (this) Callback(obj, method); 01449 } 01450 01451 /** Attach a member function 01452 * @param obj Pointer to object to invoke member function on 01453 * @param method Member function to attach 01454 * @deprecated 01455 * Replaced by simple assignment 'Callback cb = func' 01456 */ 01457 template<typename T, typename U> 01458 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01459 "Replaced by simple assignment 'Callback cb = func") 01460 void attach(const U *obj, R (T::*method)(A0, A1) const) { 01461 this->~Callback(); 01462 new (this) Callback(obj, method); 01463 } 01464 01465 /** Attach a member function 01466 * @param obj Pointer to object to invoke member function on 01467 * @param method Member function to attach 01468 * @deprecated 01469 * Replaced by simple assignment 'Callback cb = func' 01470 */ 01471 template<typename T, typename U> 01472 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01473 "Replaced by simple assignment 'Callback cb = func") 01474 void attach(volatile U *obj, R (T::*method)(A0, A1) volatile) { 01475 this->~Callback(); 01476 new (this) Callback(obj, method); 01477 } 01478 01479 /** Attach a member function 01480 * @param obj Pointer to object to invoke member function on 01481 * @param method Member function to attach 01482 * @deprecated 01483 * Replaced by simple assignment 'Callback cb = func' 01484 */ 01485 template<typename T, typename U> 01486 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01487 "Replaced by simple assignment 'Callback cb = func") 01488 void attach(const volatile U *obj, R (T::*method)(A0, A1) const volatile) { 01489 this->~Callback(); 01490 new (this) Callback(obj, method); 01491 } 01492 01493 /** Attach a static function with a bound pointer 01494 * @param func Static function to attach 01495 * @param arg Pointer argument to function 01496 * @deprecated 01497 * Replaced by simple assignment 'Callback cb = func' 01498 */ 01499 template <typename T, typename U> 01500 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01501 "Replaced by simple assignment 'Callback cb = func") 01502 void attach(R (*func)(T*, A0, A1), U *arg) { 01503 this->~Callback(); 01504 new (this) Callback(func, arg); 01505 } 01506 01507 /** Attach a static function with a bound pointer 01508 * @param func Static function to attach 01509 * @param arg Pointer argument to function 01510 * @deprecated 01511 * Replaced by simple assignment 'Callback cb = func' 01512 */ 01513 template <typename T, typename U> 01514 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01515 "Replaced by simple assignment 'Callback cb = func") 01516 void attach(R (*func)(const T*, A0, A1), const U *arg) { 01517 this->~Callback(); 01518 new (this) Callback(func, arg); 01519 } 01520 01521 /** Attach a static function with a bound pointer 01522 * @param func Static function to attach 01523 * @param arg Pointer argument to function 01524 * @deprecated 01525 * Replaced by simple assignment 'Callback cb = func' 01526 */ 01527 template <typename T, typename U> 01528 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01529 "Replaced by simple assignment 'Callback cb = func") 01530 void attach(R (*func)(volatile T*, A0, A1), volatile U *arg) { 01531 this->~Callback(); 01532 new (this) Callback(func, arg); 01533 } 01534 01535 /** Attach a static function with a bound pointer 01536 * @param func Static function to attach 01537 * @param arg Pointer argument to function 01538 * @deprecated 01539 * Replaced by simple assignment 'Callback cb = func' 01540 */ 01541 template <typename T, typename U> 01542 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01543 "Replaced by simple assignment 'Callback cb = func") 01544 void attach(R (*func)(const volatile T*, A0, A1), const volatile U *arg) { 01545 this->~Callback(); 01546 new (this) Callback(func, arg); 01547 } 01548 01549 /** Attach a function object 01550 * @param f Function object to attach 01551 * @note The function object is limited to a single word of storage 01552 * @deprecated 01553 * Replaced by simple assignment 'Callback cb = func' 01554 */ 01555 template <typename F> 01556 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01557 "Replaced by simple assignment 'Callback cb = func") 01558 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1))) { 01559 this->~Callback(); 01560 new (this) Callback(f); 01561 } 01562 01563 /** Attach a function object 01564 * @param f Function object to attach 01565 * @note The function object is limited to a single word of storage 01566 * @deprecated 01567 * Replaced by simple assignment 'Callback cb = func' 01568 */ 01569 template <typename F> 01570 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01571 "Replaced by simple assignment 'Callback cb = func") 01572 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const)) { 01573 this->~Callback(); 01574 new (this) Callback(f); 01575 } 01576 01577 /** Attach a function object 01578 * @param f Function object to attach 01579 * @note The function object is limited to a single word of storage 01580 * @deprecated 01581 * Replaced by simple assignment 'Callback cb = func' 01582 */ 01583 template <typename F> 01584 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01585 "Replaced by simple assignment 'Callback cb = func") 01586 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) volatile)) { 01587 this->~Callback(); 01588 new (this) Callback(f); 01589 } 01590 01591 /** Attach a function object 01592 * @param f Function object to attach 01593 * @note The function object is limited to a single word of storage 01594 * @deprecated 01595 * Replaced by simple assignment 'Callback cb = func' 01596 */ 01597 template <typename F> 01598 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01599 "Replaced by simple assignment 'Callback cb = func") 01600 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const volatile)) { 01601 this->~Callback(); 01602 new (this) Callback(f); 01603 } 01604 01605 /** Attach a static function with a bound pointer 01606 * @param obj Pointer to object to bind to function 01607 * @param func Static function to attach 01608 * @deprecated 01609 * Arguments to callback have been reordered to attach(func, arg) 01610 */ 01611 template <typename T, typename U> 01612 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01613 "Arguments to callback have been reordered to attach(func, arg)") 01614 void attach(U *obj, R (*func)(T*, A0, A1)) { 01615 this->~Callback(); 01616 new (this) Callback(func, obj); 01617 } 01618 01619 /** Attach a static function with a bound pointer 01620 * @param obj Pointer to object to bind to function 01621 * @param func Static function to attach 01622 * @deprecated 01623 * Arguments to callback have been reordered to attach(func, arg) 01624 */ 01625 template <typename T, typename U> 01626 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01627 "Arguments to callback have been reordered to attach(func, arg)") 01628 void attach(const U *obj, R (*func)(const T*, A0, A1)) { 01629 this->~Callback(); 01630 new (this) Callback(func, obj); 01631 } 01632 01633 /** Attach a static function with a bound pointer 01634 * @param obj Pointer to object to bind to function 01635 * @param func Static function to attach 01636 * @deprecated 01637 * Arguments to callback have been reordered to attach(func, arg) 01638 */ 01639 template <typename T, typename U> 01640 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01641 "Arguments to callback have been reordered to attach(func, arg)") 01642 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1)) { 01643 this->~Callback(); 01644 new (this) Callback(func, obj); 01645 } 01646 01647 /** Attach a static function with a bound pointer 01648 * @param obj Pointer to object to bind to function 01649 * @param func Static function to attach 01650 * @deprecated 01651 * Arguments to callback have been reordered to attach(func, arg) 01652 */ 01653 template <typename T, typename U> 01654 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01655 "Arguments to callback have been reordered to attach(func, arg)") 01656 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) { 01657 this->~Callback(); 01658 new (this) Callback(func, obj); 01659 } 01660 01661 /** Assign a callback 01662 */ 01663 Callback &operator=(const Callback &that) { 01664 if (this != &that) { 01665 this->~Callback(); 01666 new (this) Callback(that); 01667 } 01668 01669 return *this; 01670 } 01671 01672 /** Call the attached function 01673 */ 01674 R call(A0 a0, A1 a1) const { 01675 MBED_ASSERT(_ops); 01676 return _ops->call(this, a0, a1); 01677 } 01678 01679 /** Call the attached function 01680 */ 01681 R operator()(A0 a0, A1 a1) const { 01682 return call(a0, a1); 01683 } 01684 01685 /** Test if function has been attached 01686 */ 01687 operator bool() const { 01688 return _ops; 01689 } 01690 01691 /** Test for equality 01692 */ 01693 friend bool operator==(const Callback &l, const Callback &r) { 01694 return memcmp(&l, &r, sizeof(Callback)) == 0; 01695 } 01696 01697 /** Test for inequality 01698 */ 01699 friend bool operator!=(const Callback &l, const Callback &r) { 01700 return !(l == r); 01701 } 01702 01703 /** Static thunk for passing as C-style function 01704 * @param func Callback to call passed as void pointer 01705 * @param a0 An argument to be called with function func 01706 * @param a1 An argument to be called with function func 01707 * @return the value as determined by func which is of 01708 * type and determined by the signiture of func 01709 */ 01710 static R thunk(void *func, A0 a0, A1 a1) { 01711 return static_cast<Callback*>(func)->call(a0, a1); 01712 } 01713 01714 private: 01715 // Stored as pointer to function and pointer to optional object 01716 // Function pointer is stored as union of possible function types 01717 // to garuntee proper size and alignment 01718 struct _class; 01719 union { 01720 void (*_staticfunc)(A0, A1); 01721 void (*_boundfunc)(_class*, A0, A1); 01722 void (_class::*_methodfunc)(A0, A1); 01723 } _func; 01724 void *_obj; 01725 01726 // Dynamically dispatched operations 01727 const struct ops { 01728 R (*call)(const void*, A0, A1); 01729 void (*move)(void*, const void*); 01730 void (*dtor)(void*); 01731 } *_ops; 01732 01733 // Generate operations for function object 01734 template <typename F> 01735 void generate(const F &f) { 01736 static const ops ops = { 01737 &Callback::function_call<F>, 01738 &Callback::function_move<F>, 01739 &Callback::function_dtor<F>, 01740 }; 01741 01742 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), 01743 "Type F must not exceed the size of the Callback class"); 01744 new (this) F(f); 01745 _ops = &ops; 01746 } 01747 01748 // Function attributes 01749 template <typename F> 01750 static R function_call(const void *p, A0 a0, A1 a1) { 01751 return (*(F*)p)(a0, a1); 01752 } 01753 01754 template <typename F> 01755 static void function_move(void *d, const void *p) { 01756 new (d) F(*(F*)p); 01757 } 01758 01759 template <typename F> 01760 static void function_dtor(void *p) { 01761 ((F*)p)->~F(); 01762 } 01763 01764 // Wrappers for functions with context 01765 template <typename O, typename M> 01766 struct method_context { 01767 M method; 01768 O *obj; 01769 01770 method_context(O *obj, M method) 01771 : method(method), obj(obj) {} 01772 01773 R operator()(A0 a0, A1 a1) const { 01774 return (obj->*method)(a0, a1); 01775 } 01776 }; 01777 01778 template <typename F, typename A> 01779 struct function_context { 01780 F func; 01781 A *arg; 01782 01783 function_context(F func, A *arg) 01784 : func(func), arg(arg) {} 01785 01786 R operator()(A0 a0, A1 a1) const { 01787 return func(arg, a0, a1); 01788 } 01789 }; 01790 }; 01791 01792 /** Callback class based on template specialization 01793 * 01794 * @note Synchronization level: Not protected 01795 * @ingroup platform 01796 */ 01797 template <typename R, typename A0, typename A1, typename A2> 01798 class Callback<R(A0, A1, A2)> { 01799 public: 01800 /** Create a Callback with a static function 01801 * @param func Static function to attach 01802 */ 01803 Callback(R (*func)(A0, A1, A2) = 0) { 01804 if (!func) { 01805 _ops = 0; 01806 } else { 01807 generate(func); 01808 } 01809 } 01810 01811 /** Attach a Callback 01812 * @param func The Callback to attach 01813 */ 01814 Callback(const Callback<R(A0, A1, A2)> &func) { 01815 if (func._ops) { 01816 func._ops->move(this, &func); 01817 } 01818 _ops = func._ops; 01819 } 01820 01821 /** Create a Callback with a member function 01822 * @param obj Pointer to object to invoke member function on 01823 * @param method Member function to attach 01824 */ 01825 template<typename T, typename U> 01826 Callback(U *obj, R (T::*method)(A0, A1, A2)) { 01827 generate(method_context<T, R (T::*)(A0, A1, A2)>(obj, method)); 01828 } 01829 01830 /** Create a Callback with a member function 01831 * @param obj Pointer to object to invoke member function on 01832 * @param method Member function to attach 01833 */ 01834 template<typename T, typename U> 01835 Callback(const U *obj, R (T::*method)(A0, A1, A2) const) { 01836 generate(method_context<const T, R (T::*)(A0, A1, A2) const>(obj, method)); 01837 } 01838 01839 /** Create a Callback with a member function 01840 * @param obj Pointer to object to invoke member function on 01841 * @param method Member function to attach 01842 */ 01843 template<typename T, typename U> 01844 Callback(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) { 01845 generate(method_context<volatile T, R (T::*)(A0, A1, A2) volatile>(obj, method)); 01846 } 01847 01848 /** Create a Callback with a member function 01849 * @param obj Pointer to object to invoke member function on 01850 * @param method Member function to attach 01851 */ 01852 template<typename T, typename U> 01853 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) { 01854 generate(method_context<const volatile T, R (T::*)(A0, A1, A2) const volatile>(obj, method)); 01855 } 01856 01857 /** Create a Callback with a static function and bound pointer 01858 * @param func Static function to attach 01859 * @param arg Pointer argument to function 01860 */ 01861 template<typename T, typename U> 01862 Callback(R (*func)(T*, A0, A1, A2), U *arg) { 01863 generate(function_context<R (*)(T*, A0, A1, A2), T>(func, arg)); 01864 } 01865 01866 /** Create a Callback with a static function and bound pointer 01867 * @param func Static function to attach 01868 * @param arg Pointer argument to function 01869 */ 01870 template<typename T, typename U> 01871 Callback(R (*func)(const T*, A0, A1, A2), const U *arg) { 01872 generate(function_context<R (*)(const T*, A0, A1, A2), const T>(func, arg)); 01873 } 01874 01875 /** Create a Callback with a static function and bound pointer 01876 * @param func Static function to attach 01877 * @param arg Pointer argument to function 01878 */ 01879 template<typename T, typename U> 01880 Callback(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) { 01881 generate(function_context<R (*)(volatile T*, A0, A1, A2), volatile T>(func, arg)); 01882 } 01883 01884 /** Create a Callback with a static function and bound pointer 01885 * @param func Static function to attach 01886 * @param arg Pointer argument to function 01887 */ 01888 template<typename T, typename U> 01889 Callback(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) { 01890 generate(function_context<R (*)(const volatile T*, A0, A1, A2), const volatile T>(func, arg)); 01891 } 01892 01893 /** Create a Callback with a function object 01894 * @param f Function object to attach 01895 * @note The function object is limited to a single word of storage 01896 */ 01897 template <typename F> 01898 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2))) { 01899 generate(f); 01900 } 01901 01902 /** Create a Callback with a function object 01903 * @param f Function object to attach 01904 * @note The function object is limited to a single word of storage 01905 */ 01906 template <typename F> 01907 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const)) { 01908 generate(f); 01909 } 01910 01911 /** Create a Callback with a function object 01912 * @param f Function object to attach 01913 * @note The function object is limited to a single word of storage 01914 */ 01915 template <typename F> 01916 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) volatile)) { 01917 generate(f); 01918 } 01919 01920 /** Create a Callback with a function object 01921 * @param f Function object to attach 01922 * @note The function object is limited to a single word of storage 01923 */ 01924 template <typename F> 01925 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const volatile)) { 01926 generate(f); 01927 } 01928 01929 /** Create a Callback with a static function and bound pointer 01930 * @param obj Pointer to object to bind to function 01931 * @param func Static function to attach 01932 * @deprecated 01933 * Arguments to callback have been reordered to Callback(func, arg) 01934 */ 01935 template<typename T, typename U> 01936 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01937 "Arguments to callback have been reordered to Callback(func, arg)") 01938 Callback(U *obj, R (*func)(T*, A0, A1, A2)) { 01939 new (this) Callback(func, obj); 01940 } 01941 01942 /** Create a Callback with a static function and bound pointer 01943 * @param obj Pointer to object to bind to function 01944 * @param func Static function to attach 01945 * @deprecated 01946 * Arguments to callback have been reordered to Callback(func, arg) 01947 */ 01948 template<typename T, typename U> 01949 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01950 "Arguments to callback have been reordered to Callback(func, arg)") 01951 Callback(const U *obj, R (*func)(const T*, A0, A1, A2)) { 01952 new (this) Callback(func, obj); 01953 } 01954 01955 /** Create a Callback with a static function and bound pointer 01956 * @param obj Pointer to object to bind to function 01957 * @param func Static function to attach 01958 * @deprecated 01959 * Arguments to callback have been reordered to Callback(func, arg) 01960 */ 01961 template<typename T, typename U> 01962 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01963 "Arguments to callback have been reordered to Callback(func, arg)") 01964 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) { 01965 new (this) Callback(func, obj); 01966 } 01967 01968 /** Create a Callback with a static function and bound pointer 01969 * @param obj Pointer to object to bind to function 01970 * @param func Static function to attach 01971 * @deprecated 01972 * Arguments to callback have been reordered to Callback(func, arg) 01973 */ 01974 template<typename T, typename U> 01975 MBED_DEPRECATED_SINCE("mbed-os-5.1", 01976 "Arguments to callback have been reordered to Callback(func, arg)") 01977 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) { 01978 new (this) Callback(func, obj); 01979 } 01980 01981 /** Destroy a callback 01982 */ 01983 ~Callback() { 01984 if (_ops) { 01985 _ops->dtor(this); 01986 } 01987 } 01988 01989 /** Attach a static function 01990 * @param func Static function to attach 01991 * @deprecated 01992 * Replaced by simple assignment 'Callback cb = func' 01993 */ 01994 MBED_DEPRECATED_SINCE("mbed-os-5.4", 01995 "Replaced by simple assignment 'Callback cb = func") 01996 void attach(R (*func)(A0, A1, A2)) { 01997 this->~Callback(); 01998 new (this) Callback(func); 01999 } 02000 02001 /** Attach a Callback 02002 * @param func The Callback to attach 02003 * @deprecated 02004 * Replaced by simple assignment 'Callback cb = func' 02005 */ 02006 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02007 "Replaced by simple assignment 'Callback cb = func") 02008 void attach(const Callback<R(A0, A1, A2)> &func) { 02009 this->~Callback(); 02010 new (this) Callback(func); 02011 } 02012 02013 /** Attach a member function 02014 * @param obj Pointer to object to invoke member function on 02015 * @param method Member function to attach 02016 * @deprecated 02017 * Replaced by simple assignment 'Callback cb = func' 02018 */ 02019 template<typename T, typename U> 02020 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02021 "Replaced by simple assignment 'Callback cb = func") 02022 void attach(U *obj, R (T::*method)(A0, A1, A2)) { 02023 this->~Callback(); 02024 new (this) Callback(obj, method); 02025 } 02026 02027 /** Attach a member function 02028 * @param obj Pointer to object to invoke member function on 02029 * @param method Member function to attach 02030 * @deprecated 02031 * Replaced by simple assignment 'Callback cb = func' 02032 */ 02033 template<typename T, typename U> 02034 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02035 "Replaced by simple assignment 'Callback cb = func") 02036 void attach(const U *obj, R (T::*method)(A0, A1, A2) const) { 02037 this->~Callback(); 02038 new (this) Callback(obj, method); 02039 } 02040 02041 /** Attach a member function 02042 * @param obj Pointer to object to invoke member function on 02043 * @param method Member function to attach 02044 * @deprecated 02045 * Replaced by simple assignment 'Callback cb = func' 02046 */ 02047 template<typename T, typename U> 02048 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02049 "Replaced by simple assignment 'Callback cb = func") 02050 void attach(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) { 02051 this->~Callback(); 02052 new (this) Callback(obj, method); 02053 } 02054 02055 /** Attach a member function 02056 * @param obj Pointer to object to invoke member function on 02057 * @param method Member function to attach 02058 * @deprecated 02059 * Replaced by simple assignment 'Callback cb = func' 02060 */ 02061 template<typename T, typename U> 02062 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02063 "Replaced by simple assignment 'Callback cb = func") 02064 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) { 02065 this->~Callback(); 02066 new (this) Callback(obj, method); 02067 } 02068 02069 /** Attach a static function with a bound pointer 02070 * @param func Static function to attach 02071 * @param arg Pointer argument to function 02072 * @deprecated 02073 * Replaced by simple assignment 'Callback cb = func' 02074 */ 02075 template <typename T, typename U> 02076 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02077 "Replaced by simple assignment 'Callback cb = func") 02078 void attach(R (*func)(T*, A0, A1, A2), U *arg) { 02079 this->~Callback(); 02080 new (this) Callback(func, arg); 02081 } 02082 02083 /** Attach a static function with a bound pointer 02084 * @param func Static function to attach 02085 * @param arg Pointer argument to function 02086 * @deprecated 02087 * Replaced by simple assignment 'Callback cb = func' 02088 */ 02089 template <typename T, typename U> 02090 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02091 "Replaced by simple assignment 'Callback cb = func") 02092 void attach(R (*func)(const T*, A0, A1, A2), const U *arg) { 02093 this->~Callback(); 02094 new (this) Callback(func, arg); 02095 } 02096 02097 /** Attach a static function with a bound pointer 02098 * @param func Static function to attach 02099 * @param arg Pointer argument to function 02100 * @deprecated 02101 * Replaced by simple assignment 'Callback cb = func' 02102 */ 02103 template <typename T, typename U> 02104 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02105 "Replaced by simple assignment 'Callback cb = func") 02106 void attach(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) { 02107 this->~Callback(); 02108 new (this) Callback(func, arg); 02109 } 02110 02111 /** Attach a static function with a bound pointer 02112 * @param func Static function to attach 02113 * @param arg Pointer argument to function 02114 * @deprecated 02115 * Replaced by simple assignment 'Callback cb = func' 02116 */ 02117 template <typename T, typename U> 02118 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02119 "Replaced by simple assignment 'Callback cb = func") 02120 void attach(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) { 02121 this->~Callback(); 02122 new (this) Callback(func, arg); 02123 } 02124 02125 /** Attach a function object 02126 * @param f Function object to attach 02127 * @note The function object is limited to a single word of storage 02128 * @deprecated 02129 * Replaced by simple assignment 'Callback cb = func' 02130 */ 02131 template <typename F> 02132 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02133 "Replaced by simple assignment 'Callback cb = func") 02134 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2))) { 02135 this->~Callback(); 02136 new (this) Callback(f); 02137 } 02138 02139 /** Attach a function object 02140 * @param f Function object to attach 02141 * @note The function object is limited to a single word of storage 02142 * @deprecated 02143 * Replaced by simple assignment 'Callback cb = func' 02144 */ 02145 template <typename F> 02146 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02147 "Replaced by simple assignment 'Callback cb = func") 02148 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const)) { 02149 this->~Callback(); 02150 new (this) Callback(f); 02151 } 02152 02153 /** Attach a function object 02154 * @param f Function object to attach 02155 * @note The function object is limited to a single word of storage 02156 * @deprecated 02157 * Replaced by simple assignment 'Callback cb = func' 02158 */ 02159 template <typename F> 02160 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02161 "Replaced by simple assignment 'Callback cb = func") 02162 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) volatile)) { 02163 this->~Callback(); 02164 new (this) Callback(f); 02165 } 02166 02167 /** Attach a function object 02168 * @param f Function object to attach 02169 * @note The function object is limited to a single word of storage 02170 * @deprecated 02171 * Replaced by simple assignment 'Callback cb = func' 02172 */ 02173 template <typename F> 02174 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02175 "Replaced by simple assignment 'Callback cb = func") 02176 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const volatile)) { 02177 this->~Callback(); 02178 new (this) Callback(f); 02179 } 02180 02181 /** Attach a static function with a bound pointer 02182 * @param obj Pointer to object to bind to function 02183 * @param func Static function to attach 02184 * @deprecated 02185 * Arguments to callback have been reordered to attach(func, arg) 02186 */ 02187 template <typename T, typename U> 02188 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02189 "Arguments to callback have been reordered to attach(func, arg)") 02190 void attach(U *obj, R (*func)(T*, A0, A1, A2)) { 02191 this->~Callback(); 02192 new (this) Callback(func, obj); 02193 } 02194 02195 /** Attach a static function with a bound pointer 02196 * @param obj Pointer to object to bind to function 02197 * @param func Static function to attach 02198 * @deprecated 02199 * Arguments to callback have been reordered to attach(func, arg) 02200 */ 02201 template <typename T, typename U> 02202 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02203 "Arguments to callback have been reordered to attach(func, arg)") 02204 void attach(const U *obj, R (*func)(const T*, A0, A1, A2)) { 02205 this->~Callback(); 02206 new (this) Callback(func, obj); 02207 } 02208 02209 /** Attach a static function with a bound pointer 02210 * @param obj Pointer to object to bind to function 02211 * @param func Static function to attach 02212 * @deprecated 02213 * Arguments to callback have been reordered to attach(func, arg) 02214 */ 02215 template <typename T, typename U> 02216 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02217 "Arguments to callback have been reordered to attach(func, arg)") 02218 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) { 02219 this->~Callback(); 02220 new (this) Callback(func, obj); 02221 } 02222 02223 /** Attach a static function with a bound pointer 02224 * @param obj Pointer to object to bind to function 02225 * @param func Static function to attach 02226 * @deprecated 02227 * Arguments to callback have been reordered to attach(func, arg) 02228 */ 02229 template <typename T, typename U> 02230 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02231 "Arguments to callback have been reordered to attach(func, arg)") 02232 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) { 02233 this->~Callback(); 02234 new (this) Callback(func, obj); 02235 } 02236 02237 /** Assign a callback 02238 */ 02239 Callback &operator=(const Callback &that) { 02240 if (this != &that) { 02241 this->~Callback(); 02242 new (this) Callback(that); 02243 } 02244 02245 return *this; 02246 } 02247 02248 /** Call the attached function 02249 */ 02250 R call(A0 a0, A1 a1, A2 a2) const { 02251 MBED_ASSERT(_ops); 02252 return _ops->call(this, a0, a1, a2); 02253 } 02254 02255 /** Call the attached function 02256 */ 02257 R operator()(A0 a0, A1 a1, A2 a2) const { 02258 return call(a0, a1, a2); 02259 } 02260 02261 /** Test if function has been attached 02262 */ 02263 operator bool() const { 02264 return _ops; 02265 } 02266 02267 /** Test for equality 02268 */ 02269 friend bool operator==(const Callback &l, const Callback &r) { 02270 return memcmp(&l, &r, sizeof(Callback)) == 0; 02271 } 02272 02273 /** Test for inequality 02274 */ 02275 friend bool operator!=(const Callback &l, const Callback &r) { 02276 return !(l == r); 02277 } 02278 02279 /** Static thunk for passing as C-style function 02280 * @param func Callback to call passed as void pointer 02281 * @param a0 An argument to be called with function func 02282 * @param a1 An argument to be called with function func 02283 * @param a2 An argument to be called with function func 02284 * @return the value as determined by func which is of 02285 * type and determined by the signiture of func 02286 */ 02287 static R thunk(void *func, A0 a0, A1 a1, A2 a2) { 02288 return static_cast<Callback*>(func)->call(a0, a1, a2); 02289 } 02290 02291 private: 02292 // Stored as pointer to function and pointer to optional object 02293 // Function pointer is stored as union of possible function types 02294 // to garuntee proper size and alignment 02295 struct _class; 02296 union { 02297 void (*_staticfunc)(A0, A1, A2); 02298 void (*_boundfunc)(_class*, A0, A1, A2); 02299 void (_class::*_methodfunc)(A0, A1, A2); 02300 } _func; 02301 void *_obj; 02302 02303 // Dynamically dispatched operations 02304 const struct ops { 02305 R (*call)(const void*, A0, A1, A2); 02306 void (*move)(void*, const void*); 02307 void (*dtor)(void*); 02308 } *_ops; 02309 02310 // Generate operations for function object 02311 template <typename F> 02312 void generate(const F &f) { 02313 static const ops ops = { 02314 &Callback::function_call<F>, 02315 &Callback::function_move<F>, 02316 &Callback::function_dtor<F>, 02317 }; 02318 02319 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), 02320 "Type F must not exceed the size of the Callback class"); 02321 new (this) F(f); 02322 _ops = &ops; 02323 } 02324 02325 // Function attributes 02326 template <typename F> 02327 static R function_call(const void *p, A0 a0, A1 a1, A2 a2) { 02328 return (*(F*)p)(a0, a1, a2); 02329 } 02330 02331 template <typename F> 02332 static void function_move(void *d, const void *p) { 02333 new (d) F(*(F*)p); 02334 } 02335 02336 template <typename F> 02337 static void function_dtor(void *p) { 02338 ((F*)p)->~F(); 02339 } 02340 02341 // Wrappers for functions with context 02342 template <typename O, typename M> 02343 struct method_context { 02344 M method; 02345 O *obj; 02346 02347 method_context(O *obj, M method) 02348 : method(method), obj(obj) {} 02349 02350 R operator()(A0 a0, A1 a1, A2 a2) const { 02351 return (obj->*method)(a0, a1, a2); 02352 } 02353 }; 02354 02355 template <typename F, typename A> 02356 struct function_context { 02357 F func; 02358 A *arg; 02359 02360 function_context(F func, A *arg) 02361 : func(func), arg(arg) {} 02362 02363 R operator()(A0 a0, A1 a1, A2 a2) const { 02364 return func(arg, a0, a1, a2); 02365 } 02366 }; 02367 }; 02368 02369 /** Callback class based on template specialization 02370 * 02371 * @note Synchronization level: Not protected 02372 * @ingroup platform 02373 */ 02374 template <typename R, typename A0, typename A1, typename A2, typename A3> 02375 class Callback<R(A0, A1, A2, A3)> { 02376 public: 02377 /** Create a Callback with a static function 02378 * @param func Static function to attach 02379 */ 02380 Callback(R (*func)(A0, A1, A2, A3) = 0) { 02381 if (!func) { 02382 _ops = 0; 02383 } else { 02384 generate(func); 02385 } 02386 } 02387 02388 /** Attach a Callback 02389 * @param func The Callback to attach 02390 */ 02391 Callback(const Callback<R(A0, A1, A2, A3)> &func) { 02392 if (func._ops) { 02393 func._ops->move(this, &func); 02394 } 02395 _ops = func._ops; 02396 } 02397 02398 /** Create a Callback with a member function 02399 * @param obj Pointer to object to invoke member function on 02400 * @param method Member function to attach 02401 */ 02402 template<typename T, typename U> 02403 Callback(U *obj, R (T::*method)(A0, A1, A2, A3)) { 02404 generate(method_context<T, R (T::*)(A0, A1, A2, A3)>(obj, method)); 02405 } 02406 02407 /** Create a Callback with a member function 02408 * @param obj Pointer to object to invoke member function on 02409 * @param method Member function to attach 02410 */ 02411 template<typename T, typename U> 02412 Callback(const U *obj, R (T::*method)(A0, A1, A2, A3) const) { 02413 generate(method_context<const T, R (T::*)(A0, A1, A2, A3) const>(obj, method)); 02414 } 02415 02416 /** Create a Callback with a member function 02417 * @param obj Pointer to object to invoke member function on 02418 * @param method Member function to attach 02419 */ 02420 template<typename T, typename U> 02421 Callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) { 02422 generate(method_context<volatile T, R (T::*)(A0, A1, A2, A3) volatile>(obj, method)); 02423 } 02424 02425 /** Create a Callback with a member function 02426 * @param obj Pointer to object to invoke member function on 02427 * @param method Member function to attach 02428 */ 02429 template<typename T, typename U> 02430 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) { 02431 generate(method_context<const volatile T, R (T::*)(A0, A1, A2, A3) const volatile>(obj, method)); 02432 } 02433 02434 /** Create a Callback with a static function and bound pointer 02435 * @param func Static function to attach 02436 * @param arg Pointer argument to function 02437 */ 02438 template<typename T, typename U> 02439 Callback(R (*func)(T*, A0, A1, A2, A3), U *arg) { 02440 generate(function_context<R (*)(T*, A0, A1, A2, A3), T>(func, arg)); 02441 } 02442 02443 /** Create a Callback with a static function and bound pointer 02444 * @param func Static function to attach 02445 * @param arg Pointer argument to function 02446 */ 02447 template<typename T, typename U> 02448 Callback(R (*func)(const T*, A0, A1, A2, A3), const U *arg) { 02449 generate(function_context<R (*)(const T*, A0, A1, A2, A3), const T>(func, arg)); 02450 } 02451 02452 /** Create a Callback with a static function and bound pointer 02453 * @param func Static function to attach 02454 * @param arg Pointer argument to function 02455 */ 02456 template<typename T, typename U> 02457 Callback(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) { 02458 generate(function_context<R (*)(volatile T*, A0, A1, A2, A3), volatile T>(func, arg)); 02459 } 02460 02461 /** Create a Callback with a static function and bound pointer 02462 * @param func Static function to attach 02463 * @param arg Pointer argument to function 02464 */ 02465 template<typename T, typename U> 02466 Callback(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) { 02467 generate(function_context<R (*)(const volatile T*, A0, A1, A2, A3), const volatile T>(func, arg)); 02468 } 02469 02470 /** Create a Callback with a function object 02471 * @param f Function object to attach 02472 * @note The function object is limited to a single word of storage 02473 */ 02474 template <typename F> 02475 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3))) { 02476 generate(f); 02477 } 02478 02479 /** Create a Callback with a function object 02480 * @param f Function object to attach 02481 * @note The function object is limited to a single word of storage 02482 */ 02483 template <typename F> 02484 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const)) { 02485 generate(f); 02486 } 02487 02488 /** Create a Callback with a function object 02489 * @param f Function object to attach 02490 * @note The function object is limited to a single word of storage 02491 */ 02492 template <typename F> 02493 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) volatile)) { 02494 generate(f); 02495 } 02496 02497 /** Create a Callback with a function object 02498 * @param f Function object to attach 02499 * @note The function object is limited to a single word of storage 02500 */ 02501 template <typename F> 02502 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const volatile)) { 02503 generate(f); 02504 } 02505 02506 /** Create a Callback with a static function and bound pointer 02507 * @param obj Pointer to object to bind to function 02508 * @param func Static function to attach 02509 * @deprecated 02510 * Arguments to callback have been reordered to Callback(func, arg) 02511 */ 02512 template<typename T, typename U> 02513 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02514 "Arguments to callback have been reordered to Callback(func, arg)") 02515 Callback(U *obj, R (*func)(T*, A0, A1, A2, A3)) { 02516 new (this) Callback(func, obj); 02517 } 02518 02519 /** Create a Callback with a static function and bound pointer 02520 * @param obj Pointer to object to bind to function 02521 * @param func Static function to attach 02522 * @deprecated 02523 * Arguments to callback have been reordered to Callback(func, arg) 02524 */ 02525 template<typename T, typename U> 02526 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02527 "Arguments to callback have been reordered to Callback(func, arg)") 02528 Callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) { 02529 new (this) Callback(func, obj); 02530 } 02531 02532 /** Create a Callback with a static function and bound pointer 02533 * @param obj Pointer to object to bind to function 02534 * @param func Static function to attach 02535 * @deprecated 02536 * Arguments to callback have been reordered to Callback(func, arg) 02537 */ 02538 template<typename T, typename U> 02539 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02540 "Arguments to callback have been reordered to Callback(func, arg)") 02541 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) { 02542 new (this) Callback(func, obj); 02543 } 02544 02545 /** Create a Callback with a static function and bound pointer 02546 * @param obj Pointer to object to bind to function 02547 * @param func Static function to attach 02548 * @deprecated 02549 * Arguments to callback have been reordered to Callback(func, arg) 02550 */ 02551 template<typename T, typename U> 02552 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02553 "Arguments to callback have been reordered to Callback(func, arg)") 02554 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) { 02555 new (this) Callback(func, obj); 02556 } 02557 02558 /** Destroy a callback 02559 */ 02560 ~Callback() { 02561 if (_ops) { 02562 _ops->dtor(this); 02563 } 02564 } 02565 02566 /** Attach a static function 02567 * @param func Static function to attach 02568 * @deprecated 02569 * Replaced by simple assignment 'Callback cb = func' 02570 */ 02571 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02572 "Replaced by simple assignment 'Callback cb = func") 02573 void attach(R (*func)(A0, A1, A2, A3)) { 02574 this->~Callback(); 02575 new (this) Callback(func); 02576 } 02577 02578 /** Attach a Callback 02579 * @param func The Callback to attach 02580 * @deprecated 02581 * Replaced by simple assignment 'Callback cb = func' 02582 */ 02583 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02584 "Replaced by simple assignment 'Callback cb = func") 02585 void attach(const Callback<R(A0, A1, A2, A3)> &func) { 02586 this->~Callback(); 02587 new (this) Callback(func); 02588 } 02589 02590 /** Attach a member function 02591 * @param obj Pointer to object to invoke member function on 02592 * @param method Member function to attach 02593 * @deprecated 02594 * Replaced by simple assignment 'Callback cb = func' 02595 */ 02596 template<typename T, typename U> 02597 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02598 "Replaced by simple assignment 'Callback cb = func") 02599 void attach(U *obj, R (T::*method)(A0, A1, A2, A3)) { 02600 this->~Callback(); 02601 new (this) Callback(obj, method); 02602 } 02603 02604 /** Attach a member function 02605 * @param obj Pointer to object to invoke member function on 02606 * @param method Member function to attach 02607 * @deprecated 02608 * Replaced by simple assignment 'Callback cb = func' 02609 */ 02610 template<typename T, typename U> 02611 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02612 "Replaced by simple assignment 'Callback cb = func") 02613 void attach(const U *obj, R (T::*method)(A0, A1, A2, A3) const) { 02614 this->~Callback(); 02615 new (this) Callback(obj, method); 02616 } 02617 02618 /** Attach a member function 02619 * @param obj Pointer to object to invoke member function on 02620 * @param method Member function to attach 02621 * @deprecated 02622 * Replaced by simple assignment 'Callback cb = func' 02623 */ 02624 template<typename T, typename U> 02625 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02626 "Replaced by simple assignment 'Callback cb = func") 02627 void attach(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) { 02628 this->~Callback(); 02629 new (this) Callback(obj, method); 02630 } 02631 02632 /** Attach a member function 02633 * @param obj Pointer to object to invoke member function on 02634 * @param method Member function to attach 02635 * @deprecated 02636 * Replaced by simple assignment 'Callback cb = func' 02637 */ 02638 template<typename T, typename U> 02639 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02640 "Replaced by simple assignment 'Callback cb = func") 02641 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) { 02642 this->~Callback(); 02643 new (this) Callback(obj, method); 02644 } 02645 02646 /** Attach a static function with a bound pointer 02647 * @param func Static function to attach 02648 * @param arg Pointer argument to function 02649 * @deprecated 02650 * Replaced by simple assignment 'Callback cb = func' 02651 */ 02652 template <typename T, typename U> 02653 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02654 "Replaced by simple assignment 'Callback cb = func") 02655 void attach(R (*func)(T*, A0, A1, A2, A3), U *arg) { 02656 this->~Callback(); 02657 new (this) Callback(func, arg); 02658 } 02659 02660 /** Attach a static function with a bound pointer 02661 * @param func Static function to attach 02662 * @param arg Pointer argument to function 02663 * @deprecated 02664 * Replaced by simple assignment 'Callback cb = func' 02665 */ 02666 template <typename T, typename U> 02667 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02668 "Replaced by simple assignment 'Callback cb = func") 02669 void attach(R (*func)(const T*, A0, A1, A2, A3), const U *arg) { 02670 this->~Callback(); 02671 new (this) Callback(func, arg); 02672 } 02673 02674 /** Attach a static function with a bound pointer 02675 * @param func Static function to attach 02676 * @param arg Pointer argument to function 02677 * @deprecated 02678 * Replaced by simple assignment 'Callback cb = func' 02679 */ 02680 template <typename T, typename U> 02681 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02682 "Replaced by simple assignment 'Callback cb = func") 02683 void attach(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) { 02684 this->~Callback(); 02685 new (this) Callback(func, arg); 02686 } 02687 02688 /** Attach a static function with a bound pointer 02689 * @param func Static function to attach 02690 * @param arg Pointer argument to function 02691 * @deprecated 02692 * Replaced by simple assignment 'Callback cb = func' 02693 */ 02694 template <typename T, typename U> 02695 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02696 "Replaced by simple assignment 'Callback cb = func") 02697 void attach(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) { 02698 this->~Callback(); 02699 new (this) Callback(func, arg); 02700 } 02701 02702 /** Attach a function object 02703 * @param f Function object to attach 02704 * @note The function object is limited to a single word of storage 02705 * @deprecated 02706 * Replaced by simple assignment 'Callback cb = func' 02707 */ 02708 template <typename F> 02709 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02710 "Replaced by simple assignment 'Callback cb = func") 02711 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3))) { 02712 this->~Callback(); 02713 new (this) Callback(f); 02714 } 02715 02716 /** Attach a function object 02717 * @param f Function object to attach 02718 * @note The function object is limited to a single word of storage 02719 * @deprecated 02720 * Replaced by simple assignment 'Callback cb = func' 02721 */ 02722 template <typename F> 02723 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02724 "Replaced by simple assignment 'Callback cb = func") 02725 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const)) { 02726 this->~Callback(); 02727 new (this) Callback(f); 02728 } 02729 02730 /** Attach a function object 02731 * @param f Function object to attach 02732 * @note The function object is limited to a single word of storage 02733 * @deprecated 02734 * Replaced by simple assignment 'Callback cb = func' 02735 */ 02736 template <typename F> 02737 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02738 "Replaced by simple assignment 'Callback cb = func") 02739 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) volatile)) { 02740 this->~Callback(); 02741 new (this) Callback(f); 02742 } 02743 02744 /** Attach a function object 02745 * @param f Function object to attach 02746 * @note The function object is limited to a single word of storage 02747 * @deprecated 02748 * Replaced by simple assignment 'Callback cb = func' 02749 */ 02750 template <typename F> 02751 MBED_DEPRECATED_SINCE("mbed-os-5.4", 02752 "Replaced by simple assignment 'Callback cb = func") 02753 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const volatile)) { 02754 this->~Callback(); 02755 new (this) Callback(f); 02756 } 02757 02758 /** Attach a static function with a bound pointer 02759 * @param obj Pointer to object to bind to function 02760 * @param func Static function to attach 02761 * @deprecated 02762 * Arguments to callback have been reordered to attach(func, arg) 02763 */ 02764 template <typename T, typename U> 02765 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02766 "Arguments to callback have been reordered to attach(func, arg)") 02767 void attach(U *obj, R (*func)(T*, A0, A1, A2, A3)) { 02768 this->~Callback(); 02769 new (this) Callback(func, obj); 02770 } 02771 02772 /** Attach a static function with a bound pointer 02773 * @param obj Pointer to object to bind to function 02774 * @param func Static function to attach 02775 * @deprecated 02776 * Arguments to callback have been reordered to attach(func, arg) 02777 */ 02778 template <typename T, typename U> 02779 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02780 "Arguments to callback have been reordered to attach(func, arg)") 02781 void attach(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) { 02782 this->~Callback(); 02783 new (this) Callback(func, obj); 02784 } 02785 02786 /** Attach a static function with a bound pointer 02787 * @param obj Pointer to object to bind to function 02788 * @param func Static function to attach 02789 * @deprecated 02790 * Arguments to callback have been reordered to attach(func, arg) 02791 */ 02792 template <typename T, typename U> 02793 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02794 "Arguments to callback have been reordered to attach(func, arg)") 02795 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) { 02796 this->~Callback(); 02797 new (this) Callback(func, obj); 02798 } 02799 02800 /** Attach a static function with a bound pointer 02801 * @param obj Pointer to object to bind to function 02802 * @param func Static function to attach 02803 * @deprecated 02804 * Arguments to callback have been reordered to attach(func, arg) 02805 */ 02806 template <typename T, typename U> 02807 MBED_DEPRECATED_SINCE("mbed-os-5.1", 02808 "Arguments to callback have been reordered to attach(func, arg)") 02809 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) { 02810 this->~Callback(); 02811 new (this) Callback(func, obj); 02812 } 02813 02814 /** Assign a callback 02815 */ 02816 Callback &operator=(const Callback &that) { 02817 if (this != &that) { 02818 this->~Callback(); 02819 new (this) Callback(that); 02820 } 02821 02822 return *this; 02823 } 02824 02825 /** Call the attached function 02826 */ 02827 R call(A0 a0, A1 a1, A2 a2, A3 a3) const { 02828 MBED_ASSERT(_ops); 02829 return _ops->call(this, a0, a1, a2, a3); 02830 } 02831 02832 /** Call the attached function 02833 */ 02834 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const { 02835 return call(a0, a1, a2, a3); 02836 } 02837 02838 /** Test if function has been attached 02839 */ 02840 operator bool() const { 02841 return _ops; 02842 } 02843 02844 /** Test for equality 02845 */ 02846 friend bool operator==(const Callback &l, const Callback &r) { 02847 return memcmp(&l, &r, sizeof(Callback)) == 0; 02848 } 02849 02850 /** Test for inequality 02851 */ 02852 friend bool operator!=(const Callback &l, const Callback &r) { 02853 return !(l == r); 02854 } 02855 02856 /** Static thunk for passing as C-style function 02857 * @param func Callback to call passed as void pointer 02858 * @param a0 An argument to be called with function func 02859 * @param a1 An argument to be called with function func 02860 * @param a2 An argument to be called with function func 02861 * @param a3 An argument to be called with function func 02862 * @return the value as determined by func which is of 02863 * type and determined by the signiture of func 02864 */ 02865 static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) { 02866 return static_cast<Callback*>(func)->call(a0, a1, a2, a3); 02867 } 02868 02869 private: 02870 // Stored as pointer to function and pointer to optional object 02871 // Function pointer is stored as union of possible function types 02872 // to garuntee proper size and alignment 02873 struct _class; 02874 union { 02875 void (*_staticfunc)(A0, A1, A2, A3); 02876 void (*_boundfunc)(_class*, A0, A1, A2, A3); 02877 void (_class::*_methodfunc)(A0, A1, A2, A3); 02878 } _func; 02879 void *_obj; 02880 02881 // Dynamically dispatched operations 02882 const struct ops { 02883 R (*call)(const void*, A0, A1, A2, A3); 02884 void (*move)(void*, const void*); 02885 void (*dtor)(void*); 02886 } *_ops; 02887 02888 // Generate operations for function object 02889 template <typename F> 02890 void generate(const F &f) { 02891 static const ops ops = { 02892 &Callback::function_call<F>, 02893 &Callback::function_move<F>, 02894 &Callback::function_dtor<F>, 02895 }; 02896 02897 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), 02898 "Type F must not exceed the size of the Callback class"); 02899 new (this) F(f); 02900 _ops = &ops; 02901 } 02902 02903 // Function attributes 02904 template <typename F> 02905 static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3) { 02906 return (*(F*)p)(a0, a1, a2, a3); 02907 } 02908 02909 template <typename F> 02910 static void function_move(void *d, const void *p) { 02911 new (d) F(*(F*)p); 02912 } 02913 02914 template <typename F> 02915 static void function_dtor(void *p) { 02916 ((F*)p)->~F(); 02917 } 02918 02919 // Wrappers for functions with context 02920 template <typename O, typename M> 02921 struct method_context { 02922 M method; 02923 O *obj; 02924 02925 method_context(O *obj, M method) 02926 : method(method), obj(obj) {} 02927 02928 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const { 02929 return (obj->*method)(a0, a1, a2, a3); 02930 } 02931 }; 02932 02933 template <typename F, typename A> 02934 struct function_context { 02935 F func; 02936 A *arg; 02937 02938 function_context(F func, A *arg) 02939 : func(func), arg(arg) {} 02940 02941 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const { 02942 return func(arg, a0, a1, a2, a3); 02943 } 02944 }; 02945 }; 02946 02947 /** Callback class based on template specialization 02948 * 02949 * @note Synchronization level: Not protected 02950 * @ingroup platform 02951 */ 02952 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 02953 class Callback<R(A0, A1, A2, A3, A4)> { 02954 public: 02955 /** Create a Callback with a static function 02956 * @param func Static function to attach 02957 */ 02958 Callback(R (*func)(A0, A1, A2, A3, A4) = 0) { 02959 if (!func) { 02960 _ops = 0; 02961 } else { 02962 generate(func); 02963 } 02964 } 02965 02966 /** Attach a Callback 02967 * @param func The Callback to attach 02968 */ 02969 Callback(const Callback<R(A0, A1, A2, A3, A4)> &func) { 02970 if (func._ops) { 02971 func._ops->move(this, &func); 02972 } 02973 _ops = func._ops; 02974 } 02975 02976 /** Create a Callback with a member function 02977 * @param obj Pointer to object to invoke member function on 02978 * @param method Member function to attach 02979 */ 02980 template<typename T, typename U> 02981 Callback(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) { 02982 generate(method_context<T, R (T::*)(A0, A1, A2, A3, A4)>(obj, method)); 02983 } 02984 02985 /** Create a Callback with a member function 02986 * @param obj Pointer to object to invoke member function on 02987 * @param method Member function to attach 02988 */ 02989 template<typename T, typename U> 02990 Callback(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) { 02991 generate(method_context<const T, R (T::*)(A0, A1, A2, A3, A4) const>(obj, method)); 02992 } 02993 02994 /** Create a Callback with a member function 02995 * @param obj Pointer to object to invoke member function on 02996 * @param method Member function to attach 02997 */ 02998 template<typename T, typename U> 02999 Callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) { 03000 generate(method_context<volatile T, R (T::*)(A0, A1, A2, A3, A4) volatile>(obj, method)); 03001 } 03002 03003 /** Create a Callback with a member function 03004 * @param obj Pointer to object to invoke member function on 03005 * @param method Member function to attach 03006 */ 03007 template<typename T, typename U> 03008 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) { 03009 generate(method_context<const volatile T, R (T::*)(A0, A1, A2, A3, A4) const volatile>(obj, method)); 03010 } 03011 03012 /** Create a Callback with a static function and bound pointer 03013 * @param func Static function to attach 03014 * @param arg Pointer argument to function 03015 */ 03016 template<typename T, typename U> 03017 Callback(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) { 03018 generate(function_context<R (*)(T*, A0, A1, A2, A3, A4), T>(func, arg)); 03019 } 03020 03021 /** Create a Callback with a static function and bound pointer 03022 * @param func Static function to attach 03023 * @param arg Pointer argument to function 03024 */ 03025 template<typename T, typename U> 03026 Callback(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) { 03027 generate(function_context<R (*)(const T*, A0, A1, A2, A3, A4), const T>(func, arg)); 03028 } 03029 03030 /** Create a Callback with a static function and bound pointer 03031 * @param func Static function to attach 03032 * @param arg Pointer argument to function 03033 */ 03034 template<typename T, typename U> 03035 Callback(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) { 03036 generate(function_context<R (*)(volatile T*, A0, A1, A2, A3, A4), volatile T>(func, arg)); 03037 } 03038 03039 /** Create a Callback with a static function and bound pointer 03040 * @param func Static function to attach 03041 * @param arg Pointer argument to function 03042 */ 03043 template<typename T, typename U> 03044 Callback(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) { 03045 generate(function_context<R (*)(const volatile T*, A0, A1, A2, A3, A4), const volatile T>(func, arg)); 03046 } 03047 03048 /** Create a Callback with a function object 03049 * @param f Function object to attach 03050 * @note The function object is limited to a single word of storage 03051 */ 03052 template <typename F> 03053 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4))) { 03054 generate(f); 03055 } 03056 03057 /** Create a Callback with a function object 03058 * @param f Function object to attach 03059 * @note The function object is limited to a single word of storage 03060 */ 03061 template <typename F> 03062 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const)) { 03063 generate(f); 03064 } 03065 03066 /** Create a Callback with a function object 03067 * @param f Function object to attach 03068 * @note The function object is limited to a single word of storage 03069 */ 03070 template <typename F> 03071 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) volatile)) { 03072 generate(f); 03073 } 03074 03075 /** Create a Callback with a function object 03076 * @param f Function object to attach 03077 * @note The function object is limited to a single word of storage 03078 */ 03079 template <typename F> 03080 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const volatile)) { 03081 generate(f); 03082 } 03083 03084 /** Create a Callback with a static function and bound pointer 03085 * @param obj Pointer to object to bind to function 03086 * @param func Static function to attach 03087 * @deprecated 03088 * Arguments to callback have been reordered to Callback(func, arg) 03089 */ 03090 template<typename T, typename U> 03091 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03092 "Arguments to callback have been reordered to Callback(func, arg)") 03093 Callback(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) { 03094 new (this) Callback(func, obj); 03095 } 03096 03097 /** Create a Callback with a static function and bound pointer 03098 * @param obj Pointer to object to bind to function 03099 * @param func Static function to attach 03100 * @deprecated 03101 * Arguments to callback have been reordered to Callback(func, arg) 03102 */ 03103 template<typename T, typename U> 03104 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03105 "Arguments to callback have been reordered to Callback(func, arg)") 03106 Callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) { 03107 new (this) Callback(func, obj); 03108 } 03109 03110 /** Create a Callback with a static function and bound pointer 03111 * @param obj Pointer to object to bind to function 03112 * @param func Static function to attach 03113 * @deprecated 03114 * Arguments to callback have been reordered to Callback(func, arg) 03115 */ 03116 template<typename T, typename U> 03117 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03118 "Arguments to callback have been reordered to Callback(func, arg)") 03119 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) { 03120 new (this) Callback(func, obj); 03121 } 03122 03123 /** Create a Callback with a static function and bound pointer 03124 * @param obj Pointer to object to bind to function 03125 * @param func Static function to attach 03126 * @deprecated 03127 * Arguments to callback have been reordered to Callback(func, arg) 03128 */ 03129 template<typename T, typename U> 03130 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03131 "Arguments to callback have been reordered to Callback(func, arg)") 03132 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) { 03133 new (this) Callback(func, obj); 03134 } 03135 03136 /** Destroy a callback 03137 */ 03138 ~Callback() { 03139 if (_ops) { 03140 _ops->dtor(this); 03141 } 03142 } 03143 03144 /** Attach a static function 03145 * @param func Static function to attach 03146 * @deprecated 03147 * Replaced by simple assignment 'Callback cb = func' 03148 */ 03149 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03150 "Replaced by simple assignment 'Callback cb = func") 03151 void attach(R (*func)(A0, A1, A2, A3, A4)) { 03152 this->~Callback(); 03153 new (this) Callback(func); 03154 } 03155 03156 /** Attach a Callback 03157 * @param func The Callback to attach 03158 * @deprecated 03159 * Replaced by simple assignment 'Callback cb = func' 03160 */ 03161 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03162 "Replaced by simple assignment 'Callback cb = func") 03163 void attach(const Callback<R(A0, A1, A2, A3, A4)> &func) { 03164 this->~Callback(); 03165 new (this) Callback(func); 03166 } 03167 03168 /** Attach a member function 03169 * @param obj Pointer to object to invoke member function on 03170 * @param method Member function to attach 03171 * @deprecated 03172 * Replaced by simple assignment 'Callback cb = func' 03173 */ 03174 template<typename T, typename U> 03175 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03176 "Replaced by simple assignment 'Callback cb = func") 03177 void attach(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) { 03178 this->~Callback(); 03179 new (this) Callback(obj, method); 03180 } 03181 03182 /** Attach a member function 03183 * @param obj Pointer to object to invoke member function on 03184 * @param method Member function to attach 03185 * @deprecated 03186 * Replaced by simple assignment 'Callback cb = func' 03187 */ 03188 template<typename T, typename U> 03189 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03190 "Replaced by simple assignment 'Callback cb = func") 03191 void attach(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) { 03192 this->~Callback(); 03193 new (this) Callback(obj, method); 03194 } 03195 03196 /** Attach a member function 03197 * @param obj Pointer to object to invoke member function on 03198 * @param method Member function to attach 03199 * @deprecated 03200 * Replaced by simple assignment 'Callback cb = func' 03201 */ 03202 template<typename T, typename U> 03203 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03204 "Replaced by simple assignment 'Callback cb = func") 03205 void attach(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) { 03206 this->~Callback(); 03207 new (this) Callback(obj, method); 03208 } 03209 03210 /** Attach a member function 03211 * @param obj Pointer to object to invoke member function on 03212 * @param method Member function to attach 03213 * @deprecated 03214 * Replaced by simple assignment 'Callback cb = func' 03215 */ 03216 template<typename T, typename U> 03217 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03218 "Replaced by simple assignment 'Callback cb = func") 03219 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) { 03220 this->~Callback(); 03221 new (this) Callback(obj, method); 03222 } 03223 03224 /** Attach a static function with a bound pointer 03225 * @param func Static function to attach 03226 * @param arg Pointer argument to function 03227 * @deprecated 03228 * Replaced by simple assignment 'Callback cb = func' 03229 */ 03230 template <typename T, typename U> 03231 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03232 "Replaced by simple assignment 'Callback cb = func") 03233 void attach(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) { 03234 this->~Callback(); 03235 new (this) Callback(func, arg); 03236 } 03237 03238 /** Attach a static function with a bound pointer 03239 * @param func Static function to attach 03240 * @param arg Pointer argument to function 03241 * @deprecated 03242 * Replaced by simple assignment 'Callback cb = func' 03243 */ 03244 template <typename T, typename U> 03245 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03246 "Replaced by simple assignment 'Callback cb = func") 03247 void attach(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) { 03248 this->~Callback(); 03249 new (this) Callback(func, arg); 03250 } 03251 03252 /** Attach a static function with a bound pointer 03253 * @param func Static function to attach 03254 * @param arg Pointer argument to function 03255 * @deprecated 03256 * Replaced by simple assignment 'Callback cb = func' 03257 */ 03258 template <typename T, typename U> 03259 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03260 "Replaced by simple assignment 'Callback cb = func") 03261 void attach(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) { 03262 this->~Callback(); 03263 new (this) Callback(func, arg); 03264 } 03265 03266 /** Attach a static function with a bound pointer 03267 * @param func Static function to attach 03268 * @param arg Pointer argument to function 03269 * @deprecated 03270 * Replaced by simple assignment 'Callback cb = func' 03271 */ 03272 template <typename T, typename U> 03273 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03274 "Replaced by simple assignment 'Callback cb = func") 03275 void attach(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) { 03276 this->~Callback(); 03277 new (this) Callback(func, arg); 03278 } 03279 03280 /** Attach a function object 03281 * @param f Function object to attach 03282 * @note The function object is limited to a single word of storage 03283 * @deprecated 03284 * Replaced by simple assignment 'Callback cb = func' 03285 */ 03286 template <typename F> 03287 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03288 "Replaced by simple assignment 'Callback cb = func") 03289 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4))) { 03290 this->~Callback(); 03291 new (this) Callback(f); 03292 } 03293 03294 /** Attach a function object 03295 * @param f Function object to attach 03296 * @note The function object is limited to a single word of storage 03297 * @deprecated 03298 * Replaced by simple assignment 'Callback cb = func' 03299 */ 03300 template <typename F> 03301 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03302 "Replaced by simple assignment 'Callback cb = func") 03303 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const)) { 03304 this->~Callback(); 03305 new (this) Callback(f); 03306 } 03307 03308 /** Attach a function object 03309 * @param f Function object to attach 03310 * @note The function object is limited to a single word of storage 03311 * @deprecated 03312 * Replaced by simple assignment 'Callback cb = func' 03313 */ 03314 template <typename F> 03315 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03316 "Replaced by simple assignment 'Callback cb = func") 03317 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) volatile)) { 03318 this->~Callback(); 03319 new (this) Callback(f); 03320 } 03321 03322 /** Attach a function object 03323 * @param f Function object to attach 03324 * @note The function object is limited to a single word of storage 03325 * @deprecated 03326 * Replaced by simple assignment 'Callback cb = func' 03327 */ 03328 template <typename F> 03329 MBED_DEPRECATED_SINCE("mbed-os-5.4", 03330 "Replaced by simple assignment 'Callback cb = func") 03331 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const volatile)) { 03332 this->~Callback(); 03333 new (this) Callback(f); 03334 } 03335 03336 /** Attach a static function with a bound pointer 03337 * @param obj Pointer to object to bind to function 03338 * @param func Static function to attach 03339 * @deprecated 03340 * Arguments to callback have been reordered to attach(func, arg) 03341 */ 03342 template <typename T, typename U> 03343 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03344 "Arguments to callback have been reordered to attach(func, arg)") 03345 void attach(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) { 03346 this->~Callback(); 03347 new (this) Callback(func, obj); 03348 } 03349 03350 /** Attach a static function with a bound pointer 03351 * @param obj Pointer to object to bind to function 03352 * @param func Static function to attach 03353 * @deprecated 03354 * Arguments to callback have been reordered to attach(func, arg) 03355 */ 03356 template <typename T, typename U> 03357 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03358 "Arguments to callback have been reordered to attach(func, arg)") 03359 void attach(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) { 03360 this->~Callback(); 03361 new (this) Callback(func, obj); 03362 } 03363 03364 /** Attach a static function with a bound pointer 03365 * @param obj Pointer to object to bind to function 03366 * @param func Static function to attach 03367 * @deprecated 03368 * Arguments to callback have been reordered to attach(func, arg) 03369 */ 03370 template <typename T, typename U> 03371 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03372 "Arguments to callback have been reordered to attach(func, arg)") 03373 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) { 03374 this->~Callback(); 03375 new (this) Callback(func, obj); 03376 } 03377 03378 /** Attach a static function with a bound pointer 03379 * @param obj Pointer to object to bind to function 03380 * @param func Static function to attach 03381 * @deprecated 03382 * Arguments to callback have been reordered to attach(func, arg) 03383 */ 03384 template <typename T, typename U> 03385 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03386 "Arguments to callback have been reordered to attach(func, arg)") 03387 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) { 03388 this->~Callback(); 03389 new (this) Callback(func, obj); 03390 } 03391 03392 /** Assign a callback 03393 */ 03394 Callback &operator=(const Callback &that) { 03395 if (this != &that) { 03396 this->~Callback(); 03397 new (this) Callback(that); 03398 } 03399 03400 return *this; 03401 } 03402 03403 /** Call the attached function 03404 */ 03405 R call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const { 03406 MBED_ASSERT(_ops); 03407 return _ops->call(this, a0, a1, a2, a3, a4); 03408 } 03409 03410 /** Call the attached function 03411 */ 03412 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const { 03413 return call(a0, a1, a2, a3, a4); 03414 } 03415 03416 /** Test if function has been attached 03417 */ 03418 operator bool() const { 03419 return _ops; 03420 } 03421 03422 /** Test for equality 03423 */ 03424 friend bool operator==(const Callback &l, const Callback &r) { 03425 return memcmp(&l, &r, sizeof(Callback)) == 0; 03426 } 03427 03428 /** Test for inequality 03429 */ 03430 friend bool operator!=(const Callback &l, const Callback &r) { 03431 return !(l == r); 03432 } 03433 03434 /** Static thunk for passing as C-style function 03435 * @param func Callback to call passed as void pointer 03436 * @param a0 An argument to be called with function func 03437 * @param a1 An argument to be called with function func 03438 * @param a2 An argument to be called with function func 03439 * @param a3 An argument to be called with function func 03440 * @param a4 An argument to be called with function func 03441 * @return the value as determined by func which is of 03442 * type and determined by the signiture of func 03443 */ 03444 static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) { 03445 return static_cast<Callback*>(func)->call(a0, a1, a2, a3, a4); 03446 } 03447 03448 private: 03449 // Stored as pointer to function and pointer to optional object 03450 // Function pointer is stored as union of possible function types 03451 // to garuntee proper size and alignment 03452 struct _class; 03453 union { 03454 void (*_staticfunc)(A0, A1, A2, A3, A4); 03455 void (*_boundfunc)(_class*, A0, A1, A2, A3, A4); 03456 void (_class::*_methodfunc)(A0, A1, A2, A3, A4); 03457 } _func; 03458 void *_obj; 03459 03460 // Dynamically dispatched operations 03461 const struct ops { 03462 R (*call)(const void*, A0, A1, A2, A3, A4); 03463 void (*move)(void*, const void*); 03464 void (*dtor)(void*); 03465 } *_ops; 03466 03467 // Generate operations for function object 03468 template <typename F> 03469 void generate(const F &f) { 03470 static const ops ops = { 03471 &Callback::function_call<F>, 03472 &Callback::function_move<F>, 03473 &Callback::function_dtor<F>, 03474 }; 03475 03476 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), 03477 "Type F must not exceed the size of the Callback class"); 03478 new (this) F(f); 03479 _ops = &ops; 03480 } 03481 03482 // Function attributes 03483 template <typename F> 03484 static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) { 03485 return (*(F*)p)(a0, a1, a2, a3, a4); 03486 } 03487 03488 template <typename F> 03489 static void function_move(void *d, const void *p) { 03490 new (d) F(*(F*)p); 03491 } 03492 03493 template <typename F> 03494 static void function_dtor(void *p) { 03495 ((F*)p)->~F(); 03496 } 03497 03498 // Wrappers for functions with context 03499 template <typename O, typename M> 03500 struct method_context { 03501 M method; 03502 O *obj; 03503 03504 method_context(O *obj, M method) 03505 : method(method), obj(obj) {} 03506 03507 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const { 03508 return (obj->*method)(a0, a1, a2, a3, a4); 03509 } 03510 }; 03511 03512 template <typename F, typename A> 03513 struct function_context { 03514 F func; 03515 A *arg; 03516 03517 function_context(F func, A *arg) 03518 : func(func), arg(arg) {} 03519 03520 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const { 03521 return func(arg, a0, a1, a2, a3, a4); 03522 } 03523 }; 03524 }; 03525 03526 // Internally used event type 03527 typedef Callback<void(int)> event_callback_t; 03528 03529 03530 /** Create a callback class with type infered from the arguments 03531 * 03532 * @param func Static function to attach 03533 * @return Callback with infered type 03534 */ 03535 template <typename R> 03536 Callback<R()> callback(R (*func)() = 0) { 03537 return Callback<R()>(func); 03538 } 03539 03540 /** Create a callback class with type infered from the arguments 03541 * 03542 * @param func Static function to attach 03543 * @return Callback with infered type 03544 */ 03545 template <typename R> 03546 Callback<R()> callback(const Callback<R()> &func) { 03547 return Callback<R()>(func); 03548 } 03549 03550 /** Create a callback class with type infered from the arguments 03551 * 03552 * @param obj Optional pointer to object to bind to function 03553 * @param method Member function to attach 03554 * @return Callback with infered type 03555 */ 03556 template<typename T, typename U, typename R> 03557 Callback<R()> callback(U *obj, R (T::*method)()) { 03558 return Callback<R()>(obj, method); 03559 } 03560 03561 /** Create a callback class with type infered from the arguments 03562 * 03563 * @param obj Optional pointer to object to bind to function 03564 * @param method Member function to attach 03565 * @return Callback with infered type 03566 */ 03567 template<typename T, typename U, typename R> 03568 Callback<R()> callback(const U *obj, R (T::*method)() const) { 03569 return Callback<R()>(obj, method); 03570 } 03571 03572 /** Create a callback class with type infered from the arguments 03573 * 03574 * @param obj Optional pointer to object to bind to function 03575 * @param method Member function to attach 03576 * @return Callback with infered type 03577 */ 03578 template<typename T, typename U, typename R> 03579 Callback<R()> callback(volatile U *obj, R (T::*method)() volatile) { 03580 return Callback<R()>(obj, method); 03581 } 03582 03583 /** Create a callback class with type infered from the arguments 03584 * 03585 * @param obj Optional pointer to object to bind to function 03586 * @param method Member function to attach 03587 * @return Callback with infered type 03588 */ 03589 template<typename T, typename U, typename R> 03590 Callback<R()> callback(const volatile U *obj, R (T::*method)() const volatile) { 03591 return Callback<R()>(obj, method); 03592 } 03593 03594 /** Create a callback class with type infered from the arguments 03595 * 03596 * @param func Static function to attach 03597 * @param arg Pointer argument to function 03598 * @return Callback with infered type 03599 */ 03600 template <typename T, typename U, typename R> 03601 Callback<R()> callback(R (*func)(T*), U *arg) { 03602 return Callback<R()>(func, arg); 03603 } 03604 03605 /** Create a callback class with type infered from the arguments 03606 * 03607 * @param func Static function to attach 03608 * @param arg Pointer argument to function 03609 * @return Callback with infered type 03610 */ 03611 template <typename T, typename U, typename R> 03612 Callback<R()> callback(R (*func)(const T*), const U *arg) { 03613 return Callback<R()>(func, arg); 03614 } 03615 03616 /** Create a callback class with type infered from the arguments 03617 * 03618 * @param func Static function to attach 03619 * @param arg Pointer argument to function 03620 * @return Callback with infered type 03621 */ 03622 template <typename T, typename U, typename R> 03623 Callback<R()> callback(R (*func)(volatile T*), volatile U *arg) { 03624 return Callback<R()>(func, arg); 03625 } 03626 03627 /** Create a callback class with type infered from the arguments 03628 * 03629 * @param func Static function to attach 03630 * @param arg Pointer argument to function 03631 * @return Callback with infered type 03632 */ 03633 template <typename T, typename U, typename R> 03634 Callback<R()> callback(R (*func)(const volatile T*), const volatile U *arg) { 03635 return Callback<R()>(func, arg); 03636 } 03637 03638 /** Create a callback class with type infered from the arguments 03639 * 03640 * @param obj Optional pointer to object to bind to function 03641 * @param func Static function to attach 03642 * @return Callback with infered type 03643 * @deprecated 03644 * Arguments to callback have been reordered to callback(func, arg) 03645 */ 03646 template <typename T, typename U, typename R> 03647 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03648 "Arguments to callback have been reordered to callback(func, arg)") 03649 Callback<R()> callback(U *obj, R (*func)(T*)) { 03650 return Callback<R()>(func, obj); 03651 } 03652 03653 /** Create a callback class with type infered from the arguments 03654 * 03655 * @param obj Optional pointer to object to bind to function 03656 * @param func Static function to attach 03657 * @return Callback with infered type 03658 * @deprecated 03659 * Arguments to callback have been reordered to callback(func, arg) 03660 */ 03661 template <typename T, typename U, typename R> 03662 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03663 "Arguments to callback have been reordered to callback(func, arg)") 03664 Callback<R()> callback(const U *obj, R (*func)(const T*)) { 03665 return Callback<R()>(func, obj); 03666 } 03667 03668 /** Create a callback class with type infered from the arguments 03669 * 03670 * @param obj Optional pointer to object to bind to function 03671 * @param func Static function to attach 03672 * @return Callback with infered type 03673 * @deprecated 03674 * Arguments to callback have been reordered to callback(func, arg) 03675 */ 03676 template <typename T, typename U, typename R> 03677 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03678 "Arguments to callback have been reordered to callback(func, arg)") 03679 Callback<R()> callback(volatile U *obj, R (*func)(volatile T*)) { 03680 return Callback<R()>(func, obj); 03681 } 03682 03683 /** Create a callback class with type infered from the arguments 03684 * 03685 * @param obj Optional pointer to object to bind to function 03686 * @param func Static function to attach 03687 * @return Callback with infered type 03688 * @deprecated 03689 * Arguments to callback have been reordered to callback(func, arg) 03690 */ 03691 template <typename T, typename U, typename R> 03692 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03693 "Arguments to callback have been reordered to callback(func, arg)") 03694 Callback<R()> callback(const volatile U *obj, R (*func)(const volatile T*)) { 03695 return Callback<R()>(func, obj); 03696 } 03697 03698 03699 /** Create a callback class with type infered from the arguments 03700 * 03701 * @param func Static function to attach 03702 * @return Callback with infered type 03703 */ 03704 template <typename R, typename A0> 03705 Callback<R(A0)> callback(R (*func)(A0) = 0) { 03706 return Callback<R(A0)>(func); 03707 } 03708 03709 /** Create a callback class with type infered from the arguments 03710 * 03711 * @param func Static function to attach 03712 * @return Callback with infered type 03713 */ 03714 template <typename R, typename A0> 03715 Callback<R(A0)> callback(const Callback<R(A0)> &func) { 03716 return Callback<R(A0)>(func); 03717 } 03718 03719 /** Create a callback class with type infered from the arguments 03720 * 03721 * @param obj Optional pointer to object to bind to function 03722 * @param method Member function to attach 03723 * @return Callback with infered type 03724 */ 03725 template<typename T, typename U, typename R, typename A0> 03726 Callback<R(A0)> callback(U *obj, R (T::*method)(A0)) { 03727 return Callback<R(A0)>(obj, method); 03728 } 03729 03730 /** Create a callback class with type infered from the arguments 03731 * 03732 * @param obj Optional pointer to object to bind to function 03733 * @param method Member function to attach 03734 * @return Callback with infered type 03735 */ 03736 template<typename T, typename U, typename R, typename A0> 03737 Callback<R(A0)> callback(const U *obj, R (T::*method)(A0) const) { 03738 return Callback<R(A0)>(obj, method); 03739 } 03740 03741 /** Create a callback class with type infered from the arguments 03742 * 03743 * @param obj Optional pointer to object to bind to function 03744 * @param method Member function to attach 03745 * @return Callback with infered type 03746 */ 03747 template<typename T, typename U, typename R, typename A0> 03748 Callback<R(A0)> callback(volatile U *obj, R (T::*method)(A0) volatile) { 03749 return Callback<R(A0)>(obj, method); 03750 } 03751 03752 /** Create a callback class with type infered from the arguments 03753 * 03754 * @param obj Optional pointer to object to bind to function 03755 * @param method Member function to attach 03756 * @return Callback with infered type 03757 */ 03758 template<typename T, typename U, typename R, typename A0> 03759 Callback<R(A0)> callback(const volatile U *obj, R (T::*method)(A0) const volatile) { 03760 return Callback<R(A0)>(obj, method); 03761 } 03762 03763 /** Create a callback class with type infered from the arguments 03764 * 03765 * @param func Static function to attach 03766 * @param arg Pointer argument to function 03767 * @return Callback with infered type 03768 */ 03769 template <typename T, typename U, typename R, typename A0> 03770 Callback<R(A0)> callback(R (*func)(T*, A0), U *arg) { 03771 return Callback<R(A0)>(func, arg); 03772 } 03773 03774 /** Create a callback class with type infered from the arguments 03775 * 03776 * @param func Static function to attach 03777 * @param arg Pointer argument to function 03778 * @return Callback with infered type 03779 */ 03780 template <typename T, typename U, typename R, typename A0> 03781 Callback<R(A0)> callback(R (*func)(const T*, A0), const U *arg) { 03782 return Callback<R(A0)>(func, arg); 03783 } 03784 03785 /** Create a callback class with type infered from the arguments 03786 * 03787 * @param func Static function to attach 03788 * @param arg Pointer argument to function 03789 * @return Callback with infered type 03790 */ 03791 template <typename T, typename U, typename R, typename A0> 03792 Callback<R(A0)> callback(R (*func)(volatile T*, A0), volatile U *arg) { 03793 return Callback<R(A0)>(func, arg); 03794 } 03795 03796 /** Create a callback class with type infered from the arguments 03797 * 03798 * @param func Static function to attach 03799 * @param arg Pointer argument to function 03800 * @return Callback with infered type 03801 */ 03802 template <typename T, typename U, typename R, typename A0> 03803 Callback<R(A0)> callback(R (*func)(const volatile T*, A0), const volatile U *arg) { 03804 return Callback<R(A0)>(func, arg); 03805 } 03806 03807 /** Create a callback class with type infered from the arguments 03808 * 03809 * @param obj Optional pointer to object to bind to function 03810 * @param func Static function to attach 03811 * @return Callback with infered type 03812 * @deprecated 03813 * Arguments to callback have been reordered to callback(func, arg) 03814 */ 03815 template <typename T, typename U, typename R, typename A0> 03816 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03817 "Arguments to callback have been reordered to callback(func, arg)") 03818 Callback<R(A0)> callback(U *obj, R (*func)(T*, A0)) { 03819 return Callback<R(A0)>(func, obj); 03820 } 03821 03822 /** Create a callback class with type infered from the arguments 03823 * 03824 * @param obj Optional pointer to object to bind to function 03825 * @param func Static function to attach 03826 * @return Callback with infered type 03827 * @deprecated 03828 * Arguments to callback have been reordered to callback(func, arg) 03829 */ 03830 template <typename T, typename U, typename R, typename A0> 03831 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03832 "Arguments to callback have been reordered to callback(func, arg)") 03833 Callback<R(A0)> callback(const U *obj, R (*func)(const T*, A0)) { 03834 return Callback<R(A0)>(func, obj); 03835 } 03836 03837 /** Create a callback class with type infered from the arguments 03838 * 03839 * @param obj Optional pointer to object to bind to function 03840 * @param func Static function to attach 03841 * @return Callback with infered type 03842 * @deprecated 03843 * Arguments to callback have been reordered to callback(func, arg) 03844 */ 03845 template <typename T, typename U, typename R, typename A0> 03846 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03847 "Arguments to callback have been reordered to callback(func, arg)") 03848 Callback<R(A0)> callback(volatile U *obj, R (*func)(volatile T*, A0)) { 03849 return Callback<R(A0)>(func, obj); 03850 } 03851 03852 /** Create a callback class with type infered from the arguments 03853 * 03854 * @param obj Optional pointer to object to bind to function 03855 * @param func Static function to attach 03856 * @return Callback with infered type 03857 * @deprecated 03858 * Arguments to callback have been reordered to callback(func, arg) 03859 */ 03860 template <typename T, typename U, typename R, typename A0> 03861 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03862 "Arguments to callback have been reordered to callback(func, arg)") 03863 Callback<R(A0)> callback(const volatile U *obj, R (*func)(const volatile T*, A0)) { 03864 return Callback<R(A0)>(func, obj); 03865 } 03866 03867 03868 /** Create a callback class with type infered from the arguments 03869 * 03870 * @param func Static function to attach 03871 * @return Callback with infered type 03872 */ 03873 template <typename R, typename A0, typename A1> 03874 Callback<R(A0, A1)> callback(R (*func)(A0, A1) = 0) { 03875 return Callback<R(A0, A1)>(func); 03876 } 03877 03878 /** Create a callback class with type infered from the arguments 03879 * 03880 * @param func Static function to attach 03881 * @return Callback with infered type 03882 */ 03883 template <typename R, typename A0, typename A1> 03884 Callback<R(A0, A1)> callback(const Callback<R(A0, A1)> &func) { 03885 return Callback<R(A0, A1)>(func); 03886 } 03887 03888 /** Create a callback class with type infered from the arguments 03889 * 03890 * @param obj Optional pointer to object to bind to function 03891 * @param method Member function to attach 03892 * @return Callback with infered type 03893 */ 03894 template<typename T, typename U, typename R, typename A0, typename A1> 03895 Callback<R(A0, A1)> callback(U *obj, R (T::*method)(A0, A1)) { 03896 return Callback<R(A0, A1)>(obj, method); 03897 } 03898 03899 /** Create a callback class with type infered from the arguments 03900 * 03901 * @param obj Optional pointer to object to bind to function 03902 * @param method Member function to attach 03903 * @return Callback with infered type 03904 */ 03905 template<typename T, typename U, typename R, typename A0, typename A1> 03906 Callback<R(A0, A1)> callback(const U *obj, R (T::*method)(A0, A1) const) { 03907 return Callback<R(A0, A1)>(obj, method); 03908 } 03909 03910 /** Create a callback class with type infered from the arguments 03911 * 03912 * @param obj Optional pointer to object to bind to function 03913 * @param method Member function to attach 03914 * @return Callback with infered type 03915 */ 03916 template<typename T, typename U, typename R, typename A0, typename A1> 03917 Callback<R(A0, A1)> callback(volatile U *obj, R (T::*method)(A0, A1) volatile) { 03918 return Callback<R(A0, A1)>(obj, method); 03919 } 03920 03921 /** Create a callback class with type infered from the arguments 03922 * 03923 * @param obj Optional pointer to object to bind to function 03924 * @param method Member function to attach 03925 * @return Callback with infered type 03926 */ 03927 template<typename T, typename U, typename R, typename A0, typename A1> 03928 Callback<R(A0, A1)> callback(const volatile U *obj, R (T::*method)(A0, A1) const volatile) { 03929 return Callback<R(A0, A1)>(obj, method); 03930 } 03931 03932 /** Create a callback class with type infered from the arguments 03933 * 03934 * @param func Static function to attach 03935 * @param arg Pointer argument to function 03936 * @return Callback with infered type 03937 */ 03938 template <typename T, typename U, typename R, typename A0, typename A1> 03939 Callback<R(A0, A1)> callback(R (*func)(T*, A0, A1), U *arg) { 03940 return Callback<R(A0, A1)>(func, arg); 03941 } 03942 03943 /** Create a callback class with type infered from the arguments 03944 * 03945 * @param func Static function to attach 03946 * @param arg Pointer argument to function 03947 * @return Callback with infered type 03948 */ 03949 template <typename T, typename U, typename R, typename A0, typename A1> 03950 Callback<R(A0, A1)> callback(R (*func)(const T*, A0, A1), const U *arg) { 03951 return Callback<R(A0, A1)>(func, arg); 03952 } 03953 03954 /** Create a callback class with type infered from the arguments 03955 * 03956 * @param func Static function to attach 03957 * @param arg Pointer argument to function 03958 * @return Callback with infered type 03959 */ 03960 template <typename T, typename U, typename R, typename A0, typename A1> 03961 Callback<R(A0, A1)> callback(R (*func)(volatile T*, A0, A1), volatile U *arg) { 03962 return Callback<R(A0, A1)>(func, arg); 03963 } 03964 03965 /** Create a callback class with type infered from the arguments 03966 * 03967 * @param func Static function to attach 03968 * @param arg Pointer argument to function 03969 * @return Callback with infered type 03970 */ 03971 template <typename T, typename U, typename R, typename A0, typename A1> 03972 Callback<R(A0, A1)> callback(R (*func)(const volatile T*, A0, A1), const volatile U *arg) { 03973 return Callback<R(A0, A1)>(func, arg); 03974 } 03975 03976 /** Create a callback class with type infered from the arguments 03977 * 03978 * @param obj Optional pointer to object to bind to function 03979 * @param func Static function to attach 03980 * @return Callback with infered type 03981 * @deprecated 03982 * Arguments to callback have been reordered to callback(func, arg) 03983 */ 03984 template <typename T, typename U, typename R, typename A0, typename A1> 03985 MBED_DEPRECATED_SINCE("mbed-os-5.1", 03986 "Arguments to callback have been reordered to callback(func, arg)") 03987 Callback<R(A0, A1)> callback(U *obj, R (*func)(T*, A0, A1)) { 03988 return Callback<R(A0, A1)>(func, obj); 03989 } 03990 03991 /** Create a callback class with type infered from the arguments 03992 * 03993 * @param obj Optional pointer to object to bind to function 03994 * @param func Static function to attach 03995 * @return Callback with infered type 03996 * @deprecated 03997 * Arguments to callback have been reordered to callback(func, arg) 03998 */ 03999 template <typename T, typename U, typename R, typename A0, typename A1> 04000 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04001 "Arguments to callback have been reordered to callback(func, arg)") 04002 Callback<R(A0, A1)> callback(const U *obj, R (*func)(const T*, A0, A1)) { 04003 return Callback<R(A0, A1)>(func, obj); 04004 } 04005 04006 /** Create a callback class with type infered from the arguments 04007 * 04008 * @param obj Optional pointer to object to bind to function 04009 * @param func Static function to attach 04010 * @return Callback with infered type 04011 * @deprecated 04012 * Arguments to callback have been reordered to callback(func, arg) 04013 */ 04014 template <typename T, typename U, typename R, typename A0, typename A1> 04015 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04016 "Arguments to callback have been reordered to callback(func, arg)") 04017 Callback<R(A0, A1)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1)) { 04018 return Callback<R(A0, A1)>(func, obj); 04019 } 04020 04021 /** Create a callback class with type infered from the arguments 04022 * 04023 * @param obj Optional pointer to object to bind to function 04024 * @param func Static function to attach 04025 * @return Callback with infered type 04026 * @deprecated 04027 * Arguments to callback have been reordered to callback(func, arg) 04028 */ 04029 template <typename T, typename U, typename R, typename A0, typename A1> 04030 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04031 "Arguments to callback have been reordered to callback(func, arg)") 04032 Callback<R(A0, A1)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) { 04033 return Callback<R(A0, A1)>(func, obj); 04034 } 04035 04036 04037 /** Create a callback class with type infered from the arguments 04038 * 04039 * @param func Static function to attach 04040 * @return Callback with infered type 04041 */ 04042 template <typename R, typename A0, typename A1, typename A2> 04043 Callback<R(A0, A1, A2)> callback(R (*func)(A0, A1, A2) = 0) { 04044 return Callback<R(A0, A1, A2)>(func); 04045 } 04046 04047 /** Create a callback class with type infered from the arguments 04048 * 04049 * @param func Static function to attach 04050 * @return Callback with infered type 04051 */ 04052 template <typename R, typename A0, typename A1, typename A2> 04053 Callback<R(A0, A1, A2)> callback(const Callback<R(A0, A1, A2)> &func) { 04054 return Callback<R(A0, A1, A2)>(func); 04055 } 04056 04057 /** Create a callback class with type infered from the arguments 04058 * 04059 * @param obj Optional pointer to object to bind to function 04060 * @param method Member function to attach 04061 * @return Callback with infered type 04062 */ 04063 template<typename T, typename U, typename R, typename A0, typename A1, typename A2> 04064 Callback<R(A0, A1, A2)> callback(U *obj, R (T::*method)(A0, A1, A2)) { 04065 return Callback<R(A0, A1, A2)>(obj, method); 04066 } 04067 04068 /** Create a callback class with type infered from the arguments 04069 * 04070 * @param obj Optional pointer to object to bind to function 04071 * @param method Member function to attach 04072 * @return Callback with infered type 04073 */ 04074 template<typename T, typename U, typename R, typename A0, typename A1, typename A2> 04075 Callback<R(A0, A1, A2)> callback(const U *obj, R (T::*method)(A0, A1, A2) const) { 04076 return Callback<R(A0, A1, A2)>(obj, method); 04077 } 04078 04079 /** Create a callback class with type infered from the arguments 04080 * 04081 * @param obj Optional pointer to object to bind to function 04082 * @param method Member function to attach 04083 * @return Callback with infered type 04084 */ 04085 template<typename T, typename U, typename R, typename A0, typename A1, typename A2> 04086 Callback<R(A0, A1, A2)> callback(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) { 04087 return Callback<R(A0, A1, A2)>(obj, method); 04088 } 04089 04090 /** Create a callback class with type infered from the arguments 04091 * 04092 * @param obj Optional pointer to object to bind to function 04093 * @param method Member function to attach 04094 * @return Callback with infered type 04095 */ 04096 template<typename T, typename U, typename R, typename A0, typename A1, typename A2> 04097 Callback<R(A0, A1, A2)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) { 04098 return Callback<R(A0, A1, A2)>(obj, method); 04099 } 04100 04101 /** Create a callback class with type infered from the arguments 04102 * 04103 * @param func Static function to attach 04104 * @param arg Pointer argument to function 04105 * @return Callback with infered type 04106 */ 04107 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04108 Callback<R(A0, A1, A2)> callback(R (*func)(T*, A0, A1, A2), U *arg) { 04109 return Callback<R(A0, A1, A2)>(func, arg); 04110 } 04111 04112 /** Create a callback class with type infered from the arguments 04113 * 04114 * @param func Static function to attach 04115 * @param arg Pointer argument to function 04116 * @return Callback with infered type 04117 */ 04118 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04119 Callback<R(A0, A1, A2)> callback(R (*func)(const T*, A0, A1, A2), const U *arg) { 04120 return Callback<R(A0, A1, A2)>(func, arg); 04121 } 04122 04123 /** Create a callback class with type infered from the arguments 04124 * 04125 * @param func Static function to attach 04126 * @param arg Pointer argument to function 04127 * @return Callback with infered type 04128 */ 04129 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04130 Callback<R(A0, A1, A2)> callback(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) { 04131 return Callback<R(A0, A1, A2)>(func, arg); 04132 } 04133 04134 /** Create a callback class with type infered from the arguments 04135 * 04136 * @param func Static function to attach 04137 * @param arg Pointer argument to function 04138 * @return Callback with infered type 04139 */ 04140 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04141 Callback<R(A0, A1, A2)> callback(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) { 04142 return Callback<R(A0, A1, A2)>(func, arg); 04143 } 04144 04145 /** Create a callback class with type infered from the arguments 04146 * 04147 * @param obj Optional pointer to object to bind to function 04148 * @param func Static function to attach 04149 * @return Callback with infered type 04150 * @deprecated 04151 * Arguments to callback have been reordered to callback(func, arg) 04152 */ 04153 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04154 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04155 "Arguments to callback have been reordered to callback(func, arg)") 04156 Callback<R(A0, A1, A2)> callback(U *obj, R (*func)(T*, A0, A1, A2)) { 04157 return Callback<R(A0, A1, A2)>(func, obj); 04158 } 04159 04160 /** Create a callback class with type infered from the arguments 04161 * 04162 * @param obj Optional pointer to object to bind to function 04163 * @param func Static function to attach 04164 * @return Callback with infered type 04165 * @deprecated 04166 * Arguments to callback have been reordered to callback(func, arg) 04167 */ 04168 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04169 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04170 "Arguments to callback have been reordered to callback(func, arg)") 04171 Callback<R(A0, A1, A2)> callback(const U *obj, R (*func)(const T*, A0, A1, A2)) { 04172 return Callback<R(A0, A1, A2)>(func, obj); 04173 } 04174 04175 /** Create a callback class with type infered from the arguments 04176 * 04177 * @param obj Optional pointer to object to bind to function 04178 * @param func Static function to attach 04179 * @return Callback with infered type 04180 * @deprecated 04181 * Arguments to callback have been reordered to callback(func, arg) 04182 */ 04183 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04184 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04185 "Arguments to callback have been reordered to callback(func, arg)") 04186 Callback<R(A0, A1, A2)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) { 04187 return Callback<R(A0, A1, A2)>(func, obj); 04188 } 04189 04190 /** Create a callback class with type infered from the arguments 04191 * 04192 * @param obj Optional pointer to object to bind to function 04193 * @param func Static function to attach 04194 * @return Callback with infered type 04195 * @deprecated 04196 * Arguments to callback have been reordered to callback(func, arg) 04197 */ 04198 template <typename T, typename U, typename R, typename A0, typename A1, typename A2> 04199 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04200 "Arguments to callback have been reordered to callback(func, arg)") 04201 Callback<R(A0, A1, A2)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) { 04202 return Callback<R(A0, A1, A2)>(func, obj); 04203 } 04204 04205 04206 /** Create a callback class with type infered from the arguments 04207 * 04208 * @param func Static function to attach 04209 * @return Callback with infered type 04210 */ 04211 template <typename R, typename A0, typename A1, typename A2, typename A3> 04212 Callback<R(A0, A1, A2, A3)> callback(R (*func)(A0, A1, A2, A3) = 0) { 04213 return Callback<R(A0, A1, A2, A3)>(func); 04214 } 04215 04216 /** Create a callback class with type infered from the arguments 04217 * 04218 * @param func Static function to attach 04219 * @return Callback with infered type 04220 */ 04221 template <typename R, typename A0, typename A1, typename A2, typename A3> 04222 Callback<R(A0, A1, A2, A3)> callback(const Callback<R(A0, A1, A2, A3)> &func) { 04223 return Callback<R(A0, A1, A2, A3)>(func); 04224 } 04225 04226 /** Create a callback class with type infered from the arguments 04227 * 04228 * @param obj Optional pointer to object to bind to function 04229 * @param method Member function to attach 04230 * @return Callback with infered type 04231 */ 04232 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04233 Callback<R(A0, A1, A2, A3)> callback(U *obj, R (T::*method)(A0, A1, A2, A3)) { 04234 return Callback<R(A0, A1, A2, A3)>(obj, method); 04235 } 04236 04237 /** Create a callback class with type infered from the arguments 04238 * 04239 * @param obj Optional pointer to object to bind to function 04240 * @param method Member function to attach 04241 * @return Callback with infered type 04242 */ 04243 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04244 Callback<R(A0, A1, A2, A3)> callback(const U *obj, R (T::*method)(A0, A1, A2, A3) const) { 04245 return Callback<R(A0, A1, A2, A3)>(obj, method); 04246 } 04247 04248 /** Create a callback class with type infered from the arguments 04249 * 04250 * @param obj Optional pointer to object to bind to function 04251 * @param method Member function to attach 04252 * @return Callback with infered type 04253 */ 04254 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04255 Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) { 04256 return Callback<R(A0, A1, A2, A3)>(obj, method); 04257 } 04258 04259 /** Create a callback class with type infered from the arguments 04260 * 04261 * @param obj Optional pointer to object to bind to function 04262 * @param method Member function to attach 04263 * @return Callback with infered type 04264 */ 04265 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04266 Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) { 04267 return Callback<R(A0, A1, A2, A3)>(obj, method); 04268 } 04269 04270 /** Create a callback class with type infered from the arguments 04271 * 04272 * @param func Static function to attach 04273 * @param arg Pointer argument to function 04274 * @return Callback with infered type 04275 */ 04276 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04277 Callback<R(A0, A1, A2, A3)> callback(R (*func)(T*, A0, A1, A2, A3), U *arg) { 04278 return Callback<R(A0, A1, A2, A3)>(func, arg); 04279 } 04280 04281 /** Create a callback class with type infered from the arguments 04282 * 04283 * @param func Static function to attach 04284 * @param arg Pointer argument to function 04285 * @return Callback with infered type 04286 */ 04287 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04288 Callback<R(A0, A1, A2, A3)> callback(R (*func)(const T*, A0, A1, A2, A3), const U *arg) { 04289 return Callback<R(A0, A1, A2, A3)>(func, arg); 04290 } 04291 04292 /** Create a callback class with type infered from the arguments 04293 * 04294 * @param func Static function to attach 04295 * @param arg Pointer argument to function 04296 * @return Callback with infered type 04297 */ 04298 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04299 Callback<R(A0, A1, A2, A3)> callback(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) { 04300 return Callback<R(A0, A1, A2, A3)>(func, arg); 04301 } 04302 04303 /** Create a callback class with type infered from the arguments 04304 * 04305 * @param func Static function to attach 04306 * @param arg Pointer argument to function 04307 * @return Callback with infered type 04308 */ 04309 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04310 Callback<R(A0, A1, A2, A3)> callback(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) { 04311 return Callback<R(A0, A1, A2, A3)>(func, arg); 04312 } 04313 04314 /** Create a callback class with type infered from the arguments 04315 * 04316 * @param obj Optional pointer to object to bind to function 04317 * @param func Static function to attach 04318 * @return Callback with infered type 04319 * @deprecated 04320 * Arguments to callback have been reordered to callback(func, arg) 04321 */ 04322 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04323 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04324 "Arguments to callback have been reordered to callback(func, arg)") 04325 Callback<R(A0, A1, A2, A3)> callback(U *obj, R (*func)(T*, A0, A1, A2, A3)) { 04326 return Callback<R(A0, A1, A2, A3)>(func, obj); 04327 } 04328 04329 /** Create a callback class with type infered from the arguments 04330 * 04331 * @param obj Optional pointer to object to bind to function 04332 * @param func Static function to attach 04333 * @return Callback with infered type 04334 * @deprecated 04335 * Arguments to callback have been reordered to callback(func, arg) 04336 */ 04337 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04338 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04339 "Arguments to callback have been reordered to callback(func, arg)") 04340 Callback<R(A0, A1, A2, A3)> callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) { 04341 return Callback<R(A0, A1, A2, A3)>(func, obj); 04342 } 04343 04344 /** Create a callback class with type infered from the arguments 04345 * 04346 * @param obj Optional pointer to object to bind to function 04347 * @param func Static function to attach 04348 * @return Callback with infered type 04349 * @deprecated 04350 * Arguments to callback have been reordered to callback(func, arg) 04351 */ 04352 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04353 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04354 "Arguments to callback have been reordered to callback(func, arg)") 04355 Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) { 04356 return Callback<R(A0, A1, A2, A3)>(func, obj); 04357 } 04358 04359 /** Create a callback class with type infered from the arguments 04360 * 04361 * @param obj Optional pointer to object to bind to function 04362 * @param func Static function to attach 04363 * @return Callback with infered type 04364 * @deprecated 04365 * Arguments to callback have been reordered to callback(func, arg) 04366 */ 04367 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> 04368 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04369 "Arguments to callback have been reordered to callback(func, arg)") 04370 Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) { 04371 return Callback<R(A0, A1, A2, A3)>(func, obj); 04372 } 04373 04374 04375 /** Create a callback class with type infered from the arguments 04376 * 04377 * @param func Static function to attach 04378 * @return Callback with infered type 04379 */ 04380 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04381 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(A0, A1, A2, A3, A4) = 0) { 04382 return Callback<R(A0, A1, A2, A3, A4)>(func); 04383 } 04384 04385 /** Create a callback class with type infered from the arguments 04386 * 04387 * @param func Static function to attach 04388 * @return Callback with infered type 04389 */ 04390 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04391 Callback<R(A0, A1, A2, A3, A4)> callback(const Callback<R(A0, A1, A2, A3, A4)> &func) { 04392 return Callback<R(A0, A1, A2, A3, A4)>(func); 04393 } 04394 04395 /** Create a callback class with type infered from the arguments 04396 * 04397 * @param obj Optional pointer to object to bind to function 04398 * @param method Member function to attach 04399 * @return Callback with infered type 04400 */ 04401 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04402 Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) { 04403 return Callback<R(A0, A1, A2, A3, A4)>(obj, method); 04404 } 04405 04406 /** Create a callback class with type infered from the arguments 04407 * 04408 * @param obj Optional pointer to object to bind to function 04409 * @param method Member function to attach 04410 * @return Callback with infered type 04411 */ 04412 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04413 Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) { 04414 return Callback<R(A0, A1, A2, A3, A4)>(obj, method); 04415 } 04416 04417 /** Create a callback class with type infered from the arguments 04418 * 04419 * @param obj Optional pointer to object to bind to function 04420 * @param method Member function to attach 04421 * @return Callback with infered type 04422 */ 04423 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04424 Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) { 04425 return Callback<R(A0, A1, A2, A3, A4)>(obj, method); 04426 } 04427 04428 /** Create a callback class with type infered from the arguments 04429 * 04430 * @param obj Optional pointer to object to bind to function 04431 * @param method Member function to attach 04432 * @return Callback with infered type 04433 */ 04434 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04435 Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) { 04436 return Callback<R(A0, A1, A2, A3, A4)>(obj, method); 04437 } 04438 04439 /** Create a callback class with type infered from the arguments 04440 * 04441 * @param func Static function to attach 04442 * @param arg Pointer argument to function 04443 * @return Callback with infered type 04444 */ 04445 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04446 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) { 04447 return Callback<R(A0, A1, A2, A3, A4)>(func, arg); 04448 } 04449 04450 /** Create a callback class with type infered from the arguments 04451 * 04452 * @param func Static function to attach 04453 * @param arg Pointer argument to function 04454 * @return Callback with infered type 04455 */ 04456 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04457 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) { 04458 return Callback<R(A0, A1, A2, A3, A4)>(func, arg); 04459 } 04460 04461 /** Create a callback class with type infered from the arguments 04462 * 04463 * @param func Static function to attach 04464 * @param arg Pointer argument to function 04465 * @return Callback with infered type 04466 */ 04467 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04468 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) { 04469 return Callback<R(A0, A1, A2, A3, A4)>(func, arg); 04470 } 04471 04472 /** Create a callback class with type infered from the arguments 04473 * 04474 * @param func Static function to attach 04475 * @param arg Pointer argument to function 04476 * @return Callback with infered type 04477 */ 04478 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04479 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) { 04480 return Callback<R(A0, A1, A2, A3, A4)>(func, arg); 04481 } 04482 04483 /** Create a callback class with type infered from the arguments 04484 * 04485 * @param obj Optional pointer to object to bind to function 04486 * @param func Static function to attach 04487 * @return Callback with infered type 04488 * @deprecated 04489 * Arguments to callback have been reordered to callback(func, arg) 04490 */ 04491 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04492 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04493 "Arguments to callback have been reordered to callback(func, arg)") 04494 Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) { 04495 return Callback<R(A0, A1, A2, A3, A4)>(func, obj); 04496 } 04497 04498 /** Create a callback class with type infered from the arguments 04499 * 04500 * @param obj Optional pointer to object to bind to function 04501 * @param func Static function to attach 04502 * @return Callback with infered type 04503 * @deprecated 04504 * Arguments to callback have been reordered to callback(func, arg) 04505 */ 04506 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04507 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04508 "Arguments to callback have been reordered to callback(func, arg)") 04509 Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) { 04510 return Callback<R(A0, A1, A2, A3, A4)>(func, obj); 04511 } 04512 04513 /** Create a callback class with type infered from the arguments 04514 * 04515 * @param obj Optional pointer to object to bind to function 04516 * @param func Static function to attach 04517 * @return Callback with infered type 04518 * @deprecated 04519 * Arguments to callback have been reordered to callback(func, arg) 04520 */ 04521 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04522 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04523 "Arguments to callback have been reordered to callback(func, arg)") 04524 Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) { 04525 return Callback<R(A0, A1, A2, A3, A4)>(func, obj); 04526 } 04527 04528 /** Create a callback class with type infered from the arguments 04529 * 04530 * @param obj Optional pointer to object to bind to function 04531 * @param func Static function to attach 04532 * @return Callback with infered type 04533 * @deprecated 04534 * Arguments to callback have been reordered to callback(func, arg) 04535 */ 04536 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> 04537 MBED_DEPRECATED_SINCE("mbed-os-5.1", 04538 "Arguments to callback have been reordered to callback(func, arg)") 04539 Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) { 04540 return Callback<R(A0, A1, A2, A3, A4)>(func, obj); 04541 } 04542 04543 04544 } // namespace mbed 04545 04546 #endif
Generated on Tue Jul 12 2022 16:21:28 by
