The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
<>
Date:
Tue Mar 14 16:20:51 2017 +0000
Revision:
138:093f2bd7b9eb
Parent:
130:d75b3fe1f5cb
Child:
145:64910690c574
Release 138 of the mbed library

Ports for Upcoming Targets


Fixes and Changes

3716: fix for issue #3715: correction in startup files for ARM and IAR, alignment of system_stm32f429xx.c files https://github.com/ARMmbed/mbed-os/pull/3716
3741: STM32 remove warning in hal_tick_32b.c file https://github.com/ARMmbed/mbed-os/pull/3741
3780: STM32L4 : Fix GPIO G port compatibility https://github.com/ARMmbed/mbed-os/pull/3780
3831: NCS36510: SPISLAVE enabled (Conflict resolved) https://github.com/ARMmbed/mbed-os/pull/3831
3836: Allow to redefine nRF's PSTORAGE_NUM_OF_PAGES outside of the mbed-os https://github.com/ARMmbed/mbed-os/pull/3836
3840: STM32: gpio SPEED - always set High Speed by default https://github.com/ARMmbed/mbed-os/pull/3840
3844: STM32 GPIO: Typo correction. Update comment (GPIO_IP_WITHOUT_BRR) https://github.com/ARMmbed/mbed-os/pull/3844
3850: STM32: change spi error to debug warning https://github.com/ARMmbed/mbed-os/pull/3850
3860: Define GPIO_IP_WITHOUT_BRR for xDot platform https://github.com/ARMmbed/mbed-os/pull/3860
3880: DISCO_F469NI: allow the use of CAN2 instance when CAN1 is not activated https://github.com/ARMmbed/mbed-os/pull/3880
3795: Fix pwm period calc https://github.com/ARMmbed/mbed-os/pull/3795
3828: STM32 CAN API: correct format and type https://github.com/ARMmbed/mbed-os/pull/3828
3842: TARGET_NRF: corrected spi_init() to properly handle re-initialization https://github.com/ARMmbed/mbed-os/pull/3842
3843: STM32L476xG: set APB2 clock to 80MHz (instead of 40MHz) https://github.com/ARMmbed/mbed-os/pull/3843
3879: NUCLEO_F446ZE: Add missing AnalogIn pins on PF_3, PF_5 and PF_10. https://github.com/ARMmbed/mbed-os/pull/3879
3902: Fix heap and stack size for NUCLEO_F746ZG https://github.com/ARMmbed/mbed-os/pull/3902
3829: can_write(): return error code when no tx mailboxes are available https://github.com/ARMmbed/mbed-os/pull/3829

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 128:9bcdf88f62b0 1 /* mbed Microcontroller Library
<> 128:9bcdf88f62b0 2 * Copyright (c) 2006-2015 ARM Limited
<> 128:9bcdf88f62b0 3 *
<> 128:9bcdf88f62b0 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 128:9bcdf88f62b0 5 * you may not use this file except in compliance with the License.
<> 128:9bcdf88f62b0 6 * You may obtain a copy of the License at
<> 128:9bcdf88f62b0 7 *
<> 128:9bcdf88f62b0 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 128:9bcdf88f62b0 9 *
<> 128:9bcdf88f62b0 10 * Unless required by applicable law or agreed to in writing, software
<> 128:9bcdf88f62b0 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 128:9bcdf88f62b0 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 128:9bcdf88f62b0 13 * See the License for the specific language governing permissions and
<> 128:9bcdf88f62b0 14 * limitations under the License.
<> 128:9bcdf88f62b0 15 */
<> 128:9bcdf88f62b0 16 #ifndef MBED_CALLBACK_H
<> 128:9bcdf88f62b0 17 #define MBED_CALLBACK_H
<> 128:9bcdf88f62b0 18
<> 128:9bcdf88f62b0 19 #include <string.h>
<> 128:9bcdf88f62b0 20 #include <stdint.h>
<> 128:9bcdf88f62b0 21 #include <new>
<> 128:9bcdf88f62b0 22 #include "platform/mbed_assert.h"
<> 138:093f2bd7b9eb 23 #include "platform/mbed_toolchain.h"
<> 128:9bcdf88f62b0 24
<> 128:9bcdf88f62b0 25 namespace mbed {
<> 128:9bcdf88f62b0 26 /** \addtogroup platform */
<> 128:9bcdf88f62b0 27 /** @{*/
<> 128:9bcdf88f62b0 28
<> 128:9bcdf88f62b0 29
<> 128:9bcdf88f62b0 30 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 31 *
<> 128:9bcdf88f62b0 32 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 33 */
<> 128:9bcdf88f62b0 34 template <typename F>
<> 128:9bcdf88f62b0 35 class Callback;
<> 128:9bcdf88f62b0 36
<> 128:9bcdf88f62b0 37 // Internal sfinae declarations
<> 128:9bcdf88f62b0 38 //
<> 128:9bcdf88f62b0 39 // These are used to eliminate overloads based on type attributes
<> 128:9bcdf88f62b0 40 // 1. Does a function object have a call operator
<> 128:9bcdf88f62b0 41 // 2. Does a function object fit in the available storage
<> 128:9bcdf88f62b0 42 //
<> 128:9bcdf88f62b0 43 // These eliminations are handled cleanly by the compiler and avoid
<> 128:9bcdf88f62b0 44 // massive and misleading error messages when confronted with an
<> 128:9bcdf88f62b0 45 // invalid type (or worse, runtime failures)
<> 128:9bcdf88f62b0 46 namespace detail {
<> 128:9bcdf88f62b0 47 struct nil {};
<> 128:9bcdf88f62b0 48
<> 128:9bcdf88f62b0 49 template <bool B, typename R = nil>
<> 128:9bcdf88f62b0 50 struct enable_if { typedef R type; };
<> 128:9bcdf88f62b0 51
<> 128:9bcdf88f62b0 52 template <typename R>
<> 128:9bcdf88f62b0 53 struct enable_if<false, R> {};
<> 128:9bcdf88f62b0 54
<> 128:9bcdf88f62b0 55 template <typename M, M>
<> 128:9bcdf88f62b0 56 struct is_type {
<> 128:9bcdf88f62b0 57 static const bool value = true;
<> 128:9bcdf88f62b0 58 };
<> 128:9bcdf88f62b0 59 }
<> 128:9bcdf88f62b0 60
<> 128:9bcdf88f62b0 61 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 62 *
<> 128:9bcdf88f62b0 63 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 64 */
<> 128:9bcdf88f62b0 65 template <typename R>
<> 128:9bcdf88f62b0 66 class Callback<R()> {
<> 128:9bcdf88f62b0 67 public:
<> 128:9bcdf88f62b0 68 /** Create a Callback with a static function
<> 128:9bcdf88f62b0 69 * @param func Static function to attach
<> 128:9bcdf88f62b0 70 */
<> 128:9bcdf88f62b0 71 Callback(R (*func)() = 0) {
<> 128:9bcdf88f62b0 72 if (!func) {
<> 128:9bcdf88f62b0 73 _ops = 0;
<> 128:9bcdf88f62b0 74 } else {
<> 128:9bcdf88f62b0 75 generate(func);
<> 128:9bcdf88f62b0 76 }
<> 128:9bcdf88f62b0 77 }
<> 128:9bcdf88f62b0 78
<> 128:9bcdf88f62b0 79 /** Attach a Callback
<> 128:9bcdf88f62b0 80 * @param func The Callback to attach
<> 128:9bcdf88f62b0 81 */
<> 128:9bcdf88f62b0 82 Callback(const Callback<R()> &func) {
<> 128:9bcdf88f62b0 83 if (func._ops) {
<> 128:9bcdf88f62b0 84 func._ops->move(this, &func);
<> 128:9bcdf88f62b0 85 }
<> 128:9bcdf88f62b0 86 _ops = func._ops;
<> 128:9bcdf88f62b0 87 }
<> 128:9bcdf88f62b0 88
<> 128:9bcdf88f62b0 89 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 90 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 91 * @param method Member function to attach
<> 128:9bcdf88f62b0 92 */
<> 130:d75b3fe1f5cb 93 template<typename T, typename U>
<> 130:d75b3fe1f5cb 94 Callback(U *obj, R (T::*method)()) {
<> 128:9bcdf88f62b0 95 generate(method_context<T, R (T::*)()>(obj, method));
<> 128:9bcdf88f62b0 96 }
<> 128:9bcdf88f62b0 97
<> 128:9bcdf88f62b0 98 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 99 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 100 * @param method Member function to attach
<> 128:9bcdf88f62b0 101 */
<> 130:d75b3fe1f5cb 102 template<typename T, typename U>
<> 130:d75b3fe1f5cb 103 Callback(const U *obj, R (T::*method)() const) {
<> 128:9bcdf88f62b0 104 generate(method_context<const T, R (T::*)() const>(obj, method));
<> 128:9bcdf88f62b0 105 }
<> 128:9bcdf88f62b0 106
<> 128:9bcdf88f62b0 107 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 108 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 109 * @param method Member function to attach
<> 128:9bcdf88f62b0 110 */
<> 130:d75b3fe1f5cb 111 template<typename T, typename U>
<> 130:d75b3fe1f5cb 112 Callback(volatile U *obj, R (T::*method)() volatile) {
<> 128:9bcdf88f62b0 113 generate(method_context<volatile T, R (T::*)() volatile>(obj, method));
<> 128:9bcdf88f62b0 114 }
<> 128:9bcdf88f62b0 115
<> 128:9bcdf88f62b0 116 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 117 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 118 * @param method Member function to attach
<> 128:9bcdf88f62b0 119 */
<> 130:d75b3fe1f5cb 120 template<typename T, typename U>
<> 130:d75b3fe1f5cb 121 Callback(const volatile U *obj, R (T::*method)() const volatile) {
<> 128:9bcdf88f62b0 122 generate(method_context<const volatile T, R (T::*)() const volatile>(obj, method));
<> 128:9bcdf88f62b0 123 }
<> 128:9bcdf88f62b0 124
<> 128:9bcdf88f62b0 125 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 126 * @param func Static function to attach
<> 128:9bcdf88f62b0 127 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 128 */
<> 130:d75b3fe1f5cb 129 template<typename T, typename U>
<> 130:d75b3fe1f5cb 130 Callback(R (*func)(T*), U *arg) {
<> 128:9bcdf88f62b0 131 generate(function_context<R (*)(T*), T>(func, arg));
<> 128:9bcdf88f62b0 132 }
<> 128:9bcdf88f62b0 133
<> 128:9bcdf88f62b0 134 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 135 * @param func Static function to attach
<> 128:9bcdf88f62b0 136 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 137 */
<> 130:d75b3fe1f5cb 138 template<typename T, typename U>
<> 130:d75b3fe1f5cb 139 Callback(R (*func)(const T*), const U *arg) {
<> 128:9bcdf88f62b0 140 generate(function_context<R (*)(const T*), const T>(func, arg));
<> 128:9bcdf88f62b0 141 }
<> 128:9bcdf88f62b0 142
<> 128:9bcdf88f62b0 143 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 144 * @param func Static function to attach
<> 128:9bcdf88f62b0 145 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 146 */
<> 130:d75b3fe1f5cb 147 template<typename T, typename U>
<> 130:d75b3fe1f5cb 148 Callback(R (*func)(volatile T*), volatile U *arg) {
<> 128:9bcdf88f62b0 149 generate(function_context<R (*)(volatile T*), volatile T>(func, arg));
<> 128:9bcdf88f62b0 150 }
<> 128:9bcdf88f62b0 151
<> 128:9bcdf88f62b0 152 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 153 * @param func Static function to attach
<> 128:9bcdf88f62b0 154 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 155 */
<> 130:d75b3fe1f5cb 156 template<typename T, typename U>
<> 130:d75b3fe1f5cb 157 Callback(R (*func)(const volatile T*), const volatile U *arg) {
<> 128:9bcdf88f62b0 158 generate(function_context<R (*)(const volatile T*), const volatile T>(func, arg));
<> 128:9bcdf88f62b0 159 }
<> 128:9bcdf88f62b0 160
<> 128:9bcdf88f62b0 161 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 162 * @param func Function object to attach
<> 128:9bcdf88f62b0 163 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 164 */
<> 128:9bcdf88f62b0 165 template <typename F>
<> 128:9bcdf88f62b0 166 Callback(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 167 detail::is_type<R (F::*)(), &F::operator()>::value &&
<> 128:9bcdf88f62b0 168 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 169 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 170 generate(f);
<> 128:9bcdf88f62b0 171 }
<> 128:9bcdf88f62b0 172
<> 128:9bcdf88f62b0 173 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 174 * @param func Function object to attach
<> 128:9bcdf88f62b0 175 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 176 */
<> 128:9bcdf88f62b0 177 template <typename F>
<> 128:9bcdf88f62b0 178 Callback(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 179 detail::is_type<R (F::*)() const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 180 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 181 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 182 generate(f);
<> 128:9bcdf88f62b0 183 }
<> 128:9bcdf88f62b0 184
<> 128:9bcdf88f62b0 185 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 186 * @param func Function object to attach
<> 128:9bcdf88f62b0 187 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 188 */
<> 128:9bcdf88f62b0 189 template <typename F>
<> 128:9bcdf88f62b0 190 Callback(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 191 detail::is_type<R (F::*)() volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 192 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 193 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 194 generate(f);
<> 128:9bcdf88f62b0 195 }
<> 128:9bcdf88f62b0 196
<> 128:9bcdf88f62b0 197 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 198 * @param func Function object to attach
<> 128:9bcdf88f62b0 199 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 200 */
<> 128:9bcdf88f62b0 201 template <typename F>
<> 128:9bcdf88f62b0 202 Callback(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 203 detail::is_type<R (F::*)() const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 204 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 205 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 206 generate(f);
<> 128:9bcdf88f62b0 207 }
<> 128:9bcdf88f62b0 208
<> 128:9bcdf88f62b0 209 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 210 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 211 * @param func Static function to attach
<> 128:9bcdf88f62b0 212 * @deprecated
<> 128:9bcdf88f62b0 213 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 214 */
<> 130:d75b3fe1f5cb 215 template<typename T, typename U>
<> 128:9bcdf88f62b0 216 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 217 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 218 Callback(U *obj, R (*func)(T*)) {
<> 128:9bcdf88f62b0 219 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 220 }
<> 128:9bcdf88f62b0 221
<> 128:9bcdf88f62b0 222 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 223 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 224 * @param func Static function to attach
<> 128:9bcdf88f62b0 225 * @deprecated
<> 128:9bcdf88f62b0 226 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 227 */
<> 130:d75b3fe1f5cb 228 template<typename T, typename U>
<> 128:9bcdf88f62b0 229 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 230 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 231 Callback(const U *obj, R (*func)(const T*)) {
<> 128:9bcdf88f62b0 232 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 233 }
<> 128:9bcdf88f62b0 234
<> 128:9bcdf88f62b0 235 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 236 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 237 * @param func Static function to attach
<> 128:9bcdf88f62b0 238 * @deprecated
<> 128:9bcdf88f62b0 239 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 240 */
<> 130:d75b3fe1f5cb 241 template<typename T, typename U>
<> 128:9bcdf88f62b0 242 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 243 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 244 Callback(volatile U *obj, R (*func)(volatile T*)) {
<> 128:9bcdf88f62b0 245 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 246 }
<> 128:9bcdf88f62b0 247
<> 128:9bcdf88f62b0 248 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 249 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 250 * @param func Static function to attach
<> 128:9bcdf88f62b0 251 * @deprecated
<> 128:9bcdf88f62b0 252 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 253 */
<> 130:d75b3fe1f5cb 254 template<typename T, typename U>
<> 128:9bcdf88f62b0 255 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 256 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 257 Callback(const volatile U *obj, R (*func)(const volatile T*)) {
<> 128:9bcdf88f62b0 258 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 259 }
<> 128:9bcdf88f62b0 260
<> 128:9bcdf88f62b0 261 /** Destroy a callback
<> 128:9bcdf88f62b0 262 */
<> 128:9bcdf88f62b0 263 ~Callback() {
<> 128:9bcdf88f62b0 264 if (_ops) {
<> 128:9bcdf88f62b0 265 _ops->dtor(this);
<> 128:9bcdf88f62b0 266 }
<> 128:9bcdf88f62b0 267 }
<> 128:9bcdf88f62b0 268
<> 128:9bcdf88f62b0 269 /** Attach a static function
<> 128:9bcdf88f62b0 270 * @param func Static function to attach
<> 138:093f2bd7b9eb 271 * @deprecated
<> 138:093f2bd7b9eb 272 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 273 */
<> 138:093f2bd7b9eb 274 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 275 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 276 void attach(R (*func)()) {
<> 128:9bcdf88f62b0 277 this->~Callback();
<> 128:9bcdf88f62b0 278 new (this) Callback(func);
<> 128:9bcdf88f62b0 279 }
<> 128:9bcdf88f62b0 280
<> 128:9bcdf88f62b0 281 /** Attach a Callback
<> 128:9bcdf88f62b0 282 * @param func The Callback to attach
<> 138:093f2bd7b9eb 283 * @deprecated
<> 138:093f2bd7b9eb 284 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 285 */
<> 138:093f2bd7b9eb 286 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 287 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 288 void attach(const Callback<R()> &func) {
<> 128:9bcdf88f62b0 289 this->~Callback();
<> 128:9bcdf88f62b0 290 new (this) Callback(func);
<> 128:9bcdf88f62b0 291 }
<> 128:9bcdf88f62b0 292
<> 128:9bcdf88f62b0 293 /** Attach a member function
<> 128:9bcdf88f62b0 294 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 295 * @param method Member function to attach
<> 138:093f2bd7b9eb 296 * @deprecated
<> 138:093f2bd7b9eb 297 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 298 */
<> 130:d75b3fe1f5cb 299 template<typename T, typename U>
<> 138:093f2bd7b9eb 300 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 301 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 302 void attach(U *obj, R (T::*method)()) {
<> 128:9bcdf88f62b0 303 this->~Callback();
<> 128:9bcdf88f62b0 304 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 305 }
<> 128:9bcdf88f62b0 306
<> 128:9bcdf88f62b0 307 /** Attach a member function
<> 128:9bcdf88f62b0 308 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 309 * @param method Member function to attach
<> 138:093f2bd7b9eb 310 * @deprecated
<> 138:093f2bd7b9eb 311 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 312 */
<> 130:d75b3fe1f5cb 313 template<typename T, typename U>
<> 138:093f2bd7b9eb 314 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 315 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 316 void attach(const U *obj, R (T::*method)() const) {
<> 128:9bcdf88f62b0 317 this->~Callback();
<> 128:9bcdf88f62b0 318 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 319 }
<> 128:9bcdf88f62b0 320
<> 128:9bcdf88f62b0 321 /** Attach a member function
<> 128:9bcdf88f62b0 322 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 323 * @param method Member function to attach
<> 138:093f2bd7b9eb 324 * @deprecated
<> 138:093f2bd7b9eb 325 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 326 */
<> 130:d75b3fe1f5cb 327 template<typename T, typename U>
<> 138:093f2bd7b9eb 328 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 329 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 330 void attach(volatile U *obj, R (T::*method)() volatile) {
<> 128:9bcdf88f62b0 331 this->~Callback();
<> 128:9bcdf88f62b0 332 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 333 }
<> 128:9bcdf88f62b0 334
<> 128:9bcdf88f62b0 335 /** Attach a member function
<> 128:9bcdf88f62b0 336 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 337 * @param method Member function to attach
<> 138:093f2bd7b9eb 338 * @deprecated
<> 138:093f2bd7b9eb 339 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 340 */
<> 130:d75b3fe1f5cb 341 template<typename T, typename U>
<> 138:093f2bd7b9eb 342 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 343 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 344 void attach(const volatile U *obj, R (T::*method)() const volatile) {
<> 128:9bcdf88f62b0 345 this->~Callback();
<> 128:9bcdf88f62b0 346 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 347 }
<> 128:9bcdf88f62b0 348
<> 128:9bcdf88f62b0 349 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 350 * @param func Static function to attach
<> 128:9bcdf88f62b0 351 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 352 * @deprecated
<> 138:093f2bd7b9eb 353 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 354 */
<> 130:d75b3fe1f5cb 355 template <typename T, typename U>
<> 138:093f2bd7b9eb 356 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 357 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 358 void attach(R (*func)(T*), U *arg) {
<> 128:9bcdf88f62b0 359 this->~Callback();
<> 128:9bcdf88f62b0 360 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 361 }
<> 128:9bcdf88f62b0 362
<> 128:9bcdf88f62b0 363 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 364 * @param func Static function to attach
<> 128:9bcdf88f62b0 365 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 366 * @deprecated
<> 138:093f2bd7b9eb 367 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 368 */
<> 130:d75b3fe1f5cb 369 template <typename T, typename U>
<> 138:093f2bd7b9eb 370 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 371 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 372 void attach(R (*func)(const T*), const U *arg) {
<> 128:9bcdf88f62b0 373 this->~Callback();
<> 128:9bcdf88f62b0 374 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 375 }
<> 128:9bcdf88f62b0 376
<> 128:9bcdf88f62b0 377 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 378 * @param func Static function to attach
<> 128:9bcdf88f62b0 379 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 380 * @deprecated
<> 138:093f2bd7b9eb 381 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 382 */
<> 130:d75b3fe1f5cb 383 template <typename T, typename U>
<> 138:093f2bd7b9eb 384 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 385 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 386 void attach(R (*func)(volatile T*), volatile U *arg) {
<> 128:9bcdf88f62b0 387 this->~Callback();
<> 128:9bcdf88f62b0 388 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 389 }
<> 128:9bcdf88f62b0 390
<> 128:9bcdf88f62b0 391 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 392 * @param func Static function to attach
<> 128:9bcdf88f62b0 393 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 394 * @deprecated
<> 138:093f2bd7b9eb 395 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 396 */
<> 130:d75b3fe1f5cb 397 template <typename T, typename U>
<> 138:093f2bd7b9eb 398 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 399 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 400 void attach(R (*func)(const volatile T*), const volatile U *arg) {
<> 128:9bcdf88f62b0 401 this->~Callback();
<> 128:9bcdf88f62b0 402 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 403 }
<> 128:9bcdf88f62b0 404
<> 128:9bcdf88f62b0 405 /** Attach a function object
<> 128:9bcdf88f62b0 406 * @param func Function object to attach
<> 128:9bcdf88f62b0 407 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 408 * @deprecated
<> 138:093f2bd7b9eb 409 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 410 */
<> 128:9bcdf88f62b0 411 template <typename F>
<> 138:093f2bd7b9eb 412 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 413 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 414 void attach(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 415 detail::is_type<R (F::*)(), &F::operator()>::value &&
<> 128:9bcdf88f62b0 416 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 417 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 418 this->~Callback();
<> 128:9bcdf88f62b0 419 new (this) Callback(f);
<> 128:9bcdf88f62b0 420 }
<> 128:9bcdf88f62b0 421
<> 128:9bcdf88f62b0 422 /** Attach a function object
<> 128:9bcdf88f62b0 423 * @param func Function object to attach
<> 128:9bcdf88f62b0 424 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 425 * @deprecated
<> 138:093f2bd7b9eb 426 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 427 */
<> 128:9bcdf88f62b0 428 template <typename F>
<> 138:093f2bd7b9eb 429 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 430 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 431 void attach(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 432 detail::is_type<R (F::*)() const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 433 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 434 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 435 this->~Callback();
<> 128:9bcdf88f62b0 436 new (this) Callback(f);
<> 128:9bcdf88f62b0 437 }
<> 128:9bcdf88f62b0 438
<> 128:9bcdf88f62b0 439 /** Attach a function object
<> 128:9bcdf88f62b0 440 * @param func Function object to attach
<> 128:9bcdf88f62b0 441 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 442 * @deprecated
<> 138:093f2bd7b9eb 443 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 444 */
<> 128:9bcdf88f62b0 445 template <typename F>
<> 138:093f2bd7b9eb 446 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 447 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 448 void attach(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 449 detail::is_type<R (F::*)() volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 450 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 451 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 452 this->~Callback();
<> 128:9bcdf88f62b0 453 new (this) Callback(f);
<> 128:9bcdf88f62b0 454 }
<> 128:9bcdf88f62b0 455
<> 128:9bcdf88f62b0 456 /** Attach a function object
<> 128:9bcdf88f62b0 457 * @param func Function object to attach
<> 128:9bcdf88f62b0 458 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 459 * @deprecated
<> 138:093f2bd7b9eb 460 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 461 */
<> 128:9bcdf88f62b0 462 template <typename F>
<> 138:093f2bd7b9eb 463 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 464 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 465 void attach(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 466 detail::is_type<R (F::*)() const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 467 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 468 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 469 this->~Callback();
<> 128:9bcdf88f62b0 470 new (this) Callback(f);
<> 128:9bcdf88f62b0 471 }
<> 128:9bcdf88f62b0 472
<> 128:9bcdf88f62b0 473 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 474 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 475 * @param func Static function to attach
<> 128:9bcdf88f62b0 476 * @deprecated
<> 128:9bcdf88f62b0 477 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 478 */
<> 130:d75b3fe1f5cb 479 template <typename T, typename U>
<> 128:9bcdf88f62b0 480 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 481 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 482 void attach(U *obj, R (*func)(T*)) {
<> 128:9bcdf88f62b0 483 this->~Callback();
<> 128:9bcdf88f62b0 484 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 485 }
<> 128:9bcdf88f62b0 486
<> 128:9bcdf88f62b0 487 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 488 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 489 * @param func Static function to attach
<> 128:9bcdf88f62b0 490 * @deprecated
<> 128:9bcdf88f62b0 491 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 492 */
<> 130:d75b3fe1f5cb 493 template <typename T, typename U>
<> 128:9bcdf88f62b0 494 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 495 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 496 void attach(const U *obj, R (*func)(const T*)) {
<> 128:9bcdf88f62b0 497 this->~Callback();
<> 128:9bcdf88f62b0 498 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 499 }
<> 128:9bcdf88f62b0 500
<> 128:9bcdf88f62b0 501 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 502 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 503 * @param func Static function to attach
<> 128:9bcdf88f62b0 504 * @deprecated
<> 128:9bcdf88f62b0 505 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 506 */
<> 130:d75b3fe1f5cb 507 template <typename T, typename U>
<> 128:9bcdf88f62b0 508 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 509 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 510 void attach(volatile U *obj, R (*func)(volatile T*)) {
<> 128:9bcdf88f62b0 511 this->~Callback();
<> 128:9bcdf88f62b0 512 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 513 }
<> 128:9bcdf88f62b0 514
<> 128:9bcdf88f62b0 515 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 516 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 517 * @param func Static function to attach
<> 128:9bcdf88f62b0 518 * @deprecated
<> 128:9bcdf88f62b0 519 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 520 */
<> 130:d75b3fe1f5cb 521 template <typename T, typename U>
<> 128:9bcdf88f62b0 522 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 523 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 524 void attach(const volatile U *obj, R (*func)(const volatile T*)) {
<> 128:9bcdf88f62b0 525 this->~Callback();
<> 128:9bcdf88f62b0 526 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 527 }
<> 128:9bcdf88f62b0 528
<> 128:9bcdf88f62b0 529 /** Assign a callback
<> 128:9bcdf88f62b0 530 */
<> 128:9bcdf88f62b0 531 Callback &operator=(const Callback &that) {
<> 128:9bcdf88f62b0 532 if (this != &that) {
<> 128:9bcdf88f62b0 533 this->~Callback();
<> 128:9bcdf88f62b0 534 new (this) Callback(that);
<> 128:9bcdf88f62b0 535 }
<> 128:9bcdf88f62b0 536
<> 128:9bcdf88f62b0 537 return *this;
<> 128:9bcdf88f62b0 538 }
<> 128:9bcdf88f62b0 539
<> 128:9bcdf88f62b0 540 /** Call the attached function
<> 128:9bcdf88f62b0 541 */
<> 128:9bcdf88f62b0 542 R call() const {
<> 128:9bcdf88f62b0 543 MBED_ASSERT(_ops);
<> 128:9bcdf88f62b0 544 return _ops->call(this);
<> 128:9bcdf88f62b0 545 }
<> 128:9bcdf88f62b0 546
<> 128:9bcdf88f62b0 547 /** Call the attached function
<> 128:9bcdf88f62b0 548 */
<> 128:9bcdf88f62b0 549 R operator()() const {
<> 128:9bcdf88f62b0 550 return call();
<> 128:9bcdf88f62b0 551 }
<> 128:9bcdf88f62b0 552
<> 128:9bcdf88f62b0 553 /** Test if function has been attached
<> 128:9bcdf88f62b0 554 */
<> 128:9bcdf88f62b0 555 operator bool() const {
<> 128:9bcdf88f62b0 556 return _ops;
<> 128:9bcdf88f62b0 557 }
<> 128:9bcdf88f62b0 558
<> 128:9bcdf88f62b0 559 /** Test for equality
<> 128:9bcdf88f62b0 560 */
<> 128:9bcdf88f62b0 561 friend bool operator==(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 562 return memcmp(&l, &r, sizeof(Callback)) == 0;
<> 128:9bcdf88f62b0 563 }
<> 128:9bcdf88f62b0 564
<> 128:9bcdf88f62b0 565 /** Test for inequality
<> 128:9bcdf88f62b0 566 */
<> 128:9bcdf88f62b0 567 friend bool operator!=(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 568 return !(l == r);
<> 128:9bcdf88f62b0 569 }
<> 128:9bcdf88f62b0 570
<> 128:9bcdf88f62b0 571 /** Static thunk for passing as C-style function
<> 128:9bcdf88f62b0 572 * @param func Callback to call passed as void pointer
<> 128:9bcdf88f62b0 573 */
<> 128:9bcdf88f62b0 574 static R thunk(void *func) {
<> 128:9bcdf88f62b0 575 return static_cast<Callback*>(func)->call();
<> 128:9bcdf88f62b0 576 }
<> 128:9bcdf88f62b0 577
<> 128:9bcdf88f62b0 578 private:
<> 128:9bcdf88f62b0 579 // Stored as pointer to function and pointer to optional object
<> 128:9bcdf88f62b0 580 // Function pointer is stored as union of possible function types
<> 128:9bcdf88f62b0 581 // to garuntee proper size and alignment
<> 128:9bcdf88f62b0 582 struct _class;
<> 128:9bcdf88f62b0 583 union {
<> 128:9bcdf88f62b0 584 void (*_staticfunc)();
<> 128:9bcdf88f62b0 585 void (*_boundfunc)(_class*);
<> 128:9bcdf88f62b0 586 void (_class::*_methodfunc)();
<> 128:9bcdf88f62b0 587 } _func;
<> 128:9bcdf88f62b0 588 void *_obj;
<> 128:9bcdf88f62b0 589
<> 128:9bcdf88f62b0 590 // Dynamically dispatched operations
<> 128:9bcdf88f62b0 591 const struct ops {
<> 128:9bcdf88f62b0 592 R (*call)(const void*);
<> 128:9bcdf88f62b0 593 void (*move)(void*, const void*);
<> 128:9bcdf88f62b0 594 void (*dtor)(void*);
<> 128:9bcdf88f62b0 595 } *_ops;
<> 128:9bcdf88f62b0 596
<> 128:9bcdf88f62b0 597 // Generate operations for function object
<> 128:9bcdf88f62b0 598 template <typename F>
<> 128:9bcdf88f62b0 599 void generate(const F &f) {
<> 128:9bcdf88f62b0 600 static const ops ops = {
<> 128:9bcdf88f62b0 601 &Callback::function_call<F>,
<> 128:9bcdf88f62b0 602 &Callback::function_move<F>,
<> 128:9bcdf88f62b0 603 &Callback::function_dtor<F>,
<> 128:9bcdf88f62b0 604 };
<> 128:9bcdf88f62b0 605
<> 130:d75b3fe1f5cb 606 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
<> 130:d75b3fe1f5cb 607 "Type F must not exceed the size of the Callback class");
<> 128:9bcdf88f62b0 608 new (this) F(f);
<> 128:9bcdf88f62b0 609 _ops = &ops;
<> 128:9bcdf88f62b0 610 }
<> 128:9bcdf88f62b0 611
<> 128:9bcdf88f62b0 612 // Function attributes
<> 128:9bcdf88f62b0 613 template <typename F>
<> 128:9bcdf88f62b0 614 static R function_call(const void *p) {
<> 128:9bcdf88f62b0 615 return (*(F*)p)();
<> 128:9bcdf88f62b0 616 }
<> 128:9bcdf88f62b0 617
<> 128:9bcdf88f62b0 618 template <typename F>
<> 128:9bcdf88f62b0 619 static void function_move(void *d, const void *p) {
<> 128:9bcdf88f62b0 620 new (d) F(*(F*)p);
<> 128:9bcdf88f62b0 621 }
<> 128:9bcdf88f62b0 622
<> 128:9bcdf88f62b0 623 template <typename F>
<> 128:9bcdf88f62b0 624 static void function_dtor(void *p) {
<> 128:9bcdf88f62b0 625 ((F*)p)->~F();
<> 128:9bcdf88f62b0 626 }
<> 128:9bcdf88f62b0 627
<> 128:9bcdf88f62b0 628 // Wrappers for functions with context
<> 128:9bcdf88f62b0 629 template <typename O, typename M>
<> 128:9bcdf88f62b0 630 struct method_context {
<> 128:9bcdf88f62b0 631 M method;
<> 128:9bcdf88f62b0 632 O *obj;
<> 128:9bcdf88f62b0 633
<> 128:9bcdf88f62b0 634 method_context(O *obj, M method)
<> 128:9bcdf88f62b0 635 : method(method), obj(obj) {}
<> 128:9bcdf88f62b0 636
<> 128:9bcdf88f62b0 637 R operator()() const {
<> 128:9bcdf88f62b0 638 return (obj->*method)();
<> 128:9bcdf88f62b0 639 }
<> 128:9bcdf88f62b0 640 };
<> 128:9bcdf88f62b0 641
<> 128:9bcdf88f62b0 642 template <typename F, typename A>
<> 128:9bcdf88f62b0 643 struct function_context {
<> 128:9bcdf88f62b0 644 F func;
<> 128:9bcdf88f62b0 645 A *arg;
<> 128:9bcdf88f62b0 646
<> 128:9bcdf88f62b0 647 function_context(F func, A *arg)
<> 128:9bcdf88f62b0 648 : func(func), arg(arg) {}
<> 128:9bcdf88f62b0 649
<> 128:9bcdf88f62b0 650 R operator()() const {
<> 128:9bcdf88f62b0 651 return func(arg);
<> 128:9bcdf88f62b0 652 }
<> 128:9bcdf88f62b0 653 };
<> 128:9bcdf88f62b0 654 };
<> 128:9bcdf88f62b0 655
<> 128:9bcdf88f62b0 656 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 657 *
<> 128:9bcdf88f62b0 658 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 659 */
<> 128:9bcdf88f62b0 660 template <typename R, typename A0>
<> 128:9bcdf88f62b0 661 class Callback<R(A0)> {
<> 128:9bcdf88f62b0 662 public:
<> 128:9bcdf88f62b0 663 /** Create a Callback with a static function
<> 128:9bcdf88f62b0 664 * @param func Static function to attach
<> 128:9bcdf88f62b0 665 */
<> 128:9bcdf88f62b0 666 Callback(R (*func)(A0) = 0) {
<> 128:9bcdf88f62b0 667 if (!func) {
<> 128:9bcdf88f62b0 668 _ops = 0;
<> 128:9bcdf88f62b0 669 } else {
<> 128:9bcdf88f62b0 670 generate(func);
<> 128:9bcdf88f62b0 671 }
<> 128:9bcdf88f62b0 672 }
<> 128:9bcdf88f62b0 673
<> 128:9bcdf88f62b0 674 /** Attach a Callback
<> 128:9bcdf88f62b0 675 * @param func The Callback to attach
<> 128:9bcdf88f62b0 676 */
<> 128:9bcdf88f62b0 677 Callback(const Callback<R(A0)> &func) {
<> 128:9bcdf88f62b0 678 if (func._ops) {
<> 128:9bcdf88f62b0 679 func._ops->move(this, &func);
<> 128:9bcdf88f62b0 680 }
<> 128:9bcdf88f62b0 681 _ops = func._ops;
<> 128:9bcdf88f62b0 682 }
<> 128:9bcdf88f62b0 683
<> 128:9bcdf88f62b0 684 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 685 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 686 * @param method Member function to attach
<> 128:9bcdf88f62b0 687 */
<> 130:d75b3fe1f5cb 688 template<typename T, typename U>
<> 130:d75b3fe1f5cb 689 Callback(U *obj, R (T::*method)(A0)) {
<> 128:9bcdf88f62b0 690 generate(method_context<T, R (T::*)(A0)>(obj, method));
<> 128:9bcdf88f62b0 691 }
<> 128:9bcdf88f62b0 692
<> 128:9bcdf88f62b0 693 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 694 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 695 * @param method Member function to attach
<> 128:9bcdf88f62b0 696 */
<> 130:d75b3fe1f5cb 697 template<typename T, typename U>
<> 130:d75b3fe1f5cb 698 Callback(const U *obj, R (T::*method)(A0) const) {
<> 128:9bcdf88f62b0 699 generate(method_context<const T, R (T::*)(A0) const>(obj, method));
<> 128:9bcdf88f62b0 700 }
<> 128:9bcdf88f62b0 701
<> 128:9bcdf88f62b0 702 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 703 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 704 * @param method Member function to attach
<> 128:9bcdf88f62b0 705 */
<> 130:d75b3fe1f5cb 706 template<typename T, typename U>
<> 130:d75b3fe1f5cb 707 Callback(volatile U *obj, R (T::*method)(A0) volatile) {
<> 128:9bcdf88f62b0 708 generate(method_context<volatile T, R (T::*)(A0) volatile>(obj, method));
<> 128:9bcdf88f62b0 709 }
<> 128:9bcdf88f62b0 710
<> 128:9bcdf88f62b0 711 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 712 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 713 * @param method Member function to attach
<> 128:9bcdf88f62b0 714 */
<> 130:d75b3fe1f5cb 715 template<typename T, typename U>
<> 130:d75b3fe1f5cb 716 Callback(const volatile U *obj, R (T::*method)(A0) const volatile) {
<> 128:9bcdf88f62b0 717 generate(method_context<const volatile T, R (T::*)(A0) const volatile>(obj, method));
<> 128:9bcdf88f62b0 718 }
<> 128:9bcdf88f62b0 719
<> 128:9bcdf88f62b0 720 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 721 * @param func Static function to attach
<> 128:9bcdf88f62b0 722 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 723 */
<> 130:d75b3fe1f5cb 724 template<typename T, typename U>
<> 130:d75b3fe1f5cb 725 Callback(R (*func)(T*, A0), U *arg) {
<> 128:9bcdf88f62b0 726 generate(function_context<R (*)(T*, A0), T>(func, arg));
<> 128:9bcdf88f62b0 727 }
<> 128:9bcdf88f62b0 728
<> 128:9bcdf88f62b0 729 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 730 * @param func Static function to attach
<> 128:9bcdf88f62b0 731 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 732 */
<> 130:d75b3fe1f5cb 733 template<typename T, typename U>
<> 130:d75b3fe1f5cb 734 Callback(R (*func)(const T*, A0), const U *arg) {
<> 128:9bcdf88f62b0 735 generate(function_context<R (*)(const T*, A0), const T>(func, arg));
<> 128:9bcdf88f62b0 736 }
<> 128:9bcdf88f62b0 737
<> 128:9bcdf88f62b0 738 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 739 * @param func Static function to attach
<> 128:9bcdf88f62b0 740 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 741 */
<> 130:d75b3fe1f5cb 742 template<typename T, typename U>
<> 130:d75b3fe1f5cb 743 Callback(R (*func)(volatile T*, A0), volatile U *arg) {
<> 128:9bcdf88f62b0 744 generate(function_context<R (*)(volatile T*, A0), volatile T>(func, arg));
<> 128:9bcdf88f62b0 745 }
<> 128:9bcdf88f62b0 746
<> 128:9bcdf88f62b0 747 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 748 * @param func Static function to attach
<> 128:9bcdf88f62b0 749 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 750 */
<> 130:d75b3fe1f5cb 751 template<typename T, typename U>
<> 130:d75b3fe1f5cb 752 Callback(R (*func)(const volatile T*, A0), const volatile U *arg) {
<> 128:9bcdf88f62b0 753 generate(function_context<R (*)(const volatile T*, A0), const volatile T>(func, arg));
<> 128:9bcdf88f62b0 754 }
<> 128:9bcdf88f62b0 755
<> 128:9bcdf88f62b0 756 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 757 * @param func Function object to attach
<> 128:9bcdf88f62b0 758 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 759 */
<> 128:9bcdf88f62b0 760 template <typename F>
<> 128:9bcdf88f62b0 761 Callback(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 762 detail::is_type<R (F::*)(A0), &F::operator()>::value &&
<> 128:9bcdf88f62b0 763 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 764 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 765 generate(f);
<> 128:9bcdf88f62b0 766 }
<> 128:9bcdf88f62b0 767
<> 128:9bcdf88f62b0 768 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 769 * @param func Function object to attach
<> 128:9bcdf88f62b0 770 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 771 */
<> 128:9bcdf88f62b0 772 template <typename F>
<> 128:9bcdf88f62b0 773 Callback(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 774 detail::is_type<R (F::*)(A0) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 775 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 776 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 777 generate(f);
<> 128:9bcdf88f62b0 778 }
<> 128:9bcdf88f62b0 779
<> 128:9bcdf88f62b0 780 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 781 * @param func Function object to attach
<> 128:9bcdf88f62b0 782 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 783 */
<> 128:9bcdf88f62b0 784 template <typename F>
<> 128:9bcdf88f62b0 785 Callback(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 786 detail::is_type<R (F::*)(A0) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 787 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 788 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 789 generate(f);
<> 128:9bcdf88f62b0 790 }
<> 128:9bcdf88f62b0 791
<> 128:9bcdf88f62b0 792 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 793 * @param func Function object to attach
<> 128:9bcdf88f62b0 794 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 795 */
<> 128:9bcdf88f62b0 796 template <typename F>
<> 128:9bcdf88f62b0 797 Callback(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 798 detail::is_type<R (F::*)(A0) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 799 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 800 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 801 generate(f);
<> 128:9bcdf88f62b0 802 }
<> 128:9bcdf88f62b0 803
<> 128:9bcdf88f62b0 804 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 805 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 806 * @param func Static function to attach
<> 128:9bcdf88f62b0 807 * @deprecated
<> 128:9bcdf88f62b0 808 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 809 */
<> 130:d75b3fe1f5cb 810 template<typename T, typename U>
<> 128:9bcdf88f62b0 811 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 812 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 813 Callback(U *obj, R (*func)(T*, A0)) {
<> 128:9bcdf88f62b0 814 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 815 }
<> 128:9bcdf88f62b0 816
<> 128:9bcdf88f62b0 817 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 818 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 819 * @param func Static function to attach
<> 128:9bcdf88f62b0 820 * @deprecated
<> 128:9bcdf88f62b0 821 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 822 */
<> 130:d75b3fe1f5cb 823 template<typename T, typename U>
<> 128:9bcdf88f62b0 824 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 825 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 826 Callback(const U *obj, R (*func)(const T*, A0)) {
<> 128:9bcdf88f62b0 827 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 828 }
<> 128:9bcdf88f62b0 829
<> 128:9bcdf88f62b0 830 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 831 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 832 * @param func Static function to attach
<> 128:9bcdf88f62b0 833 * @deprecated
<> 128:9bcdf88f62b0 834 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 835 */
<> 130:d75b3fe1f5cb 836 template<typename T, typename U>
<> 128:9bcdf88f62b0 837 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 838 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 839 Callback(volatile U *obj, R (*func)(volatile T*, A0)) {
<> 128:9bcdf88f62b0 840 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 841 }
<> 128:9bcdf88f62b0 842
<> 128:9bcdf88f62b0 843 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 844 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 845 * @param func Static function to attach
<> 128:9bcdf88f62b0 846 * @deprecated
<> 128:9bcdf88f62b0 847 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 848 */
<> 130:d75b3fe1f5cb 849 template<typename T, typename U>
<> 128:9bcdf88f62b0 850 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 851 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 852 Callback(const volatile U *obj, R (*func)(const volatile T*, A0)) {
<> 128:9bcdf88f62b0 853 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 854 }
<> 128:9bcdf88f62b0 855
<> 128:9bcdf88f62b0 856 /** Destroy a callback
<> 128:9bcdf88f62b0 857 */
<> 128:9bcdf88f62b0 858 ~Callback() {
<> 128:9bcdf88f62b0 859 if (_ops) {
<> 128:9bcdf88f62b0 860 _ops->dtor(this);
<> 128:9bcdf88f62b0 861 }
<> 128:9bcdf88f62b0 862 }
<> 128:9bcdf88f62b0 863
<> 128:9bcdf88f62b0 864 /** Attach a static function
<> 128:9bcdf88f62b0 865 * @param func Static function to attach
<> 138:093f2bd7b9eb 866 * @deprecated
<> 138:093f2bd7b9eb 867 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 868 */
<> 138:093f2bd7b9eb 869 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 870 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 871 void attach(R (*func)(A0)) {
<> 128:9bcdf88f62b0 872 this->~Callback();
<> 128:9bcdf88f62b0 873 new (this) Callback(func);
<> 128:9bcdf88f62b0 874 }
<> 128:9bcdf88f62b0 875
<> 128:9bcdf88f62b0 876 /** Attach a Callback
<> 128:9bcdf88f62b0 877 * @param func The Callback to attach
<> 138:093f2bd7b9eb 878 * @deprecated
<> 138:093f2bd7b9eb 879 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 880 */
<> 138:093f2bd7b9eb 881 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 882 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 883 void attach(const Callback<R(A0)> &func) {
<> 128:9bcdf88f62b0 884 this->~Callback();
<> 128:9bcdf88f62b0 885 new (this) Callback(func);
<> 128:9bcdf88f62b0 886 }
<> 128:9bcdf88f62b0 887
<> 128:9bcdf88f62b0 888 /** Attach a member function
<> 128:9bcdf88f62b0 889 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 890 * @param method Member function to attach
<> 138:093f2bd7b9eb 891 * @deprecated
<> 138:093f2bd7b9eb 892 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 893 */
<> 130:d75b3fe1f5cb 894 template<typename T, typename U>
<> 138:093f2bd7b9eb 895 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 896 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 897 void attach(U *obj, R (T::*method)(A0)) {
<> 128:9bcdf88f62b0 898 this->~Callback();
<> 128:9bcdf88f62b0 899 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 900 }
<> 128:9bcdf88f62b0 901
<> 128:9bcdf88f62b0 902 /** Attach a member function
<> 128:9bcdf88f62b0 903 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 904 * @param method Member function to attach
<> 138:093f2bd7b9eb 905 * @deprecated
<> 138:093f2bd7b9eb 906 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 907 */
<> 130:d75b3fe1f5cb 908 template<typename T, typename U>
<> 138:093f2bd7b9eb 909 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 910 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 911 void attach(const U *obj, R (T::*method)(A0) const) {
<> 128:9bcdf88f62b0 912 this->~Callback();
<> 128:9bcdf88f62b0 913 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 914 }
<> 128:9bcdf88f62b0 915
<> 128:9bcdf88f62b0 916 /** Attach a member function
<> 128:9bcdf88f62b0 917 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 918 * @param method Member function to attach
<> 138:093f2bd7b9eb 919 * @deprecated
<> 138:093f2bd7b9eb 920 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 921 */
<> 130:d75b3fe1f5cb 922 template<typename T, typename U>
<> 138:093f2bd7b9eb 923 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 924 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 925 void attach(volatile U *obj, R (T::*method)(A0) volatile) {
<> 128:9bcdf88f62b0 926 this->~Callback();
<> 128:9bcdf88f62b0 927 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 928 }
<> 128:9bcdf88f62b0 929
<> 128:9bcdf88f62b0 930 /** Attach a member function
<> 128:9bcdf88f62b0 931 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 932 * @param method Member function to attach
<> 138:093f2bd7b9eb 933 * @deprecated
<> 138:093f2bd7b9eb 934 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 935 */
<> 130:d75b3fe1f5cb 936 template<typename T, typename U>
<> 138:093f2bd7b9eb 937 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 938 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 939 void attach(const volatile U *obj, R (T::*method)(A0) const volatile) {
<> 128:9bcdf88f62b0 940 this->~Callback();
<> 128:9bcdf88f62b0 941 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 942 }
<> 128:9bcdf88f62b0 943
<> 128:9bcdf88f62b0 944 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 945 * @param func Static function to attach
<> 128:9bcdf88f62b0 946 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 947 * @deprecated
<> 138:093f2bd7b9eb 948 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 949 */
<> 130:d75b3fe1f5cb 950 template <typename T, typename U>
<> 138:093f2bd7b9eb 951 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 952 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 953 void attach(R (*func)(T*, A0), U *arg) {
<> 128:9bcdf88f62b0 954 this->~Callback();
<> 128:9bcdf88f62b0 955 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 956 }
<> 128:9bcdf88f62b0 957
<> 128:9bcdf88f62b0 958 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 959 * @param func Static function to attach
<> 128:9bcdf88f62b0 960 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 961 * @deprecated
<> 138:093f2bd7b9eb 962 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 963 */
<> 130:d75b3fe1f5cb 964 template <typename T, typename U>
<> 138:093f2bd7b9eb 965 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 966 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 967 void attach(R (*func)(const T*, A0), const U *arg) {
<> 128:9bcdf88f62b0 968 this->~Callback();
<> 128:9bcdf88f62b0 969 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 970 }
<> 128:9bcdf88f62b0 971
<> 128:9bcdf88f62b0 972 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 973 * @param func Static function to attach
<> 128:9bcdf88f62b0 974 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 975 * @deprecated
<> 138:093f2bd7b9eb 976 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 977 */
<> 130:d75b3fe1f5cb 978 template <typename T, typename U>
<> 138:093f2bd7b9eb 979 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 980 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 981 void attach(R (*func)(volatile T*, A0), volatile U *arg) {
<> 128:9bcdf88f62b0 982 this->~Callback();
<> 128:9bcdf88f62b0 983 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 984 }
<> 128:9bcdf88f62b0 985
<> 128:9bcdf88f62b0 986 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 987 * @param func Static function to attach
<> 128:9bcdf88f62b0 988 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 989 * @deprecated
<> 138:093f2bd7b9eb 990 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 991 */
<> 130:d75b3fe1f5cb 992 template <typename T, typename U>
<> 138:093f2bd7b9eb 993 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 994 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 995 void attach(R (*func)(const volatile T*, A0), const volatile U *arg) {
<> 128:9bcdf88f62b0 996 this->~Callback();
<> 128:9bcdf88f62b0 997 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 998 }
<> 128:9bcdf88f62b0 999
<> 128:9bcdf88f62b0 1000 /** Attach a function object
<> 128:9bcdf88f62b0 1001 * @param func Function object to attach
<> 128:9bcdf88f62b0 1002 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1003 * @deprecated
<> 138:093f2bd7b9eb 1004 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1005 */
<> 128:9bcdf88f62b0 1006 template <typename F>
<> 138:093f2bd7b9eb 1007 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1008 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1009 void attach(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1010 detail::is_type<R (F::*)(A0), &F::operator()>::value &&
<> 128:9bcdf88f62b0 1011 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1012 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1013 this->~Callback();
<> 128:9bcdf88f62b0 1014 new (this) Callback(f);
<> 128:9bcdf88f62b0 1015 }
<> 128:9bcdf88f62b0 1016
<> 128:9bcdf88f62b0 1017 /** Attach a function object
<> 128:9bcdf88f62b0 1018 * @param func Function object to attach
<> 128:9bcdf88f62b0 1019 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1020 * @deprecated
<> 138:093f2bd7b9eb 1021 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1022 */
<> 128:9bcdf88f62b0 1023 template <typename F>
<> 138:093f2bd7b9eb 1024 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1025 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1026 void attach(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1027 detail::is_type<R (F::*)(A0) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1028 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1029 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1030 this->~Callback();
<> 128:9bcdf88f62b0 1031 new (this) Callback(f);
<> 128:9bcdf88f62b0 1032 }
<> 128:9bcdf88f62b0 1033
<> 128:9bcdf88f62b0 1034 /** Attach a function object
<> 128:9bcdf88f62b0 1035 * @param func Function object to attach
<> 128:9bcdf88f62b0 1036 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1037 * @deprecated
<> 138:093f2bd7b9eb 1038 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1039 */
<> 128:9bcdf88f62b0 1040 template <typename F>
<> 138:093f2bd7b9eb 1041 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1042 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1043 void attach(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1044 detail::is_type<R (F::*)(A0) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1045 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1046 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1047 this->~Callback();
<> 128:9bcdf88f62b0 1048 new (this) Callback(f);
<> 128:9bcdf88f62b0 1049 }
<> 128:9bcdf88f62b0 1050
<> 128:9bcdf88f62b0 1051 /** Attach a function object
<> 128:9bcdf88f62b0 1052 * @param func Function object to attach
<> 128:9bcdf88f62b0 1053 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1054 * @deprecated
<> 138:093f2bd7b9eb 1055 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1056 */
<> 128:9bcdf88f62b0 1057 template <typename F>
<> 138:093f2bd7b9eb 1058 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1059 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1060 void attach(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1061 detail::is_type<R (F::*)(A0) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1062 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1063 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1064 this->~Callback();
<> 128:9bcdf88f62b0 1065 new (this) Callback(f);
<> 128:9bcdf88f62b0 1066 }
<> 128:9bcdf88f62b0 1067
<> 128:9bcdf88f62b0 1068 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1069 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1070 * @param func Static function to attach
<> 128:9bcdf88f62b0 1071 * @deprecated
<> 128:9bcdf88f62b0 1072 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1073 */
<> 130:d75b3fe1f5cb 1074 template <typename T, typename U>
<> 128:9bcdf88f62b0 1075 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1076 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1077 void attach(U *obj, R (*func)(T*, A0)) {
<> 128:9bcdf88f62b0 1078 this->~Callback();
<> 128:9bcdf88f62b0 1079 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1080 }
<> 128:9bcdf88f62b0 1081
<> 128:9bcdf88f62b0 1082 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1083 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1084 * @param func Static function to attach
<> 128:9bcdf88f62b0 1085 * @deprecated
<> 128:9bcdf88f62b0 1086 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1087 */
<> 130:d75b3fe1f5cb 1088 template <typename T, typename U>
<> 128:9bcdf88f62b0 1089 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1090 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1091 void attach(const U *obj, R (*func)(const T*, A0)) {
<> 128:9bcdf88f62b0 1092 this->~Callback();
<> 128:9bcdf88f62b0 1093 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1094 }
<> 128:9bcdf88f62b0 1095
<> 128:9bcdf88f62b0 1096 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1097 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1098 * @param func Static function to attach
<> 128:9bcdf88f62b0 1099 * @deprecated
<> 128:9bcdf88f62b0 1100 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1101 */
<> 130:d75b3fe1f5cb 1102 template <typename T, typename U>
<> 128:9bcdf88f62b0 1103 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1104 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1105 void attach(volatile U *obj, R (*func)(volatile T*, A0)) {
<> 128:9bcdf88f62b0 1106 this->~Callback();
<> 128:9bcdf88f62b0 1107 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1108 }
<> 128:9bcdf88f62b0 1109
<> 128:9bcdf88f62b0 1110 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1111 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1112 * @param func Static function to attach
<> 128:9bcdf88f62b0 1113 * @deprecated
<> 128:9bcdf88f62b0 1114 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1115 */
<> 130:d75b3fe1f5cb 1116 template <typename T, typename U>
<> 128:9bcdf88f62b0 1117 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1118 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1119 void attach(const volatile U *obj, R (*func)(const volatile T*, A0)) {
<> 128:9bcdf88f62b0 1120 this->~Callback();
<> 128:9bcdf88f62b0 1121 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1122 }
<> 128:9bcdf88f62b0 1123
<> 128:9bcdf88f62b0 1124 /** Assign a callback
<> 128:9bcdf88f62b0 1125 */
<> 128:9bcdf88f62b0 1126 Callback &operator=(const Callback &that) {
<> 128:9bcdf88f62b0 1127 if (this != &that) {
<> 128:9bcdf88f62b0 1128 this->~Callback();
<> 128:9bcdf88f62b0 1129 new (this) Callback(that);
<> 128:9bcdf88f62b0 1130 }
<> 128:9bcdf88f62b0 1131
<> 128:9bcdf88f62b0 1132 return *this;
<> 128:9bcdf88f62b0 1133 }
<> 128:9bcdf88f62b0 1134
<> 128:9bcdf88f62b0 1135 /** Call the attached function
<> 128:9bcdf88f62b0 1136 */
<> 128:9bcdf88f62b0 1137 R call(A0 a0) const {
<> 128:9bcdf88f62b0 1138 MBED_ASSERT(_ops);
<> 128:9bcdf88f62b0 1139 return _ops->call(this, a0);
<> 128:9bcdf88f62b0 1140 }
<> 128:9bcdf88f62b0 1141
<> 128:9bcdf88f62b0 1142 /** Call the attached function
<> 128:9bcdf88f62b0 1143 */
<> 128:9bcdf88f62b0 1144 R operator()(A0 a0) const {
<> 128:9bcdf88f62b0 1145 return call(a0);
<> 128:9bcdf88f62b0 1146 }
<> 128:9bcdf88f62b0 1147
<> 128:9bcdf88f62b0 1148 /** Test if function has been attached
<> 128:9bcdf88f62b0 1149 */
<> 128:9bcdf88f62b0 1150 operator bool() const {
<> 128:9bcdf88f62b0 1151 return _ops;
<> 128:9bcdf88f62b0 1152 }
<> 128:9bcdf88f62b0 1153
<> 128:9bcdf88f62b0 1154 /** Test for equality
<> 128:9bcdf88f62b0 1155 */
<> 128:9bcdf88f62b0 1156 friend bool operator==(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 1157 return memcmp(&l, &r, sizeof(Callback)) == 0;
<> 128:9bcdf88f62b0 1158 }
<> 128:9bcdf88f62b0 1159
<> 128:9bcdf88f62b0 1160 /** Test for inequality
<> 128:9bcdf88f62b0 1161 */
<> 128:9bcdf88f62b0 1162 friend bool operator!=(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 1163 return !(l == r);
<> 128:9bcdf88f62b0 1164 }
<> 128:9bcdf88f62b0 1165
<> 128:9bcdf88f62b0 1166 /** Static thunk for passing as C-style function
<> 128:9bcdf88f62b0 1167 * @param func Callback to call passed as void pointer
<> 128:9bcdf88f62b0 1168 */
<> 128:9bcdf88f62b0 1169 static R thunk(void *func, A0 a0) {
<> 128:9bcdf88f62b0 1170 return static_cast<Callback*>(func)->call(a0);
<> 128:9bcdf88f62b0 1171 }
<> 128:9bcdf88f62b0 1172
<> 128:9bcdf88f62b0 1173 private:
<> 128:9bcdf88f62b0 1174 // Stored as pointer to function and pointer to optional object
<> 128:9bcdf88f62b0 1175 // Function pointer is stored as union of possible function types
<> 128:9bcdf88f62b0 1176 // to garuntee proper size and alignment
<> 128:9bcdf88f62b0 1177 struct _class;
<> 128:9bcdf88f62b0 1178 union {
<> 128:9bcdf88f62b0 1179 void (*_staticfunc)(A0);
<> 128:9bcdf88f62b0 1180 void (*_boundfunc)(_class*, A0);
<> 128:9bcdf88f62b0 1181 void (_class::*_methodfunc)(A0);
<> 128:9bcdf88f62b0 1182 } _func;
<> 128:9bcdf88f62b0 1183 void *_obj;
<> 128:9bcdf88f62b0 1184
<> 128:9bcdf88f62b0 1185 // Dynamically dispatched operations
<> 128:9bcdf88f62b0 1186 const struct ops {
<> 128:9bcdf88f62b0 1187 R (*call)(const void*, A0);
<> 128:9bcdf88f62b0 1188 void (*move)(void*, const void*);
<> 128:9bcdf88f62b0 1189 void (*dtor)(void*);
<> 128:9bcdf88f62b0 1190 } *_ops;
<> 128:9bcdf88f62b0 1191
<> 128:9bcdf88f62b0 1192 // Generate operations for function object
<> 128:9bcdf88f62b0 1193 template <typename F>
<> 128:9bcdf88f62b0 1194 void generate(const F &f) {
<> 128:9bcdf88f62b0 1195 static const ops ops = {
<> 128:9bcdf88f62b0 1196 &Callback::function_call<F>,
<> 128:9bcdf88f62b0 1197 &Callback::function_move<F>,
<> 128:9bcdf88f62b0 1198 &Callback::function_dtor<F>,
<> 128:9bcdf88f62b0 1199 };
<> 128:9bcdf88f62b0 1200
<> 130:d75b3fe1f5cb 1201 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
<> 130:d75b3fe1f5cb 1202 "Type F must not exceed the size of the Callback class");
<> 128:9bcdf88f62b0 1203 new (this) F(f);
<> 128:9bcdf88f62b0 1204 _ops = &ops;
<> 128:9bcdf88f62b0 1205 }
<> 128:9bcdf88f62b0 1206
<> 128:9bcdf88f62b0 1207 // Function attributes
<> 128:9bcdf88f62b0 1208 template <typename F>
<> 128:9bcdf88f62b0 1209 static R function_call(const void *p, A0 a0) {
<> 128:9bcdf88f62b0 1210 return (*(F*)p)(a0);
<> 128:9bcdf88f62b0 1211 }
<> 128:9bcdf88f62b0 1212
<> 128:9bcdf88f62b0 1213 template <typename F>
<> 128:9bcdf88f62b0 1214 static void function_move(void *d, const void *p) {
<> 128:9bcdf88f62b0 1215 new (d) F(*(F*)p);
<> 128:9bcdf88f62b0 1216 }
<> 128:9bcdf88f62b0 1217
<> 128:9bcdf88f62b0 1218 template <typename F>
<> 128:9bcdf88f62b0 1219 static void function_dtor(void *p) {
<> 128:9bcdf88f62b0 1220 ((F*)p)->~F();
<> 128:9bcdf88f62b0 1221 }
<> 128:9bcdf88f62b0 1222
<> 128:9bcdf88f62b0 1223 // Wrappers for functions with context
<> 128:9bcdf88f62b0 1224 template <typename O, typename M>
<> 128:9bcdf88f62b0 1225 struct method_context {
<> 128:9bcdf88f62b0 1226 M method;
<> 128:9bcdf88f62b0 1227 O *obj;
<> 128:9bcdf88f62b0 1228
<> 128:9bcdf88f62b0 1229 method_context(O *obj, M method)
<> 128:9bcdf88f62b0 1230 : method(method), obj(obj) {}
<> 128:9bcdf88f62b0 1231
<> 128:9bcdf88f62b0 1232 R operator()(A0 a0) const {
<> 128:9bcdf88f62b0 1233 return (obj->*method)(a0);
<> 128:9bcdf88f62b0 1234 }
<> 128:9bcdf88f62b0 1235 };
<> 128:9bcdf88f62b0 1236
<> 128:9bcdf88f62b0 1237 template <typename F, typename A>
<> 128:9bcdf88f62b0 1238 struct function_context {
<> 128:9bcdf88f62b0 1239 F func;
<> 128:9bcdf88f62b0 1240 A *arg;
<> 128:9bcdf88f62b0 1241
<> 128:9bcdf88f62b0 1242 function_context(F func, A *arg)
<> 128:9bcdf88f62b0 1243 : func(func), arg(arg) {}
<> 128:9bcdf88f62b0 1244
<> 128:9bcdf88f62b0 1245 R operator()(A0 a0) const {
<> 128:9bcdf88f62b0 1246 return func(arg, a0);
<> 128:9bcdf88f62b0 1247 }
<> 128:9bcdf88f62b0 1248 };
<> 128:9bcdf88f62b0 1249 };
<> 128:9bcdf88f62b0 1250
<> 128:9bcdf88f62b0 1251 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 1252 *
<> 128:9bcdf88f62b0 1253 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 1254 */
<> 128:9bcdf88f62b0 1255 template <typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 1256 class Callback<R(A0, A1)> {
<> 128:9bcdf88f62b0 1257 public:
<> 128:9bcdf88f62b0 1258 /** Create a Callback with a static function
<> 128:9bcdf88f62b0 1259 * @param func Static function to attach
<> 128:9bcdf88f62b0 1260 */
<> 128:9bcdf88f62b0 1261 Callback(R (*func)(A0, A1) = 0) {
<> 128:9bcdf88f62b0 1262 if (!func) {
<> 128:9bcdf88f62b0 1263 _ops = 0;
<> 128:9bcdf88f62b0 1264 } else {
<> 128:9bcdf88f62b0 1265 generate(func);
<> 128:9bcdf88f62b0 1266 }
<> 128:9bcdf88f62b0 1267 }
<> 128:9bcdf88f62b0 1268
<> 128:9bcdf88f62b0 1269 /** Attach a Callback
<> 128:9bcdf88f62b0 1270 * @param func The Callback to attach
<> 128:9bcdf88f62b0 1271 */
<> 128:9bcdf88f62b0 1272 Callback(const Callback<R(A0, A1)> &func) {
<> 128:9bcdf88f62b0 1273 if (func._ops) {
<> 128:9bcdf88f62b0 1274 func._ops->move(this, &func);
<> 128:9bcdf88f62b0 1275 }
<> 128:9bcdf88f62b0 1276 _ops = func._ops;
<> 128:9bcdf88f62b0 1277 }
<> 128:9bcdf88f62b0 1278
<> 128:9bcdf88f62b0 1279 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1280 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1281 * @param method Member function to attach
<> 128:9bcdf88f62b0 1282 */
<> 130:d75b3fe1f5cb 1283 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1284 Callback(U *obj, R (T::*method)(A0, A1)) {
<> 128:9bcdf88f62b0 1285 generate(method_context<T, R (T::*)(A0, A1)>(obj, method));
<> 128:9bcdf88f62b0 1286 }
<> 128:9bcdf88f62b0 1287
<> 128:9bcdf88f62b0 1288 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1289 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1290 * @param method Member function to attach
<> 128:9bcdf88f62b0 1291 */
<> 130:d75b3fe1f5cb 1292 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1293 Callback(const U *obj, R (T::*method)(A0, A1) const) {
<> 128:9bcdf88f62b0 1294 generate(method_context<const T, R (T::*)(A0, A1) const>(obj, method));
<> 128:9bcdf88f62b0 1295 }
<> 128:9bcdf88f62b0 1296
<> 128:9bcdf88f62b0 1297 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1298 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1299 * @param method Member function to attach
<> 128:9bcdf88f62b0 1300 */
<> 130:d75b3fe1f5cb 1301 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1302 Callback(volatile U *obj, R (T::*method)(A0, A1) volatile) {
<> 128:9bcdf88f62b0 1303 generate(method_context<volatile T, R (T::*)(A0, A1) volatile>(obj, method));
<> 128:9bcdf88f62b0 1304 }
<> 128:9bcdf88f62b0 1305
<> 128:9bcdf88f62b0 1306 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1307 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1308 * @param method Member function to attach
<> 128:9bcdf88f62b0 1309 */
<> 130:d75b3fe1f5cb 1310 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1311 Callback(const volatile U *obj, R (T::*method)(A0, A1) const volatile) {
<> 128:9bcdf88f62b0 1312 generate(method_context<const volatile T, R (T::*)(A0, A1) const volatile>(obj, method));
<> 128:9bcdf88f62b0 1313 }
<> 128:9bcdf88f62b0 1314
<> 128:9bcdf88f62b0 1315 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1316 * @param func Static function to attach
<> 128:9bcdf88f62b0 1317 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1318 */
<> 130:d75b3fe1f5cb 1319 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1320 Callback(R (*func)(T*, A0, A1), U *arg) {
<> 128:9bcdf88f62b0 1321 generate(function_context<R (*)(T*, A0, A1), T>(func, arg));
<> 128:9bcdf88f62b0 1322 }
<> 128:9bcdf88f62b0 1323
<> 128:9bcdf88f62b0 1324 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1325 * @param func Static function to attach
<> 128:9bcdf88f62b0 1326 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1327 */
<> 130:d75b3fe1f5cb 1328 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1329 Callback(R (*func)(const T*, A0, A1), const U *arg) {
<> 128:9bcdf88f62b0 1330 generate(function_context<R (*)(const T*, A0, A1), const T>(func, arg));
<> 128:9bcdf88f62b0 1331 }
<> 128:9bcdf88f62b0 1332
<> 128:9bcdf88f62b0 1333 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1334 * @param func Static function to attach
<> 128:9bcdf88f62b0 1335 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1336 */
<> 130:d75b3fe1f5cb 1337 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1338 Callback(R (*func)(volatile T*, A0, A1), volatile U *arg) {
<> 128:9bcdf88f62b0 1339 generate(function_context<R (*)(volatile T*, A0, A1), volatile T>(func, arg));
<> 128:9bcdf88f62b0 1340 }
<> 128:9bcdf88f62b0 1341
<> 128:9bcdf88f62b0 1342 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1343 * @param func Static function to attach
<> 128:9bcdf88f62b0 1344 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1345 */
<> 130:d75b3fe1f5cb 1346 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1347 Callback(R (*func)(const volatile T*, A0, A1), const volatile U *arg) {
<> 128:9bcdf88f62b0 1348 generate(function_context<R (*)(const volatile T*, A0, A1), const volatile T>(func, arg));
<> 128:9bcdf88f62b0 1349 }
<> 128:9bcdf88f62b0 1350
<> 128:9bcdf88f62b0 1351 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1352 * @param func Function object to attach
<> 128:9bcdf88f62b0 1353 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1354 */
<> 128:9bcdf88f62b0 1355 template <typename F>
<> 128:9bcdf88f62b0 1356 Callback(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1357 detail::is_type<R (F::*)(A0, A1), &F::operator()>::value &&
<> 128:9bcdf88f62b0 1358 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1359 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1360 generate(f);
<> 128:9bcdf88f62b0 1361 }
<> 128:9bcdf88f62b0 1362
<> 128:9bcdf88f62b0 1363 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1364 * @param func Function object to attach
<> 128:9bcdf88f62b0 1365 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1366 */
<> 128:9bcdf88f62b0 1367 template <typename F>
<> 128:9bcdf88f62b0 1368 Callback(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1369 detail::is_type<R (F::*)(A0, A1) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1370 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1371 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1372 generate(f);
<> 128:9bcdf88f62b0 1373 }
<> 128:9bcdf88f62b0 1374
<> 128:9bcdf88f62b0 1375 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1376 * @param func Function object to attach
<> 128:9bcdf88f62b0 1377 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1378 */
<> 128:9bcdf88f62b0 1379 template <typename F>
<> 128:9bcdf88f62b0 1380 Callback(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1381 detail::is_type<R (F::*)(A0, A1) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1382 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1383 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1384 generate(f);
<> 128:9bcdf88f62b0 1385 }
<> 128:9bcdf88f62b0 1386
<> 128:9bcdf88f62b0 1387 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1388 * @param func Function object to attach
<> 128:9bcdf88f62b0 1389 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1390 */
<> 128:9bcdf88f62b0 1391 template <typename F>
<> 128:9bcdf88f62b0 1392 Callback(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1393 detail::is_type<R (F::*)(A0, A1) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1394 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1395 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1396 generate(f);
<> 128:9bcdf88f62b0 1397 }
<> 128:9bcdf88f62b0 1398
<> 128:9bcdf88f62b0 1399 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1400 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1401 * @param func Static function to attach
<> 128:9bcdf88f62b0 1402 * @deprecated
<> 128:9bcdf88f62b0 1403 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 1404 */
<> 130:d75b3fe1f5cb 1405 template<typename T, typename U>
<> 128:9bcdf88f62b0 1406 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1407 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 1408 Callback(U *obj, R (*func)(T*, A0, A1)) {
<> 128:9bcdf88f62b0 1409 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1410 }
<> 128:9bcdf88f62b0 1411
<> 128:9bcdf88f62b0 1412 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1413 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1414 * @param func Static function to attach
<> 128:9bcdf88f62b0 1415 * @deprecated
<> 128:9bcdf88f62b0 1416 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 1417 */
<> 130:d75b3fe1f5cb 1418 template<typename T, typename U>
<> 128:9bcdf88f62b0 1419 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1420 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 1421 Callback(const U *obj, R (*func)(const T*, A0, A1)) {
<> 128:9bcdf88f62b0 1422 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1423 }
<> 128:9bcdf88f62b0 1424
<> 128:9bcdf88f62b0 1425 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1426 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1427 * @param func Static function to attach
<> 128:9bcdf88f62b0 1428 * @deprecated
<> 128:9bcdf88f62b0 1429 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 1430 */
<> 130:d75b3fe1f5cb 1431 template<typename T, typename U>
<> 128:9bcdf88f62b0 1432 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1433 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 1434 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1)) {
<> 128:9bcdf88f62b0 1435 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1436 }
<> 128:9bcdf88f62b0 1437
<> 128:9bcdf88f62b0 1438 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1439 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1440 * @param func Static function to attach
<> 128:9bcdf88f62b0 1441 * @deprecated
<> 128:9bcdf88f62b0 1442 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 1443 */
<> 130:d75b3fe1f5cb 1444 template<typename T, typename U>
<> 128:9bcdf88f62b0 1445 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1446 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 1447 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) {
<> 128:9bcdf88f62b0 1448 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1449 }
<> 128:9bcdf88f62b0 1450
<> 128:9bcdf88f62b0 1451 /** Destroy a callback
<> 128:9bcdf88f62b0 1452 */
<> 128:9bcdf88f62b0 1453 ~Callback() {
<> 128:9bcdf88f62b0 1454 if (_ops) {
<> 128:9bcdf88f62b0 1455 _ops->dtor(this);
<> 128:9bcdf88f62b0 1456 }
<> 128:9bcdf88f62b0 1457 }
<> 128:9bcdf88f62b0 1458
<> 128:9bcdf88f62b0 1459 /** Attach a static function
<> 128:9bcdf88f62b0 1460 * @param func Static function to attach
<> 138:093f2bd7b9eb 1461 * @deprecated
<> 138:093f2bd7b9eb 1462 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 1463 */
<> 138:093f2bd7b9eb 1464 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1465 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1466 void attach(R (*func)(A0, A1)) {
<> 128:9bcdf88f62b0 1467 this->~Callback();
<> 128:9bcdf88f62b0 1468 new (this) Callback(func);
<> 128:9bcdf88f62b0 1469 }
<> 128:9bcdf88f62b0 1470
<> 128:9bcdf88f62b0 1471 /** Attach a Callback
<> 128:9bcdf88f62b0 1472 * @param func The Callback to attach
<> 138:093f2bd7b9eb 1473 * @deprecated
<> 138:093f2bd7b9eb 1474 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 1475 */
<> 138:093f2bd7b9eb 1476 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1477 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1478 void attach(const Callback<R(A0, A1)> &func) {
<> 128:9bcdf88f62b0 1479 this->~Callback();
<> 128:9bcdf88f62b0 1480 new (this) Callback(func);
<> 128:9bcdf88f62b0 1481 }
<> 128:9bcdf88f62b0 1482
<> 128:9bcdf88f62b0 1483 /** Attach a member function
<> 128:9bcdf88f62b0 1484 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1485 * @param method Member function to attach
<> 138:093f2bd7b9eb 1486 * @deprecated
<> 138:093f2bd7b9eb 1487 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1488 */
<> 130:d75b3fe1f5cb 1489 template<typename T, typename U>
<> 138:093f2bd7b9eb 1490 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1491 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1492 void attach(U *obj, R (T::*method)(A0, A1)) {
<> 128:9bcdf88f62b0 1493 this->~Callback();
<> 128:9bcdf88f62b0 1494 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 1495 }
<> 128:9bcdf88f62b0 1496
<> 128:9bcdf88f62b0 1497 /** Attach a member function
<> 128:9bcdf88f62b0 1498 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1499 * @param method Member function to attach
<> 138:093f2bd7b9eb 1500 * @deprecated
<> 138:093f2bd7b9eb 1501 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1502 */
<> 130:d75b3fe1f5cb 1503 template<typename T, typename U>
<> 138:093f2bd7b9eb 1504 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1505 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1506 void attach(const U *obj, R (T::*method)(A0, A1) const) {
<> 128:9bcdf88f62b0 1507 this->~Callback();
<> 128:9bcdf88f62b0 1508 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 1509 }
<> 128:9bcdf88f62b0 1510
<> 128:9bcdf88f62b0 1511 /** Attach a member function
<> 128:9bcdf88f62b0 1512 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1513 * @param method Member function to attach
<> 138:093f2bd7b9eb 1514 * @deprecated
<> 138:093f2bd7b9eb 1515 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1516 */
<> 130:d75b3fe1f5cb 1517 template<typename T, typename U>
<> 138:093f2bd7b9eb 1518 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1519 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1520 void attach(volatile U *obj, R (T::*method)(A0, A1) volatile) {
<> 128:9bcdf88f62b0 1521 this->~Callback();
<> 128:9bcdf88f62b0 1522 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 1523 }
<> 128:9bcdf88f62b0 1524
<> 128:9bcdf88f62b0 1525 /** Attach a member function
<> 128:9bcdf88f62b0 1526 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1527 * @param method Member function to attach
<> 138:093f2bd7b9eb 1528 * @deprecated
<> 138:093f2bd7b9eb 1529 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1530 */
<> 130:d75b3fe1f5cb 1531 template<typename T, typename U>
<> 138:093f2bd7b9eb 1532 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1533 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1534 void attach(const volatile U *obj, R (T::*method)(A0, A1) const volatile) {
<> 128:9bcdf88f62b0 1535 this->~Callback();
<> 128:9bcdf88f62b0 1536 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 1537 }
<> 128:9bcdf88f62b0 1538
<> 128:9bcdf88f62b0 1539 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1540 * @param func Static function to attach
<> 128:9bcdf88f62b0 1541 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 1542 * @deprecated
<> 138:093f2bd7b9eb 1543 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1544 */
<> 130:d75b3fe1f5cb 1545 template <typename T, typename U>
<> 138:093f2bd7b9eb 1546 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1547 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1548 void attach(R (*func)(T*, A0, A1), U *arg) {
<> 128:9bcdf88f62b0 1549 this->~Callback();
<> 128:9bcdf88f62b0 1550 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 1551 }
<> 128:9bcdf88f62b0 1552
<> 128:9bcdf88f62b0 1553 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1554 * @param func Static function to attach
<> 128:9bcdf88f62b0 1555 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 1556 * @deprecated
<> 138:093f2bd7b9eb 1557 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1558 */
<> 130:d75b3fe1f5cb 1559 template <typename T, typename U>
<> 138:093f2bd7b9eb 1560 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1561 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1562 void attach(R (*func)(const T*, A0, A1), const U *arg) {
<> 128:9bcdf88f62b0 1563 this->~Callback();
<> 128:9bcdf88f62b0 1564 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 1565 }
<> 128:9bcdf88f62b0 1566
<> 128:9bcdf88f62b0 1567 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1568 * @param func Static function to attach
<> 128:9bcdf88f62b0 1569 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 1570 * @deprecated
<> 138:093f2bd7b9eb 1571 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1572 */
<> 130:d75b3fe1f5cb 1573 template <typename T, typename U>
<> 138:093f2bd7b9eb 1574 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1575 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1576 void attach(R (*func)(volatile T*, A0, A1), volatile U *arg) {
<> 128:9bcdf88f62b0 1577 this->~Callback();
<> 128:9bcdf88f62b0 1578 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 1579 }
<> 128:9bcdf88f62b0 1580
<> 128:9bcdf88f62b0 1581 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1582 * @param func Static function to attach
<> 128:9bcdf88f62b0 1583 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 1584 * @deprecated
<> 138:093f2bd7b9eb 1585 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1586 */
<> 130:d75b3fe1f5cb 1587 template <typename T, typename U>
<> 138:093f2bd7b9eb 1588 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1589 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 1590 void attach(R (*func)(const volatile T*, A0, A1), const volatile U *arg) {
<> 128:9bcdf88f62b0 1591 this->~Callback();
<> 128:9bcdf88f62b0 1592 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 1593 }
<> 128:9bcdf88f62b0 1594
<> 128:9bcdf88f62b0 1595 /** Attach a function object
<> 128:9bcdf88f62b0 1596 * @param func Function object to attach
<> 128:9bcdf88f62b0 1597 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1598 * @deprecated
<> 138:093f2bd7b9eb 1599 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1600 */
<> 128:9bcdf88f62b0 1601 template <typename F>
<> 138:093f2bd7b9eb 1602 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1603 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1604 void attach(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1605 detail::is_type<R (F::*)(A0, A1), &F::operator()>::value &&
<> 128:9bcdf88f62b0 1606 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1607 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1608 this->~Callback();
<> 128:9bcdf88f62b0 1609 new (this) Callback(f);
<> 128:9bcdf88f62b0 1610 }
<> 128:9bcdf88f62b0 1611
<> 128:9bcdf88f62b0 1612 /** Attach a function object
<> 128:9bcdf88f62b0 1613 * @param func Function object to attach
<> 128:9bcdf88f62b0 1614 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1615 * @deprecated
<> 138:093f2bd7b9eb 1616 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1617 */
<> 128:9bcdf88f62b0 1618 template <typename F>
<> 138:093f2bd7b9eb 1619 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1620 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1621 void attach(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1622 detail::is_type<R (F::*)(A0, A1) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1623 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1624 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1625 this->~Callback();
<> 128:9bcdf88f62b0 1626 new (this) Callback(f);
<> 128:9bcdf88f62b0 1627 }
<> 128:9bcdf88f62b0 1628
<> 128:9bcdf88f62b0 1629 /** Attach a function object
<> 128:9bcdf88f62b0 1630 * @param func Function object to attach
<> 128:9bcdf88f62b0 1631 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1632 * @deprecated
<> 138:093f2bd7b9eb 1633 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1634 */
<> 128:9bcdf88f62b0 1635 template <typename F>
<> 138:093f2bd7b9eb 1636 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1637 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1638 void attach(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1639 detail::is_type<R (F::*)(A0, A1) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1640 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1641 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1642 this->~Callback();
<> 128:9bcdf88f62b0 1643 new (this) Callback(f);
<> 128:9bcdf88f62b0 1644 }
<> 128:9bcdf88f62b0 1645
<> 128:9bcdf88f62b0 1646 /** Attach a function object
<> 128:9bcdf88f62b0 1647 * @param func Function object to attach
<> 128:9bcdf88f62b0 1648 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 1649 * @deprecated
<> 138:093f2bd7b9eb 1650 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 1651 */
<> 128:9bcdf88f62b0 1652 template <typename F>
<> 138:093f2bd7b9eb 1653 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 1654 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 1655 void attach(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1656 detail::is_type<R (F::*)(A0, A1) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1657 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1658 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1659 this->~Callback();
<> 128:9bcdf88f62b0 1660 new (this) Callback(f);
<> 128:9bcdf88f62b0 1661 }
<> 128:9bcdf88f62b0 1662
<> 128:9bcdf88f62b0 1663 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1664 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1665 * @param func Static function to attach
<> 128:9bcdf88f62b0 1666 * @deprecated
<> 128:9bcdf88f62b0 1667 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1668 */
<> 130:d75b3fe1f5cb 1669 template <typename T, typename U>
<> 128:9bcdf88f62b0 1670 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1671 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1672 void attach(U *obj, R (*func)(T*, A0, A1)) {
<> 128:9bcdf88f62b0 1673 this->~Callback();
<> 128:9bcdf88f62b0 1674 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1675 }
<> 128:9bcdf88f62b0 1676
<> 128:9bcdf88f62b0 1677 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1678 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1679 * @param func Static function to attach
<> 128:9bcdf88f62b0 1680 * @deprecated
<> 128:9bcdf88f62b0 1681 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1682 */
<> 130:d75b3fe1f5cb 1683 template <typename T, typename U>
<> 128:9bcdf88f62b0 1684 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1685 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1686 void attach(const U *obj, R (*func)(const T*, A0, A1)) {
<> 128:9bcdf88f62b0 1687 this->~Callback();
<> 128:9bcdf88f62b0 1688 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1689 }
<> 128:9bcdf88f62b0 1690
<> 128:9bcdf88f62b0 1691 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1692 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1693 * @param func Static function to attach
<> 128:9bcdf88f62b0 1694 * @deprecated
<> 128:9bcdf88f62b0 1695 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1696 */
<> 130:d75b3fe1f5cb 1697 template <typename T, typename U>
<> 128:9bcdf88f62b0 1698 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1699 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1700 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1)) {
<> 128:9bcdf88f62b0 1701 this->~Callback();
<> 128:9bcdf88f62b0 1702 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1703 }
<> 128:9bcdf88f62b0 1704
<> 128:9bcdf88f62b0 1705 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 1706 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1707 * @param func Static function to attach
<> 128:9bcdf88f62b0 1708 * @deprecated
<> 128:9bcdf88f62b0 1709 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 1710 */
<> 130:d75b3fe1f5cb 1711 template <typename T, typename U>
<> 128:9bcdf88f62b0 1712 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 1713 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 1714 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) {
<> 128:9bcdf88f62b0 1715 this->~Callback();
<> 128:9bcdf88f62b0 1716 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 1717 }
<> 128:9bcdf88f62b0 1718
<> 128:9bcdf88f62b0 1719 /** Assign a callback
<> 128:9bcdf88f62b0 1720 */
<> 128:9bcdf88f62b0 1721 Callback &operator=(const Callback &that) {
<> 128:9bcdf88f62b0 1722 if (this != &that) {
<> 128:9bcdf88f62b0 1723 this->~Callback();
<> 128:9bcdf88f62b0 1724 new (this) Callback(that);
<> 128:9bcdf88f62b0 1725 }
<> 128:9bcdf88f62b0 1726
<> 128:9bcdf88f62b0 1727 return *this;
<> 128:9bcdf88f62b0 1728 }
<> 128:9bcdf88f62b0 1729
<> 128:9bcdf88f62b0 1730 /** Call the attached function
<> 128:9bcdf88f62b0 1731 */
<> 128:9bcdf88f62b0 1732 R call(A0 a0, A1 a1) const {
<> 128:9bcdf88f62b0 1733 MBED_ASSERT(_ops);
<> 128:9bcdf88f62b0 1734 return _ops->call(this, a0, a1);
<> 128:9bcdf88f62b0 1735 }
<> 128:9bcdf88f62b0 1736
<> 128:9bcdf88f62b0 1737 /** Call the attached function
<> 128:9bcdf88f62b0 1738 */
<> 128:9bcdf88f62b0 1739 R operator()(A0 a0, A1 a1) const {
<> 128:9bcdf88f62b0 1740 return call(a0, a1);
<> 128:9bcdf88f62b0 1741 }
<> 128:9bcdf88f62b0 1742
<> 128:9bcdf88f62b0 1743 /** Test if function has been attached
<> 128:9bcdf88f62b0 1744 */
<> 128:9bcdf88f62b0 1745 operator bool() const {
<> 128:9bcdf88f62b0 1746 return _ops;
<> 128:9bcdf88f62b0 1747 }
<> 128:9bcdf88f62b0 1748
<> 128:9bcdf88f62b0 1749 /** Test for equality
<> 128:9bcdf88f62b0 1750 */
<> 128:9bcdf88f62b0 1751 friend bool operator==(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 1752 return memcmp(&l, &r, sizeof(Callback)) == 0;
<> 128:9bcdf88f62b0 1753 }
<> 128:9bcdf88f62b0 1754
<> 128:9bcdf88f62b0 1755 /** Test for inequality
<> 128:9bcdf88f62b0 1756 */
<> 128:9bcdf88f62b0 1757 friend bool operator!=(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 1758 return !(l == r);
<> 128:9bcdf88f62b0 1759 }
<> 128:9bcdf88f62b0 1760
<> 128:9bcdf88f62b0 1761 /** Static thunk for passing as C-style function
<> 128:9bcdf88f62b0 1762 * @param func Callback to call passed as void pointer
<> 128:9bcdf88f62b0 1763 */
<> 128:9bcdf88f62b0 1764 static R thunk(void *func, A0 a0, A1 a1) {
<> 128:9bcdf88f62b0 1765 return static_cast<Callback*>(func)->call(a0, a1);
<> 128:9bcdf88f62b0 1766 }
<> 128:9bcdf88f62b0 1767
<> 128:9bcdf88f62b0 1768 private:
<> 128:9bcdf88f62b0 1769 // Stored as pointer to function and pointer to optional object
<> 128:9bcdf88f62b0 1770 // Function pointer is stored as union of possible function types
<> 128:9bcdf88f62b0 1771 // to garuntee proper size and alignment
<> 128:9bcdf88f62b0 1772 struct _class;
<> 128:9bcdf88f62b0 1773 union {
<> 128:9bcdf88f62b0 1774 void (*_staticfunc)(A0, A1);
<> 128:9bcdf88f62b0 1775 void (*_boundfunc)(_class*, A0, A1);
<> 128:9bcdf88f62b0 1776 void (_class::*_methodfunc)(A0, A1);
<> 128:9bcdf88f62b0 1777 } _func;
<> 128:9bcdf88f62b0 1778 void *_obj;
<> 128:9bcdf88f62b0 1779
<> 128:9bcdf88f62b0 1780 // Dynamically dispatched operations
<> 128:9bcdf88f62b0 1781 const struct ops {
<> 128:9bcdf88f62b0 1782 R (*call)(const void*, A0, A1);
<> 128:9bcdf88f62b0 1783 void (*move)(void*, const void*);
<> 128:9bcdf88f62b0 1784 void (*dtor)(void*);
<> 128:9bcdf88f62b0 1785 } *_ops;
<> 128:9bcdf88f62b0 1786
<> 128:9bcdf88f62b0 1787 // Generate operations for function object
<> 128:9bcdf88f62b0 1788 template <typename F>
<> 128:9bcdf88f62b0 1789 void generate(const F &f) {
<> 128:9bcdf88f62b0 1790 static const ops ops = {
<> 128:9bcdf88f62b0 1791 &Callback::function_call<F>,
<> 128:9bcdf88f62b0 1792 &Callback::function_move<F>,
<> 128:9bcdf88f62b0 1793 &Callback::function_dtor<F>,
<> 128:9bcdf88f62b0 1794 };
<> 128:9bcdf88f62b0 1795
<> 130:d75b3fe1f5cb 1796 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
<> 130:d75b3fe1f5cb 1797 "Type F must not exceed the size of the Callback class");
<> 128:9bcdf88f62b0 1798 new (this) F(f);
<> 128:9bcdf88f62b0 1799 _ops = &ops;
<> 128:9bcdf88f62b0 1800 }
<> 128:9bcdf88f62b0 1801
<> 128:9bcdf88f62b0 1802 // Function attributes
<> 128:9bcdf88f62b0 1803 template <typename F>
<> 128:9bcdf88f62b0 1804 static R function_call(const void *p, A0 a0, A1 a1) {
<> 128:9bcdf88f62b0 1805 return (*(F*)p)(a0, a1);
<> 128:9bcdf88f62b0 1806 }
<> 128:9bcdf88f62b0 1807
<> 128:9bcdf88f62b0 1808 template <typename F>
<> 128:9bcdf88f62b0 1809 static void function_move(void *d, const void *p) {
<> 128:9bcdf88f62b0 1810 new (d) F(*(F*)p);
<> 128:9bcdf88f62b0 1811 }
<> 128:9bcdf88f62b0 1812
<> 128:9bcdf88f62b0 1813 template <typename F>
<> 128:9bcdf88f62b0 1814 static void function_dtor(void *p) {
<> 128:9bcdf88f62b0 1815 ((F*)p)->~F();
<> 128:9bcdf88f62b0 1816 }
<> 128:9bcdf88f62b0 1817
<> 128:9bcdf88f62b0 1818 // Wrappers for functions with context
<> 128:9bcdf88f62b0 1819 template <typename O, typename M>
<> 128:9bcdf88f62b0 1820 struct method_context {
<> 128:9bcdf88f62b0 1821 M method;
<> 128:9bcdf88f62b0 1822 O *obj;
<> 128:9bcdf88f62b0 1823
<> 128:9bcdf88f62b0 1824 method_context(O *obj, M method)
<> 128:9bcdf88f62b0 1825 : method(method), obj(obj) {}
<> 128:9bcdf88f62b0 1826
<> 128:9bcdf88f62b0 1827 R operator()(A0 a0, A1 a1) const {
<> 128:9bcdf88f62b0 1828 return (obj->*method)(a0, a1);
<> 128:9bcdf88f62b0 1829 }
<> 128:9bcdf88f62b0 1830 };
<> 128:9bcdf88f62b0 1831
<> 128:9bcdf88f62b0 1832 template <typename F, typename A>
<> 128:9bcdf88f62b0 1833 struct function_context {
<> 128:9bcdf88f62b0 1834 F func;
<> 128:9bcdf88f62b0 1835 A *arg;
<> 128:9bcdf88f62b0 1836
<> 128:9bcdf88f62b0 1837 function_context(F func, A *arg)
<> 128:9bcdf88f62b0 1838 : func(func), arg(arg) {}
<> 128:9bcdf88f62b0 1839
<> 128:9bcdf88f62b0 1840 R operator()(A0 a0, A1 a1) const {
<> 128:9bcdf88f62b0 1841 return func(arg, a0, a1);
<> 128:9bcdf88f62b0 1842 }
<> 128:9bcdf88f62b0 1843 };
<> 128:9bcdf88f62b0 1844 };
<> 128:9bcdf88f62b0 1845
<> 128:9bcdf88f62b0 1846 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 1847 *
<> 128:9bcdf88f62b0 1848 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 1849 */
<> 128:9bcdf88f62b0 1850 template <typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 1851 class Callback<R(A0, A1, A2)> {
<> 128:9bcdf88f62b0 1852 public:
<> 128:9bcdf88f62b0 1853 /** Create a Callback with a static function
<> 128:9bcdf88f62b0 1854 * @param func Static function to attach
<> 128:9bcdf88f62b0 1855 */
<> 128:9bcdf88f62b0 1856 Callback(R (*func)(A0, A1, A2) = 0) {
<> 128:9bcdf88f62b0 1857 if (!func) {
<> 128:9bcdf88f62b0 1858 _ops = 0;
<> 128:9bcdf88f62b0 1859 } else {
<> 128:9bcdf88f62b0 1860 generate(func);
<> 128:9bcdf88f62b0 1861 }
<> 128:9bcdf88f62b0 1862 }
<> 128:9bcdf88f62b0 1863
<> 128:9bcdf88f62b0 1864 /** Attach a Callback
<> 128:9bcdf88f62b0 1865 * @param func The Callback to attach
<> 128:9bcdf88f62b0 1866 */
<> 128:9bcdf88f62b0 1867 Callback(const Callback<R(A0, A1, A2)> &func) {
<> 128:9bcdf88f62b0 1868 if (func._ops) {
<> 128:9bcdf88f62b0 1869 func._ops->move(this, &func);
<> 128:9bcdf88f62b0 1870 }
<> 128:9bcdf88f62b0 1871 _ops = func._ops;
<> 128:9bcdf88f62b0 1872 }
<> 128:9bcdf88f62b0 1873
<> 128:9bcdf88f62b0 1874 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1875 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1876 * @param method Member function to attach
<> 128:9bcdf88f62b0 1877 */
<> 130:d75b3fe1f5cb 1878 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1879 Callback(U *obj, R (T::*method)(A0, A1, A2)) {
<> 128:9bcdf88f62b0 1880 generate(method_context<T, R (T::*)(A0, A1, A2)>(obj, method));
<> 128:9bcdf88f62b0 1881 }
<> 128:9bcdf88f62b0 1882
<> 128:9bcdf88f62b0 1883 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1884 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1885 * @param method Member function to attach
<> 128:9bcdf88f62b0 1886 */
<> 130:d75b3fe1f5cb 1887 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1888 Callback(const U *obj, R (T::*method)(A0, A1, A2) const) {
<> 128:9bcdf88f62b0 1889 generate(method_context<const T, R (T::*)(A0, A1, A2) const>(obj, method));
<> 128:9bcdf88f62b0 1890 }
<> 128:9bcdf88f62b0 1891
<> 128:9bcdf88f62b0 1892 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1893 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1894 * @param method Member function to attach
<> 128:9bcdf88f62b0 1895 */
<> 130:d75b3fe1f5cb 1896 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1897 Callback(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) {
<> 128:9bcdf88f62b0 1898 generate(method_context<volatile T, R (T::*)(A0, A1, A2) volatile>(obj, method));
<> 128:9bcdf88f62b0 1899 }
<> 128:9bcdf88f62b0 1900
<> 128:9bcdf88f62b0 1901 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 1902 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 1903 * @param method Member function to attach
<> 128:9bcdf88f62b0 1904 */
<> 130:d75b3fe1f5cb 1905 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1906 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) {
<> 128:9bcdf88f62b0 1907 generate(method_context<const volatile T, R (T::*)(A0, A1, A2) const volatile>(obj, method));
<> 128:9bcdf88f62b0 1908 }
<> 128:9bcdf88f62b0 1909
<> 128:9bcdf88f62b0 1910 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1911 * @param func Static function to attach
<> 128:9bcdf88f62b0 1912 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1913 */
<> 130:d75b3fe1f5cb 1914 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1915 Callback(R (*func)(T*, A0, A1, A2), U *arg) {
<> 128:9bcdf88f62b0 1916 generate(function_context<R (*)(T*, A0, A1, A2), T>(func, arg));
<> 128:9bcdf88f62b0 1917 }
<> 128:9bcdf88f62b0 1918
<> 128:9bcdf88f62b0 1919 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1920 * @param func Static function to attach
<> 128:9bcdf88f62b0 1921 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1922 */
<> 130:d75b3fe1f5cb 1923 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1924 Callback(R (*func)(const T*, A0, A1, A2), const U *arg) {
<> 128:9bcdf88f62b0 1925 generate(function_context<R (*)(const T*, A0, A1, A2), const T>(func, arg));
<> 128:9bcdf88f62b0 1926 }
<> 128:9bcdf88f62b0 1927
<> 128:9bcdf88f62b0 1928 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1929 * @param func Static function to attach
<> 128:9bcdf88f62b0 1930 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1931 */
<> 130:d75b3fe1f5cb 1932 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1933 Callback(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) {
<> 128:9bcdf88f62b0 1934 generate(function_context<R (*)(volatile T*, A0, A1, A2), volatile T>(func, arg));
<> 128:9bcdf88f62b0 1935 }
<> 128:9bcdf88f62b0 1936
<> 128:9bcdf88f62b0 1937 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1938 * @param func Static function to attach
<> 128:9bcdf88f62b0 1939 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 1940 */
<> 130:d75b3fe1f5cb 1941 template<typename T, typename U>
<> 130:d75b3fe1f5cb 1942 Callback(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) {
<> 128:9bcdf88f62b0 1943 generate(function_context<R (*)(const volatile T*, A0, A1, A2), const volatile T>(func, arg));
<> 128:9bcdf88f62b0 1944 }
<> 128:9bcdf88f62b0 1945
<> 128:9bcdf88f62b0 1946 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1947 * @param func Function object to attach
<> 128:9bcdf88f62b0 1948 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1949 */
<> 128:9bcdf88f62b0 1950 template <typename F>
<> 128:9bcdf88f62b0 1951 Callback(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1952 detail::is_type<R (F::*)(A0, A1, A2), &F::operator()>::value &&
<> 128:9bcdf88f62b0 1953 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1954 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1955 generate(f);
<> 128:9bcdf88f62b0 1956 }
<> 128:9bcdf88f62b0 1957
<> 128:9bcdf88f62b0 1958 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1959 * @param func Function object to attach
<> 128:9bcdf88f62b0 1960 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1961 */
<> 128:9bcdf88f62b0 1962 template <typename F>
<> 128:9bcdf88f62b0 1963 Callback(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1964 detail::is_type<R (F::*)(A0, A1, A2) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1965 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1966 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1967 generate(f);
<> 128:9bcdf88f62b0 1968 }
<> 128:9bcdf88f62b0 1969
<> 128:9bcdf88f62b0 1970 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1971 * @param func Function object to attach
<> 128:9bcdf88f62b0 1972 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1973 */
<> 128:9bcdf88f62b0 1974 template <typename F>
<> 128:9bcdf88f62b0 1975 Callback(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1976 detail::is_type<R (F::*)(A0, A1, A2) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1977 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1978 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1979 generate(f);
<> 128:9bcdf88f62b0 1980 }
<> 128:9bcdf88f62b0 1981
<> 128:9bcdf88f62b0 1982 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 1983 * @param func Function object to attach
<> 128:9bcdf88f62b0 1984 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 1985 */
<> 128:9bcdf88f62b0 1986 template <typename F>
<> 128:9bcdf88f62b0 1987 Callback(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 1988 detail::is_type<R (F::*)(A0, A1, A2) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 1989 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 1990 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 1991 generate(f);
<> 128:9bcdf88f62b0 1992 }
<> 128:9bcdf88f62b0 1993
<> 128:9bcdf88f62b0 1994 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 1995 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 1996 * @param func Static function to attach
<> 128:9bcdf88f62b0 1997 * @deprecated
<> 128:9bcdf88f62b0 1998 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 1999 */
<> 130:d75b3fe1f5cb 2000 template<typename T, typename U>
<> 128:9bcdf88f62b0 2001 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2002 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2003 Callback(U *obj, R (*func)(T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2004 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2005 }
<> 128:9bcdf88f62b0 2006
<> 128:9bcdf88f62b0 2007 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2008 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2009 * @param func Static function to attach
<> 128:9bcdf88f62b0 2010 * @deprecated
<> 128:9bcdf88f62b0 2011 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2012 */
<> 130:d75b3fe1f5cb 2013 template<typename T, typename U>
<> 128:9bcdf88f62b0 2014 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2015 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2016 Callback(const U *obj, R (*func)(const T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2017 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2018 }
<> 128:9bcdf88f62b0 2019
<> 128:9bcdf88f62b0 2020 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2021 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2022 * @param func Static function to attach
<> 128:9bcdf88f62b0 2023 * @deprecated
<> 128:9bcdf88f62b0 2024 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2025 */
<> 130:d75b3fe1f5cb 2026 template<typename T, typename U>
<> 128:9bcdf88f62b0 2027 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2028 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2029 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2030 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2031 }
<> 128:9bcdf88f62b0 2032
<> 128:9bcdf88f62b0 2033 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2034 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2035 * @param func Static function to attach
<> 128:9bcdf88f62b0 2036 * @deprecated
<> 128:9bcdf88f62b0 2037 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2038 */
<> 130:d75b3fe1f5cb 2039 template<typename T, typename U>
<> 128:9bcdf88f62b0 2040 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2041 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2042 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2043 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2044 }
<> 128:9bcdf88f62b0 2045
<> 128:9bcdf88f62b0 2046 /** Destroy a callback
<> 128:9bcdf88f62b0 2047 */
<> 128:9bcdf88f62b0 2048 ~Callback() {
<> 128:9bcdf88f62b0 2049 if (_ops) {
<> 128:9bcdf88f62b0 2050 _ops->dtor(this);
<> 128:9bcdf88f62b0 2051 }
<> 128:9bcdf88f62b0 2052 }
<> 128:9bcdf88f62b0 2053
<> 128:9bcdf88f62b0 2054 /** Attach a static function
<> 128:9bcdf88f62b0 2055 * @param func Static function to attach
<> 138:093f2bd7b9eb 2056 * @deprecated
<> 138:093f2bd7b9eb 2057 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 2058 */
<> 138:093f2bd7b9eb 2059 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2060 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2061 void attach(R (*func)(A0, A1, A2)) {
<> 128:9bcdf88f62b0 2062 this->~Callback();
<> 128:9bcdf88f62b0 2063 new (this) Callback(func);
<> 128:9bcdf88f62b0 2064 }
<> 128:9bcdf88f62b0 2065
<> 128:9bcdf88f62b0 2066 /** Attach a Callback
<> 128:9bcdf88f62b0 2067 * @param func The Callback to attach
<> 138:093f2bd7b9eb 2068 * @deprecated
<> 138:093f2bd7b9eb 2069 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 2070 */
<> 138:093f2bd7b9eb 2071 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2072 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2073 void attach(const Callback<R(A0, A1, A2)> &func) {
<> 128:9bcdf88f62b0 2074 this->~Callback();
<> 128:9bcdf88f62b0 2075 new (this) Callback(func);
<> 128:9bcdf88f62b0 2076 }
<> 128:9bcdf88f62b0 2077
<> 128:9bcdf88f62b0 2078 /** Attach a member function
<> 128:9bcdf88f62b0 2079 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2080 * @param method Member function to attach
<> 138:093f2bd7b9eb 2081 * @deprecated
<> 138:093f2bd7b9eb 2082 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2083 */
<> 130:d75b3fe1f5cb 2084 template<typename T, typename U>
<> 138:093f2bd7b9eb 2085 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2086 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2087 void attach(U *obj, R (T::*method)(A0, A1, A2)) {
<> 128:9bcdf88f62b0 2088 this->~Callback();
<> 128:9bcdf88f62b0 2089 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2090 }
<> 128:9bcdf88f62b0 2091
<> 128:9bcdf88f62b0 2092 /** Attach a member function
<> 128:9bcdf88f62b0 2093 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2094 * @param method Member function to attach
<> 138:093f2bd7b9eb 2095 * @deprecated
<> 138:093f2bd7b9eb 2096 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2097 */
<> 130:d75b3fe1f5cb 2098 template<typename T, typename U>
<> 138:093f2bd7b9eb 2099 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2100 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2101 void attach(const U *obj, R (T::*method)(A0, A1, A2) const) {
<> 128:9bcdf88f62b0 2102 this->~Callback();
<> 128:9bcdf88f62b0 2103 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2104 }
<> 128:9bcdf88f62b0 2105
<> 128:9bcdf88f62b0 2106 /** Attach a member function
<> 128:9bcdf88f62b0 2107 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2108 * @param method Member function to attach
<> 138:093f2bd7b9eb 2109 * @deprecated
<> 138:093f2bd7b9eb 2110 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2111 */
<> 130:d75b3fe1f5cb 2112 template<typename T, typename U>
<> 138:093f2bd7b9eb 2113 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2114 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2115 void attach(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) {
<> 128:9bcdf88f62b0 2116 this->~Callback();
<> 128:9bcdf88f62b0 2117 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2118 }
<> 128:9bcdf88f62b0 2119
<> 128:9bcdf88f62b0 2120 /** Attach a member function
<> 128:9bcdf88f62b0 2121 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2122 * @param method Member function to attach
<> 138:093f2bd7b9eb 2123 * @deprecated
<> 138:093f2bd7b9eb 2124 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2125 */
<> 130:d75b3fe1f5cb 2126 template<typename T, typename U>
<> 138:093f2bd7b9eb 2127 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2128 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2129 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) {
<> 128:9bcdf88f62b0 2130 this->~Callback();
<> 128:9bcdf88f62b0 2131 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2132 }
<> 128:9bcdf88f62b0 2133
<> 128:9bcdf88f62b0 2134 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2135 * @param func Static function to attach
<> 128:9bcdf88f62b0 2136 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2137 * @deprecated
<> 138:093f2bd7b9eb 2138 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2139 */
<> 130:d75b3fe1f5cb 2140 template <typename T, typename U>
<> 138:093f2bd7b9eb 2141 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2142 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2143 void attach(R (*func)(T*, A0, A1, A2), U *arg) {
<> 128:9bcdf88f62b0 2144 this->~Callback();
<> 128:9bcdf88f62b0 2145 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2146 }
<> 128:9bcdf88f62b0 2147
<> 128:9bcdf88f62b0 2148 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2149 * @param func Static function to attach
<> 128:9bcdf88f62b0 2150 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2151 * @deprecated
<> 138:093f2bd7b9eb 2152 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2153 */
<> 130:d75b3fe1f5cb 2154 template <typename T, typename U>
<> 138:093f2bd7b9eb 2155 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2156 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2157 void attach(R (*func)(const T*, A0, A1, A2), const U *arg) {
<> 128:9bcdf88f62b0 2158 this->~Callback();
<> 128:9bcdf88f62b0 2159 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2160 }
<> 128:9bcdf88f62b0 2161
<> 128:9bcdf88f62b0 2162 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2163 * @param func Static function to attach
<> 128:9bcdf88f62b0 2164 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2165 * @deprecated
<> 138:093f2bd7b9eb 2166 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2167 */
<> 130:d75b3fe1f5cb 2168 template <typename T, typename U>
<> 138:093f2bd7b9eb 2169 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2170 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2171 void attach(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) {
<> 128:9bcdf88f62b0 2172 this->~Callback();
<> 128:9bcdf88f62b0 2173 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2174 }
<> 128:9bcdf88f62b0 2175
<> 128:9bcdf88f62b0 2176 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2177 * @param func Static function to attach
<> 128:9bcdf88f62b0 2178 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2179 * @deprecated
<> 138:093f2bd7b9eb 2180 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2181 */
<> 130:d75b3fe1f5cb 2182 template <typename T, typename U>
<> 138:093f2bd7b9eb 2183 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2184 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2185 void attach(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) {
<> 128:9bcdf88f62b0 2186 this->~Callback();
<> 128:9bcdf88f62b0 2187 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2188 }
<> 128:9bcdf88f62b0 2189
<> 128:9bcdf88f62b0 2190 /** Attach a function object
<> 128:9bcdf88f62b0 2191 * @param func Function object to attach
<> 128:9bcdf88f62b0 2192 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2193 * @deprecated
<> 138:093f2bd7b9eb 2194 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2195 */
<> 128:9bcdf88f62b0 2196 template <typename F>
<> 138:093f2bd7b9eb 2197 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2198 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2199 void attach(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2200 detail::is_type<R (F::*)(A0, A1, A2), &F::operator()>::value &&
<> 128:9bcdf88f62b0 2201 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2202 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2203 this->~Callback();
<> 128:9bcdf88f62b0 2204 new (this) Callback(f);
<> 128:9bcdf88f62b0 2205 }
<> 128:9bcdf88f62b0 2206
<> 128:9bcdf88f62b0 2207 /** Attach a function object
<> 128:9bcdf88f62b0 2208 * @param func Function object to attach
<> 128:9bcdf88f62b0 2209 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2210 * @deprecated
<> 138:093f2bd7b9eb 2211 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2212 */
<> 128:9bcdf88f62b0 2213 template <typename F>
<> 138:093f2bd7b9eb 2214 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2215 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2216 void attach(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2217 detail::is_type<R (F::*)(A0, A1, A2) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2218 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2219 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2220 this->~Callback();
<> 128:9bcdf88f62b0 2221 new (this) Callback(f);
<> 128:9bcdf88f62b0 2222 }
<> 128:9bcdf88f62b0 2223
<> 128:9bcdf88f62b0 2224 /** Attach a function object
<> 128:9bcdf88f62b0 2225 * @param func Function object to attach
<> 128:9bcdf88f62b0 2226 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2227 * @deprecated
<> 138:093f2bd7b9eb 2228 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2229 */
<> 128:9bcdf88f62b0 2230 template <typename F>
<> 138:093f2bd7b9eb 2231 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2232 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2233 void attach(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2234 detail::is_type<R (F::*)(A0, A1, A2) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2235 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2236 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2237 this->~Callback();
<> 128:9bcdf88f62b0 2238 new (this) Callback(f);
<> 128:9bcdf88f62b0 2239 }
<> 128:9bcdf88f62b0 2240
<> 128:9bcdf88f62b0 2241 /** Attach a function object
<> 128:9bcdf88f62b0 2242 * @param func Function object to attach
<> 128:9bcdf88f62b0 2243 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2244 * @deprecated
<> 138:093f2bd7b9eb 2245 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2246 */
<> 128:9bcdf88f62b0 2247 template <typename F>
<> 138:093f2bd7b9eb 2248 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2249 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2250 void attach(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2251 detail::is_type<R (F::*)(A0, A1, A2) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2252 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2253 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2254 this->~Callback();
<> 128:9bcdf88f62b0 2255 new (this) Callback(f);
<> 128:9bcdf88f62b0 2256 }
<> 128:9bcdf88f62b0 2257
<> 128:9bcdf88f62b0 2258 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2259 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2260 * @param func Static function to attach
<> 128:9bcdf88f62b0 2261 * @deprecated
<> 128:9bcdf88f62b0 2262 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2263 */
<> 130:d75b3fe1f5cb 2264 template <typename T, typename U>
<> 128:9bcdf88f62b0 2265 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2266 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2267 void attach(U *obj, R (*func)(T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2268 this->~Callback();
<> 128:9bcdf88f62b0 2269 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2270 }
<> 128:9bcdf88f62b0 2271
<> 128:9bcdf88f62b0 2272 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2273 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2274 * @param func Static function to attach
<> 128:9bcdf88f62b0 2275 * @deprecated
<> 128:9bcdf88f62b0 2276 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2277 */
<> 130:d75b3fe1f5cb 2278 template <typename T, typename U>
<> 128:9bcdf88f62b0 2279 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2280 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2281 void attach(const U *obj, R (*func)(const T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2282 this->~Callback();
<> 128:9bcdf88f62b0 2283 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2284 }
<> 128:9bcdf88f62b0 2285
<> 128:9bcdf88f62b0 2286 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2287 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2288 * @param func Static function to attach
<> 128:9bcdf88f62b0 2289 * @deprecated
<> 128:9bcdf88f62b0 2290 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2291 */
<> 130:d75b3fe1f5cb 2292 template <typename T, typename U>
<> 128:9bcdf88f62b0 2293 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2294 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2295 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2296 this->~Callback();
<> 128:9bcdf88f62b0 2297 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2298 }
<> 128:9bcdf88f62b0 2299
<> 128:9bcdf88f62b0 2300 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2301 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2302 * @param func Static function to attach
<> 128:9bcdf88f62b0 2303 * @deprecated
<> 128:9bcdf88f62b0 2304 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2305 */
<> 130:d75b3fe1f5cb 2306 template <typename T, typename U>
<> 128:9bcdf88f62b0 2307 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2308 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2309 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 2310 this->~Callback();
<> 128:9bcdf88f62b0 2311 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2312 }
<> 128:9bcdf88f62b0 2313
<> 128:9bcdf88f62b0 2314 /** Assign a callback
<> 128:9bcdf88f62b0 2315 */
<> 128:9bcdf88f62b0 2316 Callback &operator=(const Callback &that) {
<> 128:9bcdf88f62b0 2317 if (this != &that) {
<> 128:9bcdf88f62b0 2318 this->~Callback();
<> 128:9bcdf88f62b0 2319 new (this) Callback(that);
<> 128:9bcdf88f62b0 2320 }
<> 128:9bcdf88f62b0 2321
<> 128:9bcdf88f62b0 2322 return *this;
<> 128:9bcdf88f62b0 2323 }
<> 128:9bcdf88f62b0 2324
<> 128:9bcdf88f62b0 2325 /** Call the attached function
<> 128:9bcdf88f62b0 2326 */
<> 128:9bcdf88f62b0 2327 R call(A0 a0, A1 a1, A2 a2) const {
<> 128:9bcdf88f62b0 2328 MBED_ASSERT(_ops);
<> 128:9bcdf88f62b0 2329 return _ops->call(this, a0, a1, a2);
<> 128:9bcdf88f62b0 2330 }
<> 128:9bcdf88f62b0 2331
<> 128:9bcdf88f62b0 2332 /** Call the attached function
<> 128:9bcdf88f62b0 2333 */
<> 128:9bcdf88f62b0 2334 R operator()(A0 a0, A1 a1, A2 a2) const {
<> 128:9bcdf88f62b0 2335 return call(a0, a1, a2);
<> 128:9bcdf88f62b0 2336 }
<> 128:9bcdf88f62b0 2337
<> 128:9bcdf88f62b0 2338 /** Test if function has been attached
<> 128:9bcdf88f62b0 2339 */
<> 128:9bcdf88f62b0 2340 operator bool() const {
<> 128:9bcdf88f62b0 2341 return _ops;
<> 128:9bcdf88f62b0 2342 }
<> 128:9bcdf88f62b0 2343
<> 128:9bcdf88f62b0 2344 /** Test for equality
<> 128:9bcdf88f62b0 2345 */
<> 128:9bcdf88f62b0 2346 friend bool operator==(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 2347 return memcmp(&l, &r, sizeof(Callback)) == 0;
<> 128:9bcdf88f62b0 2348 }
<> 128:9bcdf88f62b0 2349
<> 128:9bcdf88f62b0 2350 /** Test for inequality
<> 128:9bcdf88f62b0 2351 */
<> 128:9bcdf88f62b0 2352 friend bool operator!=(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 2353 return !(l == r);
<> 128:9bcdf88f62b0 2354 }
<> 128:9bcdf88f62b0 2355
<> 128:9bcdf88f62b0 2356 /** Static thunk for passing as C-style function
<> 128:9bcdf88f62b0 2357 * @param func Callback to call passed as void pointer
<> 128:9bcdf88f62b0 2358 */
<> 128:9bcdf88f62b0 2359 static R thunk(void *func, A0 a0, A1 a1, A2 a2) {
<> 128:9bcdf88f62b0 2360 return static_cast<Callback*>(func)->call(a0, a1, a2);
<> 128:9bcdf88f62b0 2361 }
<> 128:9bcdf88f62b0 2362
<> 128:9bcdf88f62b0 2363 private:
<> 128:9bcdf88f62b0 2364 // Stored as pointer to function and pointer to optional object
<> 128:9bcdf88f62b0 2365 // Function pointer is stored as union of possible function types
<> 128:9bcdf88f62b0 2366 // to garuntee proper size and alignment
<> 128:9bcdf88f62b0 2367 struct _class;
<> 128:9bcdf88f62b0 2368 union {
<> 128:9bcdf88f62b0 2369 void (*_staticfunc)(A0, A1, A2);
<> 128:9bcdf88f62b0 2370 void (*_boundfunc)(_class*, A0, A1, A2);
<> 128:9bcdf88f62b0 2371 void (_class::*_methodfunc)(A0, A1, A2);
<> 128:9bcdf88f62b0 2372 } _func;
<> 128:9bcdf88f62b0 2373 void *_obj;
<> 128:9bcdf88f62b0 2374
<> 128:9bcdf88f62b0 2375 // Dynamically dispatched operations
<> 128:9bcdf88f62b0 2376 const struct ops {
<> 128:9bcdf88f62b0 2377 R (*call)(const void*, A0, A1, A2);
<> 128:9bcdf88f62b0 2378 void (*move)(void*, const void*);
<> 128:9bcdf88f62b0 2379 void (*dtor)(void*);
<> 128:9bcdf88f62b0 2380 } *_ops;
<> 128:9bcdf88f62b0 2381
<> 128:9bcdf88f62b0 2382 // Generate operations for function object
<> 128:9bcdf88f62b0 2383 template <typename F>
<> 128:9bcdf88f62b0 2384 void generate(const F &f) {
<> 128:9bcdf88f62b0 2385 static const ops ops = {
<> 128:9bcdf88f62b0 2386 &Callback::function_call<F>,
<> 128:9bcdf88f62b0 2387 &Callback::function_move<F>,
<> 128:9bcdf88f62b0 2388 &Callback::function_dtor<F>,
<> 128:9bcdf88f62b0 2389 };
<> 128:9bcdf88f62b0 2390
<> 130:d75b3fe1f5cb 2391 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
<> 130:d75b3fe1f5cb 2392 "Type F must not exceed the size of the Callback class");
<> 128:9bcdf88f62b0 2393 new (this) F(f);
<> 128:9bcdf88f62b0 2394 _ops = &ops;
<> 128:9bcdf88f62b0 2395 }
<> 128:9bcdf88f62b0 2396
<> 128:9bcdf88f62b0 2397 // Function attributes
<> 128:9bcdf88f62b0 2398 template <typename F>
<> 128:9bcdf88f62b0 2399 static R function_call(const void *p, A0 a0, A1 a1, A2 a2) {
<> 128:9bcdf88f62b0 2400 return (*(F*)p)(a0, a1, a2);
<> 128:9bcdf88f62b0 2401 }
<> 128:9bcdf88f62b0 2402
<> 128:9bcdf88f62b0 2403 template <typename F>
<> 128:9bcdf88f62b0 2404 static void function_move(void *d, const void *p) {
<> 128:9bcdf88f62b0 2405 new (d) F(*(F*)p);
<> 128:9bcdf88f62b0 2406 }
<> 128:9bcdf88f62b0 2407
<> 128:9bcdf88f62b0 2408 template <typename F>
<> 128:9bcdf88f62b0 2409 static void function_dtor(void *p) {
<> 128:9bcdf88f62b0 2410 ((F*)p)->~F();
<> 128:9bcdf88f62b0 2411 }
<> 128:9bcdf88f62b0 2412
<> 128:9bcdf88f62b0 2413 // Wrappers for functions with context
<> 128:9bcdf88f62b0 2414 template <typename O, typename M>
<> 128:9bcdf88f62b0 2415 struct method_context {
<> 128:9bcdf88f62b0 2416 M method;
<> 128:9bcdf88f62b0 2417 O *obj;
<> 128:9bcdf88f62b0 2418
<> 128:9bcdf88f62b0 2419 method_context(O *obj, M method)
<> 128:9bcdf88f62b0 2420 : method(method), obj(obj) {}
<> 128:9bcdf88f62b0 2421
<> 128:9bcdf88f62b0 2422 R operator()(A0 a0, A1 a1, A2 a2) const {
<> 128:9bcdf88f62b0 2423 return (obj->*method)(a0, a1, a2);
<> 128:9bcdf88f62b0 2424 }
<> 128:9bcdf88f62b0 2425 };
<> 128:9bcdf88f62b0 2426
<> 128:9bcdf88f62b0 2427 template <typename F, typename A>
<> 128:9bcdf88f62b0 2428 struct function_context {
<> 128:9bcdf88f62b0 2429 F func;
<> 128:9bcdf88f62b0 2430 A *arg;
<> 128:9bcdf88f62b0 2431
<> 128:9bcdf88f62b0 2432 function_context(F func, A *arg)
<> 128:9bcdf88f62b0 2433 : func(func), arg(arg) {}
<> 128:9bcdf88f62b0 2434
<> 128:9bcdf88f62b0 2435 R operator()(A0 a0, A1 a1, A2 a2) const {
<> 128:9bcdf88f62b0 2436 return func(arg, a0, a1, a2);
<> 128:9bcdf88f62b0 2437 }
<> 128:9bcdf88f62b0 2438 };
<> 128:9bcdf88f62b0 2439 };
<> 128:9bcdf88f62b0 2440
<> 128:9bcdf88f62b0 2441 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 2442 *
<> 128:9bcdf88f62b0 2443 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 2444 */
<> 128:9bcdf88f62b0 2445 template <typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 2446 class Callback<R(A0, A1, A2, A3)> {
<> 128:9bcdf88f62b0 2447 public:
<> 128:9bcdf88f62b0 2448 /** Create a Callback with a static function
<> 128:9bcdf88f62b0 2449 * @param func Static function to attach
<> 128:9bcdf88f62b0 2450 */
<> 128:9bcdf88f62b0 2451 Callback(R (*func)(A0, A1, A2, A3) = 0) {
<> 128:9bcdf88f62b0 2452 if (!func) {
<> 128:9bcdf88f62b0 2453 _ops = 0;
<> 128:9bcdf88f62b0 2454 } else {
<> 128:9bcdf88f62b0 2455 generate(func);
<> 128:9bcdf88f62b0 2456 }
<> 128:9bcdf88f62b0 2457 }
<> 128:9bcdf88f62b0 2458
<> 128:9bcdf88f62b0 2459 /** Attach a Callback
<> 128:9bcdf88f62b0 2460 * @param func The Callback to attach
<> 128:9bcdf88f62b0 2461 */
<> 128:9bcdf88f62b0 2462 Callback(const Callback<R(A0, A1, A2, A3)> &func) {
<> 128:9bcdf88f62b0 2463 if (func._ops) {
<> 128:9bcdf88f62b0 2464 func._ops->move(this, &func);
<> 128:9bcdf88f62b0 2465 }
<> 128:9bcdf88f62b0 2466 _ops = func._ops;
<> 128:9bcdf88f62b0 2467 }
<> 128:9bcdf88f62b0 2468
<> 128:9bcdf88f62b0 2469 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 2470 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2471 * @param method Member function to attach
<> 128:9bcdf88f62b0 2472 */
<> 130:d75b3fe1f5cb 2473 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2474 Callback(U *obj, R (T::*method)(A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2475 generate(method_context<T, R (T::*)(A0, A1, A2, A3)>(obj, method));
<> 128:9bcdf88f62b0 2476 }
<> 128:9bcdf88f62b0 2477
<> 128:9bcdf88f62b0 2478 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 2479 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2480 * @param method Member function to attach
<> 128:9bcdf88f62b0 2481 */
<> 130:d75b3fe1f5cb 2482 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2483 Callback(const U *obj, R (T::*method)(A0, A1, A2, A3) const) {
<> 128:9bcdf88f62b0 2484 generate(method_context<const T, R (T::*)(A0, A1, A2, A3) const>(obj, method));
<> 128:9bcdf88f62b0 2485 }
<> 128:9bcdf88f62b0 2486
<> 128:9bcdf88f62b0 2487 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 2488 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2489 * @param method Member function to attach
<> 128:9bcdf88f62b0 2490 */
<> 130:d75b3fe1f5cb 2491 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2492 Callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
<> 128:9bcdf88f62b0 2493 generate(method_context<volatile T, R (T::*)(A0, A1, A2, A3) volatile>(obj, method));
<> 128:9bcdf88f62b0 2494 }
<> 128:9bcdf88f62b0 2495
<> 128:9bcdf88f62b0 2496 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 2497 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2498 * @param method Member function to attach
<> 128:9bcdf88f62b0 2499 */
<> 130:d75b3fe1f5cb 2500 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2501 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
<> 128:9bcdf88f62b0 2502 generate(method_context<const volatile T, R (T::*)(A0, A1, A2, A3) const volatile>(obj, method));
<> 128:9bcdf88f62b0 2503 }
<> 128:9bcdf88f62b0 2504
<> 128:9bcdf88f62b0 2505 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2506 * @param func Static function to attach
<> 128:9bcdf88f62b0 2507 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 2508 */
<> 130:d75b3fe1f5cb 2509 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2510 Callback(R (*func)(T*, A0, A1, A2, A3), U *arg) {
<> 128:9bcdf88f62b0 2511 generate(function_context<R (*)(T*, A0, A1, A2, A3), T>(func, arg));
<> 128:9bcdf88f62b0 2512 }
<> 128:9bcdf88f62b0 2513
<> 128:9bcdf88f62b0 2514 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2515 * @param func Static function to attach
<> 128:9bcdf88f62b0 2516 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 2517 */
<> 130:d75b3fe1f5cb 2518 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2519 Callback(R (*func)(const T*, A0, A1, A2, A3), const U *arg) {
<> 128:9bcdf88f62b0 2520 generate(function_context<R (*)(const T*, A0, A1, A2, A3), const T>(func, arg));
<> 128:9bcdf88f62b0 2521 }
<> 128:9bcdf88f62b0 2522
<> 128:9bcdf88f62b0 2523 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2524 * @param func Static function to attach
<> 128:9bcdf88f62b0 2525 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 2526 */
<> 130:d75b3fe1f5cb 2527 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2528 Callback(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) {
<> 128:9bcdf88f62b0 2529 generate(function_context<R (*)(volatile T*, A0, A1, A2, A3), volatile T>(func, arg));
<> 128:9bcdf88f62b0 2530 }
<> 128:9bcdf88f62b0 2531
<> 128:9bcdf88f62b0 2532 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2533 * @param func Static function to attach
<> 128:9bcdf88f62b0 2534 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 2535 */
<> 130:d75b3fe1f5cb 2536 template<typename T, typename U>
<> 130:d75b3fe1f5cb 2537 Callback(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) {
<> 128:9bcdf88f62b0 2538 generate(function_context<R (*)(const volatile T*, A0, A1, A2, A3), const volatile T>(func, arg));
<> 128:9bcdf88f62b0 2539 }
<> 128:9bcdf88f62b0 2540
<> 128:9bcdf88f62b0 2541 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 2542 * @param func Function object to attach
<> 128:9bcdf88f62b0 2543 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 2544 */
<> 128:9bcdf88f62b0 2545 template <typename F>
<> 128:9bcdf88f62b0 2546 Callback(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2547 detail::is_type<R (F::*)(A0, A1, A2, A3), &F::operator()>::value &&
<> 128:9bcdf88f62b0 2548 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2549 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2550 generate(f);
<> 128:9bcdf88f62b0 2551 }
<> 128:9bcdf88f62b0 2552
<> 128:9bcdf88f62b0 2553 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 2554 * @param func Function object to attach
<> 128:9bcdf88f62b0 2555 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 2556 */
<> 128:9bcdf88f62b0 2557 template <typename F>
<> 128:9bcdf88f62b0 2558 Callback(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2559 detail::is_type<R (F::*)(A0, A1, A2, A3) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2560 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2561 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2562 generate(f);
<> 128:9bcdf88f62b0 2563 }
<> 128:9bcdf88f62b0 2564
<> 128:9bcdf88f62b0 2565 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 2566 * @param func Function object to attach
<> 128:9bcdf88f62b0 2567 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 2568 */
<> 128:9bcdf88f62b0 2569 template <typename F>
<> 128:9bcdf88f62b0 2570 Callback(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2571 detail::is_type<R (F::*)(A0, A1, A2, A3) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2572 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2573 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2574 generate(f);
<> 128:9bcdf88f62b0 2575 }
<> 128:9bcdf88f62b0 2576
<> 128:9bcdf88f62b0 2577 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 2578 * @param func Function object to attach
<> 128:9bcdf88f62b0 2579 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 2580 */
<> 128:9bcdf88f62b0 2581 template <typename F>
<> 128:9bcdf88f62b0 2582 Callback(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2583 detail::is_type<R (F::*)(A0, A1, A2, A3) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2584 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2585 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2586 generate(f);
<> 128:9bcdf88f62b0 2587 }
<> 128:9bcdf88f62b0 2588
<> 128:9bcdf88f62b0 2589 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2590 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2591 * @param func Static function to attach
<> 128:9bcdf88f62b0 2592 * @deprecated
<> 128:9bcdf88f62b0 2593 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2594 */
<> 130:d75b3fe1f5cb 2595 template<typename T, typename U>
<> 128:9bcdf88f62b0 2596 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2597 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2598 Callback(U *obj, R (*func)(T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2599 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2600 }
<> 128:9bcdf88f62b0 2601
<> 128:9bcdf88f62b0 2602 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2603 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2604 * @param func Static function to attach
<> 128:9bcdf88f62b0 2605 * @deprecated
<> 128:9bcdf88f62b0 2606 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2607 */
<> 130:d75b3fe1f5cb 2608 template<typename T, typename U>
<> 128:9bcdf88f62b0 2609 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2610 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2611 Callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2612 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2613 }
<> 128:9bcdf88f62b0 2614
<> 128:9bcdf88f62b0 2615 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2616 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2617 * @param func Static function to attach
<> 128:9bcdf88f62b0 2618 * @deprecated
<> 128:9bcdf88f62b0 2619 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2620 */
<> 130:d75b3fe1f5cb 2621 template<typename T, typename U>
<> 128:9bcdf88f62b0 2622 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2623 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2624 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2625 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2626 }
<> 128:9bcdf88f62b0 2627
<> 128:9bcdf88f62b0 2628 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 2629 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2630 * @param func Static function to attach
<> 128:9bcdf88f62b0 2631 * @deprecated
<> 128:9bcdf88f62b0 2632 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 2633 */
<> 130:d75b3fe1f5cb 2634 template<typename T, typename U>
<> 128:9bcdf88f62b0 2635 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2636 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 2637 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2638 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2639 }
<> 128:9bcdf88f62b0 2640
<> 128:9bcdf88f62b0 2641 /** Destroy a callback
<> 128:9bcdf88f62b0 2642 */
<> 128:9bcdf88f62b0 2643 ~Callback() {
<> 128:9bcdf88f62b0 2644 if (_ops) {
<> 128:9bcdf88f62b0 2645 _ops->dtor(this);
<> 128:9bcdf88f62b0 2646 }
<> 128:9bcdf88f62b0 2647 }
<> 128:9bcdf88f62b0 2648
<> 128:9bcdf88f62b0 2649 /** Attach a static function
<> 128:9bcdf88f62b0 2650 * @param func Static function to attach
<> 138:093f2bd7b9eb 2651 * @deprecated
<> 138:093f2bd7b9eb 2652 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 2653 */
<> 138:093f2bd7b9eb 2654 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2655 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2656 void attach(R (*func)(A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2657 this->~Callback();
<> 128:9bcdf88f62b0 2658 new (this) Callback(func);
<> 128:9bcdf88f62b0 2659 }
<> 128:9bcdf88f62b0 2660
<> 128:9bcdf88f62b0 2661 /** Attach a Callback
<> 128:9bcdf88f62b0 2662 * @param func The Callback to attach
<> 138:093f2bd7b9eb 2663 * @deprecated
<> 138:093f2bd7b9eb 2664 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 2665 */
<> 138:093f2bd7b9eb 2666 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2667 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2668 void attach(const Callback<R(A0, A1, A2, A3)> &func) {
<> 128:9bcdf88f62b0 2669 this->~Callback();
<> 128:9bcdf88f62b0 2670 new (this) Callback(func);
<> 128:9bcdf88f62b0 2671 }
<> 128:9bcdf88f62b0 2672
<> 128:9bcdf88f62b0 2673 /** Attach a member function
<> 128:9bcdf88f62b0 2674 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2675 * @param method Member function to attach
<> 138:093f2bd7b9eb 2676 * @deprecated
<> 138:093f2bd7b9eb 2677 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2678 */
<> 130:d75b3fe1f5cb 2679 template<typename T, typename U>
<> 138:093f2bd7b9eb 2680 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2681 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2682 void attach(U *obj, R (T::*method)(A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2683 this->~Callback();
<> 128:9bcdf88f62b0 2684 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2685 }
<> 128:9bcdf88f62b0 2686
<> 128:9bcdf88f62b0 2687 /** Attach a member function
<> 128:9bcdf88f62b0 2688 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2689 * @param method Member function to attach
<> 138:093f2bd7b9eb 2690 * @deprecated
<> 138:093f2bd7b9eb 2691 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2692 */
<> 130:d75b3fe1f5cb 2693 template<typename T, typename U>
<> 138:093f2bd7b9eb 2694 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2695 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2696 void attach(const U *obj, R (T::*method)(A0, A1, A2, A3) const) {
<> 128:9bcdf88f62b0 2697 this->~Callback();
<> 128:9bcdf88f62b0 2698 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2699 }
<> 128:9bcdf88f62b0 2700
<> 128:9bcdf88f62b0 2701 /** Attach a member function
<> 128:9bcdf88f62b0 2702 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2703 * @param method Member function to attach
<> 138:093f2bd7b9eb 2704 * @deprecated
<> 138:093f2bd7b9eb 2705 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2706 */
<> 130:d75b3fe1f5cb 2707 template<typename T, typename U>
<> 138:093f2bd7b9eb 2708 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2709 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2710 void attach(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
<> 128:9bcdf88f62b0 2711 this->~Callback();
<> 128:9bcdf88f62b0 2712 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2713 }
<> 128:9bcdf88f62b0 2714
<> 128:9bcdf88f62b0 2715 /** Attach a member function
<> 128:9bcdf88f62b0 2716 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 2717 * @param method Member function to attach
<> 138:093f2bd7b9eb 2718 * @deprecated
<> 138:093f2bd7b9eb 2719 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2720 */
<> 130:d75b3fe1f5cb 2721 template<typename T, typename U>
<> 138:093f2bd7b9eb 2722 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2723 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2724 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
<> 128:9bcdf88f62b0 2725 this->~Callback();
<> 128:9bcdf88f62b0 2726 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 2727 }
<> 128:9bcdf88f62b0 2728
<> 128:9bcdf88f62b0 2729 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2730 * @param func Static function to attach
<> 128:9bcdf88f62b0 2731 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2732 * @deprecated
<> 138:093f2bd7b9eb 2733 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2734 */
<> 130:d75b3fe1f5cb 2735 template <typename T, typename U>
<> 138:093f2bd7b9eb 2736 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2737 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2738 void attach(R (*func)(T*, A0, A1, A2, A3), U *arg) {
<> 128:9bcdf88f62b0 2739 this->~Callback();
<> 128:9bcdf88f62b0 2740 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2741 }
<> 128:9bcdf88f62b0 2742
<> 128:9bcdf88f62b0 2743 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2744 * @param func Static function to attach
<> 128:9bcdf88f62b0 2745 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2746 * @deprecated
<> 138:093f2bd7b9eb 2747 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2748 */
<> 130:d75b3fe1f5cb 2749 template <typename T, typename U>
<> 138:093f2bd7b9eb 2750 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2751 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2752 void attach(R (*func)(const T*, A0, A1, A2, A3), const U *arg) {
<> 128:9bcdf88f62b0 2753 this->~Callback();
<> 128:9bcdf88f62b0 2754 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2755 }
<> 128:9bcdf88f62b0 2756
<> 128:9bcdf88f62b0 2757 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2758 * @param func Static function to attach
<> 128:9bcdf88f62b0 2759 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2760 * @deprecated
<> 138:093f2bd7b9eb 2761 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2762 */
<> 130:d75b3fe1f5cb 2763 template <typename T, typename U>
<> 138:093f2bd7b9eb 2764 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2765 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2766 void attach(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) {
<> 128:9bcdf88f62b0 2767 this->~Callback();
<> 128:9bcdf88f62b0 2768 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2769 }
<> 128:9bcdf88f62b0 2770
<> 128:9bcdf88f62b0 2771 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2772 * @param func Static function to attach
<> 128:9bcdf88f62b0 2773 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 2774 * @deprecated
<> 138:093f2bd7b9eb 2775 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2776 */
<> 130:d75b3fe1f5cb 2777 template <typename T, typename U>
<> 138:093f2bd7b9eb 2778 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2779 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 2780 void attach(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) {
<> 128:9bcdf88f62b0 2781 this->~Callback();
<> 128:9bcdf88f62b0 2782 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 2783 }
<> 128:9bcdf88f62b0 2784
<> 128:9bcdf88f62b0 2785 /** Attach a function object
<> 128:9bcdf88f62b0 2786 * @param func Function object to attach
<> 128:9bcdf88f62b0 2787 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2788 * @deprecated
<> 138:093f2bd7b9eb 2789 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2790 */
<> 128:9bcdf88f62b0 2791 template <typename F>
<> 138:093f2bd7b9eb 2792 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2793 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2794 void attach(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2795 detail::is_type<R (F::*)(A0, A1, A2, A3), &F::operator()>::value &&
<> 128:9bcdf88f62b0 2796 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2797 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2798 this->~Callback();
<> 128:9bcdf88f62b0 2799 new (this) Callback(f);
<> 128:9bcdf88f62b0 2800 }
<> 128:9bcdf88f62b0 2801
<> 128:9bcdf88f62b0 2802 /** Attach a function object
<> 128:9bcdf88f62b0 2803 * @param func Function object to attach
<> 128:9bcdf88f62b0 2804 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2805 * @deprecated
<> 138:093f2bd7b9eb 2806 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2807 */
<> 128:9bcdf88f62b0 2808 template <typename F>
<> 138:093f2bd7b9eb 2809 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2810 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2811 void attach(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2812 detail::is_type<R (F::*)(A0, A1, A2, A3) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2813 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2814 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2815 this->~Callback();
<> 128:9bcdf88f62b0 2816 new (this) Callback(f);
<> 128:9bcdf88f62b0 2817 }
<> 128:9bcdf88f62b0 2818
<> 128:9bcdf88f62b0 2819 /** Attach a function object
<> 128:9bcdf88f62b0 2820 * @param func Function object to attach
<> 128:9bcdf88f62b0 2821 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2822 * @deprecated
<> 138:093f2bd7b9eb 2823 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2824 */
<> 128:9bcdf88f62b0 2825 template <typename F>
<> 138:093f2bd7b9eb 2826 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2827 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2828 void attach(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2829 detail::is_type<R (F::*)(A0, A1, A2, A3) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2830 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2831 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2832 this->~Callback();
<> 128:9bcdf88f62b0 2833 new (this) Callback(f);
<> 128:9bcdf88f62b0 2834 }
<> 128:9bcdf88f62b0 2835
<> 128:9bcdf88f62b0 2836 /** Attach a function object
<> 128:9bcdf88f62b0 2837 * @param func Function object to attach
<> 128:9bcdf88f62b0 2838 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 2839 * @deprecated
<> 138:093f2bd7b9eb 2840 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 2841 */
<> 128:9bcdf88f62b0 2842 template <typename F>
<> 138:093f2bd7b9eb 2843 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 2844 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 2845 void attach(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 2846 detail::is_type<R (F::*)(A0, A1, A2, A3) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 2847 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 2848 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 2849 this->~Callback();
<> 128:9bcdf88f62b0 2850 new (this) Callback(f);
<> 128:9bcdf88f62b0 2851 }
<> 128:9bcdf88f62b0 2852
<> 128:9bcdf88f62b0 2853 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2854 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2855 * @param func Static function to attach
<> 128:9bcdf88f62b0 2856 * @deprecated
<> 128:9bcdf88f62b0 2857 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2858 */
<> 130:d75b3fe1f5cb 2859 template <typename T, typename U>
<> 128:9bcdf88f62b0 2860 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2861 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2862 void attach(U *obj, R (*func)(T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2863 this->~Callback();
<> 128:9bcdf88f62b0 2864 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2865 }
<> 128:9bcdf88f62b0 2866
<> 128:9bcdf88f62b0 2867 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2868 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2869 * @param func Static function to attach
<> 128:9bcdf88f62b0 2870 * @deprecated
<> 128:9bcdf88f62b0 2871 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2872 */
<> 130:d75b3fe1f5cb 2873 template <typename T, typename U>
<> 128:9bcdf88f62b0 2874 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2875 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2876 void attach(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2877 this->~Callback();
<> 128:9bcdf88f62b0 2878 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2879 }
<> 128:9bcdf88f62b0 2880
<> 128:9bcdf88f62b0 2881 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2882 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2883 * @param func Static function to attach
<> 128:9bcdf88f62b0 2884 * @deprecated
<> 128:9bcdf88f62b0 2885 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2886 */
<> 130:d75b3fe1f5cb 2887 template <typename T, typename U>
<> 128:9bcdf88f62b0 2888 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2889 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2890 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2891 this->~Callback();
<> 128:9bcdf88f62b0 2892 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2893 }
<> 128:9bcdf88f62b0 2894
<> 128:9bcdf88f62b0 2895 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 2896 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 2897 * @param func Static function to attach
<> 128:9bcdf88f62b0 2898 * @deprecated
<> 128:9bcdf88f62b0 2899 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 2900 */
<> 130:d75b3fe1f5cb 2901 template <typename T, typename U>
<> 128:9bcdf88f62b0 2902 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 2903 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 2904 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 2905 this->~Callback();
<> 128:9bcdf88f62b0 2906 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 2907 }
<> 128:9bcdf88f62b0 2908
<> 128:9bcdf88f62b0 2909 /** Assign a callback
<> 128:9bcdf88f62b0 2910 */
<> 128:9bcdf88f62b0 2911 Callback &operator=(const Callback &that) {
<> 128:9bcdf88f62b0 2912 if (this != &that) {
<> 128:9bcdf88f62b0 2913 this->~Callback();
<> 128:9bcdf88f62b0 2914 new (this) Callback(that);
<> 128:9bcdf88f62b0 2915 }
<> 128:9bcdf88f62b0 2916
<> 128:9bcdf88f62b0 2917 return *this;
<> 128:9bcdf88f62b0 2918 }
<> 128:9bcdf88f62b0 2919
<> 128:9bcdf88f62b0 2920 /** Call the attached function
<> 128:9bcdf88f62b0 2921 */
<> 128:9bcdf88f62b0 2922 R call(A0 a0, A1 a1, A2 a2, A3 a3) const {
<> 128:9bcdf88f62b0 2923 MBED_ASSERT(_ops);
<> 128:9bcdf88f62b0 2924 return _ops->call(this, a0, a1, a2, a3);
<> 128:9bcdf88f62b0 2925 }
<> 128:9bcdf88f62b0 2926
<> 128:9bcdf88f62b0 2927 /** Call the attached function
<> 128:9bcdf88f62b0 2928 */
<> 128:9bcdf88f62b0 2929 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
<> 128:9bcdf88f62b0 2930 return call(a0, a1, a2, a3);
<> 128:9bcdf88f62b0 2931 }
<> 128:9bcdf88f62b0 2932
<> 128:9bcdf88f62b0 2933 /** Test if function has been attached
<> 128:9bcdf88f62b0 2934 */
<> 128:9bcdf88f62b0 2935 operator bool() const {
<> 128:9bcdf88f62b0 2936 return _ops;
<> 128:9bcdf88f62b0 2937 }
<> 128:9bcdf88f62b0 2938
<> 128:9bcdf88f62b0 2939 /** Test for equality
<> 128:9bcdf88f62b0 2940 */
<> 128:9bcdf88f62b0 2941 friend bool operator==(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 2942 return memcmp(&l, &r, sizeof(Callback)) == 0;
<> 128:9bcdf88f62b0 2943 }
<> 128:9bcdf88f62b0 2944
<> 128:9bcdf88f62b0 2945 /** Test for inequality
<> 128:9bcdf88f62b0 2946 */
<> 128:9bcdf88f62b0 2947 friend bool operator!=(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 2948 return !(l == r);
<> 128:9bcdf88f62b0 2949 }
<> 128:9bcdf88f62b0 2950
<> 128:9bcdf88f62b0 2951 /** Static thunk for passing as C-style function
<> 128:9bcdf88f62b0 2952 * @param func Callback to call passed as void pointer
<> 128:9bcdf88f62b0 2953 */
<> 128:9bcdf88f62b0 2954 static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) {
<> 128:9bcdf88f62b0 2955 return static_cast<Callback*>(func)->call(a0, a1, a2, a3);
<> 128:9bcdf88f62b0 2956 }
<> 128:9bcdf88f62b0 2957
<> 128:9bcdf88f62b0 2958 private:
<> 128:9bcdf88f62b0 2959 // Stored as pointer to function and pointer to optional object
<> 128:9bcdf88f62b0 2960 // Function pointer is stored as union of possible function types
<> 128:9bcdf88f62b0 2961 // to garuntee proper size and alignment
<> 128:9bcdf88f62b0 2962 struct _class;
<> 128:9bcdf88f62b0 2963 union {
<> 128:9bcdf88f62b0 2964 void (*_staticfunc)(A0, A1, A2, A3);
<> 128:9bcdf88f62b0 2965 void (*_boundfunc)(_class*, A0, A1, A2, A3);
<> 128:9bcdf88f62b0 2966 void (_class::*_methodfunc)(A0, A1, A2, A3);
<> 128:9bcdf88f62b0 2967 } _func;
<> 128:9bcdf88f62b0 2968 void *_obj;
<> 128:9bcdf88f62b0 2969
<> 128:9bcdf88f62b0 2970 // Dynamically dispatched operations
<> 128:9bcdf88f62b0 2971 const struct ops {
<> 128:9bcdf88f62b0 2972 R (*call)(const void*, A0, A1, A2, A3);
<> 128:9bcdf88f62b0 2973 void (*move)(void*, const void*);
<> 128:9bcdf88f62b0 2974 void (*dtor)(void*);
<> 128:9bcdf88f62b0 2975 } *_ops;
<> 128:9bcdf88f62b0 2976
<> 128:9bcdf88f62b0 2977 // Generate operations for function object
<> 128:9bcdf88f62b0 2978 template <typename F>
<> 128:9bcdf88f62b0 2979 void generate(const F &f) {
<> 128:9bcdf88f62b0 2980 static const ops ops = {
<> 128:9bcdf88f62b0 2981 &Callback::function_call<F>,
<> 128:9bcdf88f62b0 2982 &Callback::function_move<F>,
<> 128:9bcdf88f62b0 2983 &Callback::function_dtor<F>,
<> 128:9bcdf88f62b0 2984 };
<> 128:9bcdf88f62b0 2985
<> 130:d75b3fe1f5cb 2986 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
<> 130:d75b3fe1f5cb 2987 "Type F must not exceed the size of the Callback class");
<> 128:9bcdf88f62b0 2988 new (this) F(f);
<> 128:9bcdf88f62b0 2989 _ops = &ops;
<> 128:9bcdf88f62b0 2990 }
<> 128:9bcdf88f62b0 2991
<> 128:9bcdf88f62b0 2992 // Function attributes
<> 128:9bcdf88f62b0 2993 template <typename F>
<> 128:9bcdf88f62b0 2994 static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3) {
<> 128:9bcdf88f62b0 2995 return (*(F*)p)(a0, a1, a2, a3);
<> 128:9bcdf88f62b0 2996 }
<> 128:9bcdf88f62b0 2997
<> 128:9bcdf88f62b0 2998 template <typename F>
<> 128:9bcdf88f62b0 2999 static void function_move(void *d, const void *p) {
<> 128:9bcdf88f62b0 3000 new (d) F(*(F*)p);
<> 128:9bcdf88f62b0 3001 }
<> 128:9bcdf88f62b0 3002
<> 128:9bcdf88f62b0 3003 template <typename F>
<> 128:9bcdf88f62b0 3004 static void function_dtor(void *p) {
<> 128:9bcdf88f62b0 3005 ((F*)p)->~F();
<> 128:9bcdf88f62b0 3006 }
<> 128:9bcdf88f62b0 3007
<> 128:9bcdf88f62b0 3008 // Wrappers for functions with context
<> 128:9bcdf88f62b0 3009 template <typename O, typename M>
<> 128:9bcdf88f62b0 3010 struct method_context {
<> 128:9bcdf88f62b0 3011 M method;
<> 128:9bcdf88f62b0 3012 O *obj;
<> 128:9bcdf88f62b0 3013
<> 128:9bcdf88f62b0 3014 method_context(O *obj, M method)
<> 128:9bcdf88f62b0 3015 : method(method), obj(obj) {}
<> 128:9bcdf88f62b0 3016
<> 128:9bcdf88f62b0 3017 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
<> 128:9bcdf88f62b0 3018 return (obj->*method)(a0, a1, a2, a3);
<> 128:9bcdf88f62b0 3019 }
<> 128:9bcdf88f62b0 3020 };
<> 128:9bcdf88f62b0 3021
<> 128:9bcdf88f62b0 3022 template <typename F, typename A>
<> 128:9bcdf88f62b0 3023 struct function_context {
<> 128:9bcdf88f62b0 3024 F func;
<> 128:9bcdf88f62b0 3025 A *arg;
<> 128:9bcdf88f62b0 3026
<> 128:9bcdf88f62b0 3027 function_context(F func, A *arg)
<> 128:9bcdf88f62b0 3028 : func(func), arg(arg) {}
<> 128:9bcdf88f62b0 3029
<> 128:9bcdf88f62b0 3030 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
<> 128:9bcdf88f62b0 3031 return func(arg, a0, a1, a2, a3);
<> 128:9bcdf88f62b0 3032 }
<> 128:9bcdf88f62b0 3033 };
<> 128:9bcdf88f62b0 3034 };
<> 128:9bcdf88f62b0 3035
<> 128:9bcdf88f62b0 3036 /** Callback class based on template specialization
<> 128:9bcdf88f62b0 3037 *
<> 128:9bcdf88f62b0 3038 * @Note Synchronization level: Not protected
<> 128:9bcdf88f62b0 3039 */
<> 128:9bcdf88f62b0 3040 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 3041 class Callback<R(A0, A1, A2, A3, A4)> {
<> 128:9bcdf88f62b0 3042 public:
<> 128:9bcdf88f62b0 3043 /** Create a Callback with a static function
<> 128:9bcdf88f62b0 3044 * @param func Static function to attach
<> 128:9bcdf88f62b0 3045 */
<> 128:9bcdf88f62b0 3046 Callback(R (*func)(A0, A1, A2, A3, A4) = 0) {
<> 128:9bcdf88f62b0 3047 if (!func) {
<> 128:9bcdf88f62b0 3048 _ops = 0;
<> 128:9bcdf88f62b0 3049 } else {
<> 128:9bcdf88f62b0 3050 generate(func);
<> 128:9bcdf88f62b0 3051 }
<> 128:9bcdf88f62b0 3052 }
<> 128:9bcdf88f62b0 3053
<> 128:9bcdf88f62b0 3054 /** Attach a Callback
<> 128:9bcdf88f62b0 3055 * @param func The Callback to attach
<> 128:9bcdf88f62b0 3056 */
<> 128:9bcdf88f62b0 3057 Callback(const Callback<R(A0, A1, A2, A3, A4)> &func) {
<> 128:9bcdf88f62b0 3058 if (func._ops) {
<> 128:9bcdf88f62b0 3059 func._ops->move(this, &func);
<> 128:9bcdf88f62b0 3060 }
<> 128:9bcdf88f62b0 3061 _ops = func._ops;
<> 128:9bcdf88f62b0 3062 }
<> 128:9bcdf88f62b0 3063
<> 128:9bcdf88f62b0 3064 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 3065 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3066 * @param method Member function to attach
<> 128:9bcdf88f62b0 3067 */
<> 130:d75b3fe1f5cb 3068 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3069 Callback(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3070 generate(method_context<T, R (T::*)(A0, A1, A2, A3, A4)>(obj, method));
<> 128:9bcdf88f62b0 3071 }
<> 128:9bcdf88f62b0 3072
<> 128:9bcdf88f62b0 3073 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 3074 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3075 * @param method Member function to attach
<> 128:9bcdf88f62b0 3076 */
<> 130:d75b3fe1f5cb 3077 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3078 Callback(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
<> 128:9bcdf88f62b0 3079 generate(method_context<const T, R (T::*)(A0, A1, A2, A3, A4) const>(obj, method));
<> 128:9bcdf88f62b0 3080 }
<> 128:9bcdf88f62b0 3081
<> 128:9bcdf88f62b0 3082 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 3083 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3084 * @param method Member function to attach
<> 128:9bcdf88f62b0 3085 */
<> 130:d75b3fe1f5cb 3086 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3087 Callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
<> 128:9bcdf88f62b0 3088 generate(method_context<volatile T, R (T::*)(A0, A1, A2, A3, A4) volatile>(obj, method));
<> 128:9bcdf88f62b0 3089 }
<> 128:9bcdf88f62b0 3090
<> 128:9bcdf88f62b0 3091 /** Create a Callback with a member function
<> 128:9bcdf88f62b0 3092 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3093 * @param method Member function to attach
<> 128:9bcdf88f62b0 3094 */
<> 130:d75b3fe1f5cb 3095 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3096 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
<> 128:9bcdf88f62b0 3097 generate(method_context<const volatile T, R (T::*)(A0, A1, A2, A3, A4) const volatile>(obj, method));
<> 128:9bcdf88f62b0 3098 }
<> 128:9bcdf88f62b0 3099
<> 128:9bcdf88f62b0 3100 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3101 * @param func Static function to attach
<> 128:9bcdf88f62b0 3102 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3103 */
<> 130:d75b3fe1f5cb 3104 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3105 Callback(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) {
<> 128:9bcdf88f62b0 3106 generate(function_context<R (*)(T*, A0, A1, A2, A3, A4), T>(func, arg));
<> 128:9bcdf88f62b0 3107 }
<> 128:9bcdf88f62b0 3108
<> 128:9bcdf88f62b0 3109 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3110 * @param func Static function to attach
<> 128:9bcdf88f62b0 3111 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3112 */
<> 130:d75b3fe1f5cb 3113 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3114 Callback(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) {
<> 128:9bcdf88f62b0 3115 generate(function_context<R (*)(const T*, A0, A1, A2, A3, A4), const T>(func, arg));
<> 128:9bcdf88f62b0 3116 }
<> 128:9bcdf88f62b0 3117
<> 128:9bcdf88f62b0 3118 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3119 * @param func Static function to attach
<> 128:9bcdf88f62b0 3120 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3121 */
<> 130:d75b3fe1f5cb 3122 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3123 Callback(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) {
<> 128:9bcdf88f62b0 3124 generate(function_context<R (*)(volatile T*, A0, A1, A2, A3, A4), volatile T>(func, arg));
<> 128:9bcdf88f62b0 3125 }
<> 128:9bcdf88f62b0 3126
<> 128:9bcdf88f62b0 3127 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3128 * @param func Static function to attach
<> 128:9bcdf88f62b0 3129 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3130 */
<> 130:d75b3fe1f5cb 3131 template<typename T, typename U>
<> 130:d75b3fe1f5cb 3132 Callback(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) {
<> 128:9bcdf88f62b0 3133 generate(function_context<R (*)(const volatile T*, A0, A1, A2, A3, A4), const volatile T>(func, arg));
<> 128:9bcdf88f62b0 3134 }
<> 128:9bcdf88f62b0 3135
<> 128:9bcdf88f62b0 3136 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 3137 * @param func Function object to attach
<> 128:9bcdf88f62b0 3138 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 3139 */
<> 128:9bcdf88f62b0 3140 template <typename F>
<> 128:9bcdf88f62b0 3141 Callback(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3142 detail::is_type<R (F::*)(A0, A1, A2, A3, A4), &F::operator()>::value &&
<> 128:9bcdf88f62b0 3143 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3144 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3145 generate(f);
<> 128:9bcdf88f62b0 3146 }
<> 128:9bcdf88f62b0 3147
<> 128:9bcdf88f62b0 3148 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 3149 * @param func Function object to attach
<> 128:9bcdf88f62b0 3150 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 3151 */
<> 128:9bcdf88f62b0 3152 template <typename F>
<> 128:9bcdf88f62b0 3153 Callback(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3154 detail::is_type<R (F::*)(A0, A1, A2, A3, A4) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 3155 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3156 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3157 generate(f);
<> 128:9bcdf88f62b0 3158 }
<> 128:9bcdf88f62b0 3159
<> 128:9bcdf88f62b0 3160 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 3161 * @param func Function object to attach
<> 128:9bcdf88f62b0 3162 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 3163 */
<> 128:9bcdf88f62b0 3164 template <typename F>
<> 128:9bcdf88f62b0 3165 Callback(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3166 detail::is_type<R (F::*)(A0, A1, A2, A3, A4) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 3167 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3168 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3169 generate(f);
<> 128:9bcdf88f62b0 3170 }
<> 128:9bcdf88f62b0 3171
<> 128:9bcdf88f62b0 3172 /** Create a Callback with a function object
<> 128:9bcdf88f62b0 3173 * @param func Function object to attach
<> 128:9bcdf88f62b0 3174 * @note The function object is limited to a single word of storage
<> 128:9bcdf88f62b0 3175 */
<> 128:9bcdf88f62b0 3176 template <typename F>
<> 128:9bcdf88f62b0 3177 Callback(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3178 detail::is_type<R (F::*)(A0, A1, A2, A3, A4) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 3179 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3180 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3181 generate(f);
<> 128:9bcdf88f62b0 3182 }
<> 128:9bcdf88f62b0 3183
<> 128:9bcdf88f62b0 3184 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3185 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3186 * @param func Static function to attach
<> 128:9bcdf88f62b0 3187 * @deprecated
<> 128:9bcdf88f62b0 3188 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 3189 */
<> 130:d75b3fe1f5cb 3190 template<typename T, typename U>
<> 128:9bcdf88f62b0 3191 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3192 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 3193 Callback(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3194 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3195 }
<> 128:9bcdf88f62b0 3196
<> 128:9bcdf88f62b0 3197 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3198 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3199 * @param func Static function to attach
<> 128:9bcdf88f62b0 3200 * @deprecated
<> 128:9bcdf88f62b0 3201 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 3202 */
<> 130:d75b3fe1f5cb 3203 template<typename T, typename U>
<> 128:9bcdf88f62b0 3204 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3205 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 3206 Callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3207 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3208 }
<> 128:9bcdf88f62b0 3209
<> 128:9bcdf88f62b0 3210 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3211 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3212 * @param func Static function to attach
<> 128:9bcdf88f62b0 3213 * @deprecated
<> 128:9bcdf88f62b0 3214 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 3215 */
<> 130:d75b3fe1f5cb 3216 template<typename T, typename U>
<> 128:9bcdf88f62b0 3217 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3218 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 3219 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3220 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3221 }
<> 128:9bcdf88f62b0 3222
<> 128:9bcdf88f62b0 3223 /** Create a Callback with a static function and bound pointer
<> 128:9bcdf88f62b0 3224 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3225 * @param func Static function to attach
<> 128:9bcdf88f62b0 3226 * @deprecated
<> 128:9bcdf88f62b0 3227 * Arguments to callback have been reordered to Callback(func, arg)
<> 128:9bcdf88f62b0 3228 */
<> 130:d75b3fe1f5cb 3229 template<typename T, typename U>
<> 128:9bcdf88f62b0 3230 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3231 "Arguments to callback have been reordered to Callback(func, arg)")
<> 130:d75b3fe1f5cb 3232 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3233 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3234 }
<> 128:9bcdf88f62b0 3235
<> 128:9bcdf88f62b0 3236 /** Destroy a callback
<> 128:9bcdf88f62b0 3237 */
<> 128:9bcdf88f62b0 3238 ~Callback() {
<> 128:9bcdf88f62b0 3239 if (_ops) {
<> 128:9bcdf88f62b0 3240 _ops->dtor(this);
<> 128:9bcdf88f62b0 3241 }
<> 128:9bcdf88f62b0 3242 }
<> 128:9bcdf88f62b0 3243
<> 128:9bcdf88f62b0 3244 /** Attach a static function
<> 128:9bcdf88f62b0 3245 * @param func Static function to attach
<> 138:093f2bd7b9eb 3246 * @deprecated
<> 138:093f2bd7b9eb 3247 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 3248 */
<> 138:093f2bd7b9eb 3249 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3250 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 3251 void attach(R (*func)(A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3252 this->~Callback();
<> 128:9bcdf88f62b0 3253 new (this) Callback(func);
<> 128:9bcdf88f62b0 3254 }
<> 128:9bcdf88f62b0 3255
<> 128:9bcdf88f62b0 3256 /** Attach a Callback
<> 128:9bcdf88f62b0 3257 * @param func The Callback to attach
<> 138:093f2bd7b9eb 3258 * @deprecated
<> 138:093f2bd7b9eb 3259 * Replaced by simple assignment 'Callback cb = func'
<> 138:093f2bd7b9eb 3260 */
<> 138:093f2bd7b9eb 3261 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3262 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 3263 void attach(const Callback<R(A0, A1, A2, A3, A4)> &func) {
<> 128:9bcdf88f62b0 3264 this->~Callback();
<> 128:9bcdf88f62b0 3265 new (this) Callback(func);
<> 128:9bcdf88f62b0 3266 }
<> 128:9bcdf88f62b0 3267
<> 128:9bcdf88f62b0 3268 /** Attach a member function
<> 128:9bcdf88f62b0 3269 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3270 * @param method Member function to attach
<> 138:093f2bd7b9eb 3271 * @deprecated
<> 138:093f2bd7b9eb 3272 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3273 */
<> 130:d75b3fe1f5cb 3274 template<typename T, typename U>
<> 138:093f2bd7b9eb 3275 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3276 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3277 void attach(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3278 this->~Callback();
<> 128:9bcdf88f62b0 3279 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 3280 }
<> 128:9bcdf88f62b0 3281
<> 128:9bcdf88f62b0 3282 /** Attach a member function
<> 128:9bcdf88f62b0 3283 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3284 * @param method Member function to attach
<> 138:093f2bd7b9eb 3285 * @deprecated
<> 138:093f2bd7b9eb 3286 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3287 */
<> 130:d75b3fe1f5cb 3288 template<typename T, typename U>
<> 138:093f2bd7b9eb 3289 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3290 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3291 void attach(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
<> 128:9bcdf88f62b0 3292 this->~Callback();
<> 128:9bcdf88f62b0 3293 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 3294 }
<> 128:9bcdf88f62b0 3295
<> 128:9bcdf88f62b0 3296 /** Attach a member function
<> 128:9bcdf88f62b0 3297 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3298 * @param method Member function to attach
<> 138:093f2bd7b9eb 3299 * @deprecated
<> 138:093f2bd7b9eb 3300 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3301 */
<> 130:d75b3fe1f5cb 3302 template<typename T, typename U>
<> 138:093f2bd7b9eb 3303 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3304 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3305 void attach(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
<> 128:9bcdf88f62b0 3306 this->~Callback();
<> 128:9bcdf88f62b0 3307 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 3308 }
<> 128:9bcdf88f62b0 3309
<> 128:9bcdf88f62b0 3310 /** Attach a member function
<> 128:9bcdf88f62b0 3311 * @param obj Pointer to object to invoke member function on
<> 128:9bcdf88f62b0 3312 * @param method Member function to attach
<> 138:093f2bd7b9eb 3313 * @deprecated
<> 138:093f2bd7b9eb 3314 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3315 */
<> 130:d75b3fe1f5cb 3316 template<typename T, typename U>
<> 138:093f2bd7b9eb 3317 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3318 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3319 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
<> 128:9bcdf88f62b0 3320 this->~Callback();
<> 128:9bcdf88f62b0 3321 new (this) Callback(obj, method);
<> 128:9bcdf88f62b0 3322 }
<> 128:9bcdf88f62b0 3323
<> 128:9bcdf88f62b0 3324 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3325 * @param func Static function to attach
<> 128:9bcdf88f62b0 3326 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 3327 * @deprecated
<> 138:093f2bd7b9eb 3328 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3329 */
<> 130:d75b3fe1f5cb 3330 template <typename T, typename U>
<> 138:093f2bd7b9eb 3331 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3332 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3333 void attach(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) {
<> 128:9bcdf88f62b0 3334 this->~Callback();
<> 128:9bcdf88f62b0 3335 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 3336 }
<> 128:9bcdf88f62b0 3337
<> 128:9bcdf88f62b0 3338 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3339 * @param func Static function to attach
<> 128:9bcdf88f62b0 3340 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 3341 * @deprecated
<> 138:093f2bd7b9eb 3342 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3343 */
<> 130:d75b3fe1f5cb 3344 template <typename T, typename U>
<> 138:093f2bd7b9eb 3345 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3346 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3347 void attach(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) {
<> 128:9bcdf88f62b0 3348 this->~Callback();
<> 128:9bcdf88f62b0 3349 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 3350 }
<> 128:9bcdf88f62b0 3351
<> 128:9bcdf88f62b0 3352 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3353 * @param func Static function to attach
<> 128:9bcdf88f62b0 3354 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 3355 * @deprecated
<> 138:093f2bd7b9eb 3356 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3357 */
<> 130:d75b3fe1f5cb 3358 template <typename T, typename U>
<> 138:093f2bd7b9eb 3359 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3360 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3361 void attach(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) {
<> 128:9bcdf88f62b0 3362 this->~Callback();
<> 128:9bcdf88f62b0 3363 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 3364 }
<> 128:9bcdf88f62b0 3365
<> 128:9bcdf88f62b0 3366 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3367 * @param func Static function to attach
<> 128:9bcdf88f62b0 3368 * @param arg Pointer argument to function
<> 138:093f2bd7b9eb 3369 * @deprecated
<> 138:093f2bd7b9eb 3370 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3371 */
<> 130:d75b3fe1f5cb 3372 template <typename T, typename U>
<> 138:093f2bd7b9eb 3373 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3374 "Replaced by simple assignment 'Callback cb = func")
<> 130:d75b3fe1f5cb 3375 void attach(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) {
<> 128:9bcdf88f62b0 3376 this->~Callback();
<> 128:9bcdf88f62b0 3377 new (this) Callback(func, arg);
<> 128:9bcdf88f62b0 3378 }
<> 128:9bcdf88f62b0 3379
<> 128:9bcdf88f62b0 3380 /** Attach a function object
<> 128:9bcdf88f62b0 3381 * @param func Function object to attach
<> 128:9bcdf88f62b0 3382 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 3383 * @deprecated
<> 138:093f2bd7b9eb 3384 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3385 */
<> 128:9bcdf88f62b0 3386 template <typename F>
<> 138:093f2bd7b9eb 3387 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3388 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 3389 void attach(F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3390 detail::is_type<R (F::*)(A0, A1, A2, A3, A4), &F::operator()>::value &&
<> 128:9bcdf88f62b0 3391 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3392 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3393 this->~Callback();
<> 128:9bcdf88f62b0 3394 new (this) Callback(f);
<> 128:9bcdf88f62b0 3395 }
<> 128:9bcdf88f62b0 3396
<> 128:9bcdf88f62b0 3397 /** Attach a function object
<> 128:9bcdf88f62b0 3398 * @param func Function object to attach
<> 128:9bcdf88f62b0 3399 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 3400 * @deprecated
<> 138:093f2bd7b9eb 3401 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3402 */
<> 128:9bcdf88f62b0 3403 template <typename F>
<> 138:093f2bd7b9eb 3404 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3405 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 3406 void attach(const F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3407 detail::is_type<R (F::*)(A0, A1, A2, A3, A4) const, &F::operator()>::value &&
<> 128:9bcdf88f62b0 3408 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3409 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3410 this->~Callback();
<> 128:9bcdf88f62b0 3411 new (this) Callback(f);
<> 128:9bcdf88f62b0 3412 }
<> 128:9bcdf88f62b0 3413
<> 128:9bcdf88f62b0 3414 /** Attach a function object
<> 128:9bcdf88f62b0 3415 * @param func Function object to attach
<> 128:9bcdf88f62b0 3416 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 3417 * @deprecated
<> 138:093f2bd7b9eb 3418 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3419 */
<> 128:9bcdf88f62b0 3420 template <typename F>
<> 138:093f2bd7b9eb 3421 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3422 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 3423 void attach(volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3424 detail::is_type<R (F::*)(A0, A1, A2, A3, A4) volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 3425 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3426 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3427 this->~Callback();
<> 128:9bcdf88f62b0 3428 new (this) Callback(f);
<> 128:9bcdf88f62b0 3429 }
<> 128:9bcdf88f62b0 3430
<> 128:9bcdf88f62b0 3431 /** Attach a function object
<> 128:9bcdf88f62b0 3432 * @param func Function object to attach
<> 128:9bcdf88f62b0 3433 * @note The function object is limited to a single word of storage
<> 138:093f2bd7b9eb 3434 * @deprecated
<> 138:093f2bd7b9eb 3435 * Replaced by simple assignment 'Callback cb = func'
<> 128:9bcdf88f62b0 3436 */
<> 128:9bcdf88f62b0 3437 template <typename F>
<> 138:093f2bd7b9eb 3438 MBED_DEPRECATED_SINCE("mbed-os-5.4",
<> 138:093f2bd7b9eb 3439 "Replaced by simple assignment 'Callback cb = func")
<> 128:9bcdf88f62b0 3440 void attach(const volatile F f, typename detail::enable_if<
<> 128:9bcdf88f62b0 3441 detail::is_type<R (F::*)(A0, A1, A2, A3, A4) const volatile, &F::operator()>::value &&
<> 128:9bcdf88f62b0 3442 sizeof(F) <= sizeof(uintptr_t)
<> 128:9bcdf88f62b0 3443 >::type = detail::nil()) {
<> 128:9bcdf88f62b0 3444 this->~Callback();
<> 128:9bcdf88f62b0 3445 new (this) Callback(f);
<> 128:9bcdf88f62b0 3446 }
<> 128:9bcdf88f62b0 3447
<> 128:9bcdf88f62b0 3448 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3449 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3450 * @param func Static function to attach
<> 128:9bcdf88f62b0 3451 * @deprecated
<> 128:9bcdf88f62b0 3452 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 3453 */
<> 130:d75b3fe1f5cb 3454 template <typename T, typename U>
<> 128:9bcdf88f62b0 3455 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3456 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 3457 void attach(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3458 this->~Callback();
<> 128:9bcdf88f62b0 3459 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3460 }
<> 128:9bcdf88f62b0 3461
<> 128:9bcdf88f62b0 3462 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3463 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3464 * @param func Static function to attach
<> 128:9bcdf88f62b0 3465 * @deprecated
<> 128:9bcdf88f62b0 3466 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 3467 */
<> 130:d75b3fe1f5cb 3468 template <typename T, typename U>
<> 128:9bcdf88f62b0 3469 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3470 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 3471 void attach(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3472 this->~Callback();
<> 128:9bcdf88f62b0 3473 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3474 }
<> 128:9bcdf88f62b0 3475
<> 128:9bcdf88f62b0 3476 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3477 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3478 * @param func Static function to attach
<> 128:9bcdf88f62b0 3479 * @deprecated
<> 128:9bcdf88f62b0 3480 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 3481 */
<> 130:d75b3fe1f5cb 3482 template <typename T, typename U>
<> 128:9bcdf88f62b0 3483 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3484 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 3485 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3486 this->~Callback();
<> 128:9bcdf88f62b0 3487 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3488 }
<> 128:9bcdf88f62b0 3489
<> 128:9bcdf88f62b0 3490 /** Attach a static function with a bound pointer
<> 128:9bcdf88f62b0 3491 * @param obj Pointer to object to bind to function
<> 128:9bcdf88f62b0 3492 * @param func Static function to attach
<> 128:9bcdf88f62b0 3493 * @deprecated
<> 128:9bcdf88f62b0 3494 * Arguments to callback have been reordered to attach(func, arg)
<> 128:9bcdf88f62b0 3495 */
<> 130:d75b3fe1f5cb 3496 template <typename T, typename U>
<> 128:9bcdf88f62b0 3497 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3498 "Arguments to callback have been reordered to attach(func, arg)")
<> 130:d75b3fe1f5cb 3499 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 3500 this->~Callback();
<> 128:9bcdf88f62b0 3501 new (this) Callback(func, obj);
<> 128:9bcdf88f62b0 3502 }
<> 128:9bcdf88f62b0 3503
<> 128:9bcdf88f62b0 3504 /** Assign a callback
<> 128:9bcdf88f62b0 3505 */
<> 128:9bcdf88f62b0 3506 Callback &operator=(const Callback &that) {
<> 128:9bcdf88f62b0 3507 if (this != &that) {
<> 128:9bcdf88f62b0 3508 this->~Callback();
<> 128:9bcdf88f62b0 3509 new (this) Callback(that);
<> 128:9bcdf88f62b0 3510 }
<> 128:9bcdf88f62b0 3511
<> 128:9bcdf88f62b0 3512 return *this;
<> 128:9bcdf88f62b0 3513 }
<> 128:9bcdf88f62b0 3514
<> 128:9bcdf88f62b0 3515 /** Call the attached function
<> 128:9bcdf88f62b0 3516 */
<> 128:9bcdf88f62b0 3517 R call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
<> 128:9bcdf88f62b0 3518 MBED_ASSERT(_ops);
<> 128:9bcdf88f62b0 3519 return _ops->call(this, a0, a1, a2, a3, a4);
<> 128:9bcdf88f62b0 3520 }
<> 128:9bcdf88f62b0 3521
<> 128:9bcdf88f62b0 3522 /** Call the attached function
<> 128:9bcdf88f62b0 3523 */
<> 128:9bcdf88f62b0 3524 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
<> 128:9bcdf88f62b0 3525 return call(a0, a1, a2, a3, a4);
<> 128:9bcdf88f62b0 3526 }
<> 128:9bcdf88f62b0 3527
<> 128:9bcdf88f62b0 3528 /** Test if function has been attached
<> 128:9bcdf88f62b0 3529 */
<> 128:9bcdf88f62b0 3530 operator bool() const {
<> 128:9bcdf88f62b0 3531 return _ops;
<> 128:9bcdf88f62b0 3532 }
<> 128:9bcdf88f62b0 3533
<> 128:9bcdf88f62b0 3534 /** Test for equality
<> 128:9bcdf88f62b0 3535 */
<> 128:9bcdf88f62b0 3536 friend bool operator==(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 3537 return memcmp(&l, &r, sizeof(Callback)) == 0;
<> 128:9bcdf88f62b0 3538 }
<> 128:9bcdf88f62b0 3539
<> 128:9bcdf88f62b0 3540 /** Test for inequality
<> 128:9bcdf88f62b0 3541 */
<> 128:9bcdf88f62b0 3542 friend bool operator!=(const Callback &l, const Callback &r) {
<> 128:9bcdf88f62b0 3543 return !(l == r);
<> 128:9bcdf88f62b0 3544 }
<> 128:9bcdf88f62b0 3545
<> 128:9bcdf88f62b0 3546 /** Static thunk for passing as C-style function
<> 128:9bcdf88f62b0 3547 * @param func Callback to call passed as void pointer
<> 128:9bcdf88f62b0 3548 */
<> 128:9bcdf88f62b0 3549 static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
<> 128:9bcdf88f62b0 3550 return static_cast<Callback*>(func)->call(a0, a1, a2, a3, a4);
<> 128:9bcdf88f62b0 3551 }
<> 128:9bcdf88f62b0 3552
<> 128:9bcdf88f62b0 3553 private:
<> 128:9bcdf88f62b0 3554 // Stored as pointer to function and pointer to optional object
<> 128:9bcdf88f62b0 3555 // Function pointer is stored as union of possible function types
<> 128:9bcdf88f62b0 3556 // to garuntee proper size and alignment
<> 128:9bcdf88f62b0 3557 struct _class;
<> 128:9bcdf88f62b0 3558 union {
<> 128:9bcdf88f62b0 3559 void (*_staticfunc)(A0, A1, A2, A3, A4);
<> 128:9bcdf88f62b0 3560 void (*_boundfunc)(_class*, A0, A1, A2, A3, A4);
<> 128:9bcdf88f62b0 3561 void (_class::*_methodfunc)(A0, A1, A2, A3, A4);
<> 128:9bcdf88f62b0 3562 } _func;
<> 128:9bcdf88f62b0 3563 void *_obj;
<> 128:9bcdf88f62b0 3564
<> 128:9bcdf88f62b0 3565 // Dynamically dispatched operations
<> 128:9bcdf88f62b0 3566 const struct ops {
<> 128:9bcdf88f62b0 3567 R (*call)(const void*, A0, A1, A2, A3, A4);
<> 128:9bcdf88f62b0 3568 void (*move)(void*, const void*);
<> 128:9bcdf88f62b0 3569 void (*dtor)(void*);
<> 128:9bcdf88f62b0 3570 } *_ops;
<> 128:9bcdf88f62b0 3571
<> 128:9bcdf88f62b0 3572 // Generate operations for function object
<> 128:9bcdf88f62b0 3573 template <typename F>
<> 128:9bcdf88f62b0 3574 void generate(const F &f) {
<> 128:9bcdf88f62b0 3575 static const ops ops = {
<> 128:9bcdf88f62b0 3576 &Callback::function_call<F>,
<> 128:9bcdf88f62b0 3577 &Callback::function_move<F>,
<> 128:9bcdf88f62b0 3578 &Callback::function_dtor<F>,
<> 128:9bcdf88f62b0 3579 };
<> 128:9bcdf88f62b0 3580
<> 130:d75b3fe1f5cb 3581 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
<> 130:d75b3fe1f5cb 3582 "Type F must not exceed the size of the Callback class");
<> 128:9bcdf88f62b0 3583 new (this) F(f);
<> 128:9bcdf88f62b0 3584 _ops = &ops;
<> 128:9bcdf88f62b0 3585 }
<> 128:9bcdf88f62b0 3586
<> 128:9bcdf88f62b0 3587 // Function attributes
<> 128:9bcdf88f62b0 3588 template <typename F>
<> 128:9bcdf88f62b0 3589 static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
<> 128:9bcdf88f62b0 3590 return (*(F*)p)(a0, a1, a2, a3, a4);
<> 128:9bcdf88f62b0 3591 }
<> 128:9bcdf88f62b0 3592
<> 128:9bcdf88f62b0 3593 template <typename F>
<> 128:9bcdf88f62b0 3594 static void function_move(void *d, const void *p) {
<> 128:9bcdf88f62b0 3595 new (d) F(*(F*)p);
<> 128:9bcdf88f62b0 3596 }
<> 128:9bcdf88f62b0 3597
<> 128:9bcdf88f62b0 3598 template <typename F>
<> 128:9bcdf88f62b0 3599 static void function_dtor(void *p) {
<> 128:9bcdf88f62b0 3600 ((F*)p)->~F();
<> 128:9bcdf88f62b0 3601 }
<> 128:9bcdf88f62b0 3602
<> 128:9bcdf88f62b0 3603 // Wrappers for functions with context
<> 128:9bcdf88f62b0 3604 template <typename O, typename M>
<> 128:9bcdf88f62b0 3605 struct method_context {
<> 128:9bcdf88f62b0 3606 M method;
<> 128:9bcdf88f62b0 3607 O *obj;
<> 128:9bcdf88f62b0 3608
<> 128:9bcdf88f62b0 3609 method_context(O *obj, M method)
<> 128:9bcdf88f62b0 3610 : method(method), obj(obj) {}
<> 128:9bcdf88f62b0 3611
<> 128:9bcdf88f62b0 3612 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
<> 128:9bcdf88f62b0 3613 return (obj->*method)(a0, a1, a2, a3, a4);
<> 128:9bcdf88f62b0 3614 }
<> 128:9bcdf88f62b0 3615 };
<> 128:9bcdf88f62b0 3616
<> 128:9bcdf88f62b0 3617 template <typename F, typename A>
<> 128:9bcdf88f62b0 3618 struct function_context {
<> 128:9bcdf88f62b0 3619 F func;
<> 128:9bcdf88f62b0 3620 A *arg;
<> 128:9bcdf88f62b0 3621
<> 128:9bcdf88f62b0 3622 function_context(F func, A *arg)
<> 128:9bcdf88f62b0 3623 : func(func), arg(arg) {}
<> 128:9bcdf88f62b0 3624
<> 128:9bcdf88f62b0 3625 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
<> 128:9bcdf88f62b0 3626 return func(arg, a0, a1, a2, a3, a4);
<> 128:9bcdf88f62b0 3627 }
<> 128:9bcdf88f62b0 3628 };
<> 128:9bcdf88f62b0 3629 };
<> 128:9bcdf88f62b0 3630
<> 128:9bcdf88f62b0 3631 // Internally used event type
<> 128:9bcdf88f62b0 3632 typedef Callback<void(int)> event_callback_t;
<> 128:9bcdf88f62b0 3633
<> 128:9bcdf88f62b0 3634
<> 128:9bcdf88f62b0 3635 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3636 *
<> 128:9bcdf88f62b0 3637 * @param func Static function to attach
<> 128:9bcdf88f62b0 3638 * @return Callback with infered type
<> 128:9bcdf88f62b0 3639 */
<> 128:9bcdf88f62b0 3640 template <typename R>
<> 128:9bcdf88f62b0 3641 Callback<R()> callback(R (*func)() = 0) {
<> 128:9bcdf88f62b0 3642 return Callback<R()>(func);
<> 128:9bcdf88f62b0 3643 }
<> 128:9bcdf88f62b0 3644
<> 128:9bcdf88f62b0 3645 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3646 *
<> 128:9bcdf88f62b0 3647 * @param func Static function to attach
<> 128:9bcdf88f62b0 3648 * @return Callback with infered type
<> 128:9bcdf88f62b0 3649 */
<> 128:9bcdf88f62b0 3650 template <typename R>
<> 128:9bcdf88f62b0 3651 Callback<R()> callback(const Callback<R()> &func) {
<> 128:9bcdf88f62b0 3652 return Callback<R()>(func);
<> 128:9bcdf88f62b0 3653 }
<> 128:9bcdf88f62b0 3654
<> 128:9bcdf88f62b0 3655 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3656 *
<> 128:9bcdf88f62b0 3657 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3658 * @param method Member function to attach
<> 128:9bcdf88f62b0 3659 * @return Callback with infered type
<> 128:9bcdf88f62b0 3660 */
<> 130:d75b3fe1f5cb 3661 template<typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3662 Callback<R()> callback(U *obj, R (T::*method)()) {
<> 130:d75b3fe1f5cb 3663 return Callback<R()>(obj, method);
<> 128:9bcdf88f62b0 3664 }
<> 128:9bcdf88f62b0 3665
<> 128:9bcdf88f62b0 3666 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3667 *
<> 128:9bcdf88f62b0 3668 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3669 * @param method Member function to attach
<> 128:9bcdf88f62b0 3670 * @return Callback with infered type
<> 128:9bcdf88f62b0 3671 */
<> 130:d75b3fe1f5cb 3672 template<typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3673 Callback<R()> callback(const U *obj, R (T::*method)() const) {
<> 130:d75b3fe1f5cb 3674 return Callback<R()>(obj, method);
<> 128:9bcdf88f62b0 3675 }
<> 128:9bcdf88f62b0 3676
<> 128:9bcdf88f62b0 3677 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3678 *
<> 128:9bcdf88f62b0 3679 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3680 * @param method Member function to attach
<> 128:9bcdf88f62b0 3681 * @return Callback with infered type
<> 128:9bcdf88f62b0 3682 */
<> 130:d75b3fe1f5cb 3683 template<typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3684 Callback<R()> callback(volatile U *obj, R (T::*method)() volatile) {
<> 130:d75b3fe1f5cb 3685 return Callback<R()>(obj, method);
<> 128:9bcdf88f62b0 3686 }
<> 128:9bcdf88f62b0 3687
<> 128:9bcdf88f62b0 3688 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3689 *
<> 128:9bcdf88f62b0 3690 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3691 * @param method Member function to attach
<> 128:9bcdf88f62b0 3692 * @return Callback with infered type
<> 128:9bcdf88f62b0 3693 */
<> 130:d75b3fe1f5cb 3694 template<typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3695 Callback<R()> callback(const volatile U *obj, R (T::*method)() const volatile) {
<> 130:d75b3fe1f5cb 3696 return Callback<R()>(obj, method);
<> 128:9bcdf88f62b0 3697 }
<> 128:9bcdf88f62b0 3698
<> 128:9bcdf88f62b0 3699 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3700 *
<> 128:9bcdf88f62b0 3701 * @param func Static function to attach
<> 128:9bcdf88f62b0 3702 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3703 * @return Callback with infered type
<> 128:9bcdf88f62b0 3704 */
<> 130:d75b3fe1f5cb 3705 template <typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3706 Callback<R()> callback(R (*func)(T*), U *arg) {
<> 128:9bcdf88f62b0 3707 return Callback<R()>(func, arg);
<> 128:9bcdf88f62b0 3708 }
<> 128:9bcdf88f62b0 3709
<> 128:9bcdf88f62b0 3710 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3711 *
<> 128:9bcdf88f62b0 3712 * @param func Static function to attach
<> 128:9bcdf88f62b0 3713 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3714 * @return Callback with infered type
<> 128:9bcdf88f62b0 3715 */
<> 130:d75b3fe1f5cb 3716 template <typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3717 Callback<R()> callback(R (*func)(const T*), const U *arg) {
<> 128:9bcdf88f62b0 3718 return Callback<R()>(func, arg);
<> 128:9bcdf88f62b0 3719 }
<> 128:9bcdf88f62b0 3720
<> 128:9bcdf88f62b0 3721 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3722 *
<> 128:9bcdf88f62b0 3723 * @param func Static function to attach
<> 128:9bcdf88f62b0 3724 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3725 * @return Callback with infered type
<> 128:9bcdf88f62b0 3726 */
<> 130:d75b3fe1f5cb 3727 template <typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3728 Callback<R()> callback(R (*func)(volatile T*), volatile U *arg) {
<> 128:9bcdf88f62b0 3729 return Callback<R()>(func, arg);
<> 128:9bcdf88f62b0 3730 }
<> 128:9bcdf88f62b0 3731
<> 128:9bcdf88f62b0 3732 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3733 *
<> 128:9bcdf88f62b0 3734 * @param func Static function to attach
<> 128:9bcdf88f62b0 3735 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3736 * @return Callback with infered type
<> 128:9bcdf88f62b0 3737 */
<> 130:d75b3fe1f5cb 3738 template <typename T, typename U, typename R>
<> 130:d75b3fe1f5cb 3739 Callback<R()> callback(R (*func)(const volatile T*), const volatile U *arg) {
<> 128:9bcdf88f62b0 3740 return Callback<R()>(func, arg);
<> 128:9bcdf88f62b0 3741 }
<> 128:9bcdf88f62b0 3742
<> 128:9bcdf88f62b0 3743 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3744 *
<> 128:9bcdf88f62b0 3745 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3746 * @param func Static function to attach
<> 128:9bcdf88f62b0 3747 * @return Callback with infered type
<> 128:9bcdf88f62b0 3748 * @deprecated
<> 128:9bcdf88f62b0 3749 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3750 */
<> 130:d75b3fe1f5cb 3751 template <typename T, typename U, typename R>
<> 128:9bcdf88f62b0 3752 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3753 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3754 Callback<R()> callback(U *obj, R (*func)(T*)) {
<> 128:9bcdf88f62b0 3755 return Callback<R()>(func, obj);
<> 128:9bcdf88f62b0 3756 }
<> 128:9bcdf88f62b0 3757
<> 128:9bcdf88f62b0 3758 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3759 *
<> 128:9bcdf88f62b0 3760 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3761 * @param func Static function to attach
<> 128:9bcdf88f62b0 3762 * @return Callback with infered type
<> 128:9bcdf88f62b0 3763 * @deprecated
<> 128:9bcdf88f62b0 3764 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3765 */
<> 130:d75b3fe1f5cb 3766 template <typename T, typename U, typename R>
<> 128:9bcdf88f62b0 3767 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3768 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3769 Callback<R()> callback(const U *obj, R (*func)(const T*)) {
<> 128:9bcdf88f62b0 3770 return Callback<R()>(func, obj);
<> 128:9bcdf88f62b0 3771 }
<> 128:9bcdf88f62b0 3772
<> 128:9bcdf88f62b0 3773 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3774 *
<> 128:9bcdf88f62b0 3775 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3776 * @param func Static function to attach
<> 128:9bcdf88f62b0 3777 * @return Callback with infered type
<> 128:9bcdf88f62b0 3778 * @deprecated
<> 128:9bcdf88f62b0 3779 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3780 */
<> 130:d75b3fe1f5cb 3781 template <typename T, typename U, typename R>
<> 128:9bcdf88f62b0 3782 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3783 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3784 Callback<R()> callback(volatile U *obj, R (*func)(volatile T*)) {
<> 128:9bcdf88f62b0 3785 return Callback<R()>(func, obj);
<> 128:9bcdf88f62b0 3786 }
<> 128:9bcdf88f62b0 3787
<> 128:9bcdf88f62b0 3788 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3789 *
<> 128:9bcdf88f62b0 3790 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3791 * @param func Static function to attach
<> 128:9bcdf88f62b0 3792 * @return Callback with infered type
<> 128:9bcdf88f62b0 3793 * @deprecated
<> 128:9bcdf88f62b0 3794 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3795 */
<> 130:d75b3fe1f5cb 3796 template <typename T, typename U, typename R>
<> 128:9bcdf88f62b0 3797 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3798 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3799 Callback<R()> callback(const volatile U *obj, R (*func)(const volatile T*)) {
<> 128:9bcdf88f62b0 3800 return Callback<R()>(func, obj);
<> 128:9bcdf88f62b0 3801 }
<> 128:9bcdf88f62b0 3802
<> 128:9bcdf88f62b0 3803
<> 128:9bcdf88f62b0 3804 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3805 *
<> 128:9bcdf88f62b0 3806 * @param func Static function to attach
<> 128:9bcdf88f62b0 3807 * @return Callback with infered type
<> 128:9bcdf88f62b0 3808 */
<> 128:9bcdf88f62b0 3809 template <typename R, typename A0>
<> 128:9bcdf88f62b0 3810 Callback<R(A0)> callback(R (*func)(A0) = 0) {
<> 128:9bcdf88f62b0 3811 return Callback<R(A0)>(func);
<> 128:9bcdf88f62b0 3812 }
<> 128:9bcdf88f62b0 3813
<> 128:9bcdf88f62b0 3814 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3815 *
<> 128:9bcdf88f62b0 3816 * @param func Static function to attach
<> 128:9bcdf88f62b0 3817 * @return Callback with infered type
<> 128:9bcdf88f62b0 3818 */
<> 128:9bcdf88f62b0 3819 template <typename R, typename A0>
<> 128:9bcdf88f62b0 3820 Callback<R(A0)> callback(const Callback<R(A0)> &func) {
<> 128:9bcdf88f62b0 3821 return Callback<R(A0)>(func);
<> 128:9bcdf88f62b0 3822 }
<> 128:9bcdf88f62b0 3823
<> 128:9bcdf88f62b0 3824 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3825 *
<> 128:9bcdf88f62b0 3826 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3827 * @param method Member function to attach
<> 128:9bcdf88f62b0 3828 * @return Callback with infered type
<> 128:9bcdf88f62b0 3829 */
<> 130:d75b3fe1f5cb 3830 template<typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3831 Callback<R(A0)> callback(U *obj, R (T::*method)(A0)) {
<> 130:d75b3fe1f5cb 3832 return Callback<R(A0)>(obj, method);
<> 128:9bcdf88f62b0 3833 }
<> 128:9bcdf88f62b0 3834
<> 128:9bcdf88f62b0 3835 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3836 *
<> 128:9bcdf88f62b0 3837 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3838 * @param method Member function to attach
<> 128:9bcdf88f62b0 3839 * @return Callback with infered type
<> 128:9bcdf88f62b0 3840 */
<> 130:d75b3fe1f5cb 3841 template<typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3842 Callback<R(A0)> callback(const U *obj, R (T::*method)(A0) const) {
<> 130:d75b3fe1f5cb 3843 return Callback<R(A0)>(obj, method);
<> 128:9bcdf88f62b0 3844 }
<> 128:9bcdf88f62b0 3845
<> 128:9bcdf88f62b0 3846 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3847 *
<> 128:9bcdf88f62b0 3848 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3849 * @param method Member function to attach
<> 128:9bcdf88f62b0 3850 * @return Callback with infered type
<> 128:9bcdf88f62b0 3851 */
<> 130:d75b3fe1f5cb 3852 template<typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3853 Callback<R(A0)> callback(volatile U *obj, R (T::*method)(A0) volatile) {
<> 130:d75b3fe1f5cb 3854 return Callback<R(A0)>(obj, method);
<> 128:9bcdf88f62b0 3855 }
<> 128:9bcdf88f62b0 3856
<> 128:9bcdf88f62b0 3857 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3858 *
<> 128:9bcdf88f62b0 3859 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3860 * @param method Member function to attach
<> 128:9bcdf88f62b0 3861 * @return Callback with infered type
<> 128:9bcdf88f62b0 3862 */
<> 130:d75b3fe1f5cb 3863 template<typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3864 Callback<R(A0)> callback(const volatile U *obj, R (T::*method)(A0) const volatile) {
<> 130:d75b3fe1f5cb 3865 return Callback<R(A0)>(obj, method);
<> 128:9bcdf88f62b0 3866 }
<> 128:9bcdf88f62b0 3867
<> 128:9bcdf88f62b0 3868 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3869 *
<> 128:9bcdf88f62b0 3870 * @param func Static function to attach
<> 128:9bcdf88f62b0 3871 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3872 * @return Callback with infered type
<> 128:9bcdf88f62b0 3873 */
<> 130:d75b3fe1f5cb 3874 template <typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3875 Callback<R(A0)> callback(R (*func)(T*, A0), U *arg) {
<> 128:9bcdf88f62b0 3876 return Callback<R(A0)>(func, arg);
<> 128:9bcdf88f62b0 3877 }
<> 128:9bcdf88f62b0 3878
<> 128:9bcdf88f62b0 3879 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3880 *
<> 128:9bcdf88f62b0 3881 * @param func Static function to attach
<> 128:9bcdf88f62b0 3882 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3883 * @return Callback with infered type
<> 128:9bcdf88f62b0 3884 */
<> 130:d75b3fe1f5cb 3885 template <typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3886 Callback<R(A0)> callback(R (*func)(const T*, A0), const U *arg) {
<> 128:9bcdf88f62b0 3887 return Callback<R(A0)>(func, arg);
<> 128:9bcdf88f62b0 3888 }
<> 128:9bcdf88f62b0 3889
<> 128:9bcdf88f62b0 3890 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3891 *
<> 128:9bcdf88f62b0 3892 * @param func Static function to attach
<> 128:9bcdf88f62b0 3893 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3894 * @return Callback with infered type
<> 128:9bcdf88f62b0 3895 */
<> 130:d75b3fe1f5cb 3896 template <typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3897 Callback<R(A0)> callback(R (*func)(volatile T*, A0), volatile U *arg) {
<> 128:9bcdf88f62b0 3898 return Callback<R(A0)>(func, arg);
<> 128:9bcdf88f62b0 3899 }
<> 128:9bcdf88f62b0 3900
<> 128:9bcdf88f62b0 3901 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3902 *
<> 128:9bcdf88f62b0 3903 * @param func Static function to attach
<> 128:9bcdf88f62b0 3904 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 3905 * @return Callback with infered type
<> 128:9bcdf88f62b0 3906 */
<> 130:d75b3fe1f5cb 3907 template <typename T, typename U, typename R, typename A0>
<> 130:d75b3fe1f5cb 3908 Callback<R(A0)> callback(R (*func)(const volatile T*, A0), const volatile U *arg) {
<> 128:9bcdf88f62b0 3909 return Callback<R(A0)>(func, arg);
<> 128:9bcdf88f62b0 3910 }
<> 128:9bcdf88f62b0 3911
<> 128:9bcdf88f62b0 3912 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3913 *
<> 128:9bcdf88f62b0 3914 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3915 * @param func Static function to attach
<> 128:9bcdf88f62b0 3916 * @return Callback with infered type
<> 128:9bcdf88f62b0 3917 * @deprecated
<> 128:9bcdf88f62b0 3918 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3919 */
<> 130:d75b3fe1f5cb 3920 template <typename T, typename U, typename R, typename A0>
<> 128:9bcdf88f62b0 3921 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3922 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3923 Callback<R(A0)> callback(U *obj, R (*func)(T*, A0)) {
<> 128:9bcdf88f62b0 3924 return Callback<R(A0)>(func, obj);
<> 128:9bcdf88f62b0 3925 }
<> 128:9bcdf88f62b0 3926
<> 128:9bcdf88f62b0 3927 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3928 *
<> 128:9bcdf88f62b0 3929 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3930 * @param func Static function to attach
<> 128:9bcdf88f62b0 3931 * @return Callback with infered type
<> 128:9bcdf88f62b0 3932 * @deprecated
<> 128:9bcdf88f62b0 3933 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3934 */
<> 130:d75b3fe1f5cb 3935 template <typename T, typename U, typename R, typename A0>
<> 128:9bcdf88f62b0 3936 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3937 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3938 Callback<R(A0)> callback(const U *obj, R (*func)(const T*, A0)) {
<> 128:9bcdf88f62b0 3939 return Callback<R(A0)>(func, obj);
<> 128:9bcdf88f62b0 3940 }
<> 128:9bcdf88f62b0 3941
<> 128:9bcdf88f62b0 3942 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3943 *
<> 128:9bcdf88f62b0 3944 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3945 * @param func Static function to attach
<> 128:9bcdf88f62b0 3946 * @return Callback with infered type
<> 128:9bcdf88f62b0 3947 * @deprecated
<> 128:9bcdf88f62b0 3948 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3949 */
<> 130:d75b3fe1f5cb 3950 template <typename T, typename U, typename R, typename A0>
<> 128:9bcdf88f62b0 3951 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3952 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3953 Callback<R(A0)> callback(volatile U *obj, R (*func)(volatile T*, A0)) {
<> 128:9bcdf88f62b0 3954 return Callback<R(A0)>(func, obj);
<> 128:9bcdf88f62b0 3955 }
<> 128:9bcdf88f62b0 3956
<> 128:9bcdf88f62b0 3957 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3958 *
<> 128:9bcdf88f62b0 3959 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3960 * @param func Static function to attach
<> 128:9bcdf88f62b0 3961 * @return Callback with infered type
<> 128:9bcdf88f62b0 3962 * @deprecated
<> 128:9bcdf88f62b0 3963 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 3964 */
<> 130:d75b3fe1f5cb 3965 template <typename T, typename U, typename R, typename A0>
<> 128:9bcdf88f62b0 3966 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 3967 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 3968 Callback<R(A0)> callback(const volatile U *obj, R (*func)(const volatile T*, A0)) {
<> 128:9bcdf88f62b0 3969 return Callback<R(A0)>(func, obj);
<> 128:9bcdf88f62b0 3970 }
<> 128:9bcdf88f62b0 3971
<> 128:9bcdf88f62b0 3972
<> 128:9bcdf88f62b0 3973 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3974 *
<> 128:9bcdf88f62b0 3975 * @param func Static function to attach
<> 128:9bcdf88f62b0 3976 * @return Callback with infered type
<> 128:9bcdf88f62b0 3977 */
<> 128:9bcdf88f62b0 3978 template <typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 3979 Callback<R(A0, A1)> callback(R (*func)(A0, A1) = 0) {
<> 128:9bcdf88f62b0 3980 return Callback<R(A0, A1)>(func);
<> 128:9bcdf88f62b0 3981 }
<> 128:9bcdf88f62b0 3982
<> 128:9bcdf88f62b0 3983 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3984 *
<> 128:9bcdf88f62b0 3985 * @param func Static function to attach
<> 128:9bcdf88f62b0 3986 * @return Callback with infered type
<> 128:9bcdf88f62b0 3987 */
<> 128:9bcdf88f62b0 3988 template <typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 3989 Callback<R(A0, A1)> callback(const Callback<R(A0, A1)> &func) {
<> 128:9bcdf88f62b0 3990 return Callback<R(A0, A1)>(func);
<> 128:9bcdf88f62b0 3991 }
<> 128:9bcdf88f62b0 3992
<> 128:9bcdf88f62b0 3993 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 3994 *
<> 128:9bcdf88f62b0 3995 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 3996 * @param method Member function to attach
<> 128:9bcdf88f62b0 3997 * @return Callback with infered type
<> 128:9bcdf88f62b0 3998 */
<> 130:d75b3fe1f5cb 3999 template<typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4000 Callback<R(A0, A1)> callback(U *obj, R (T::*method)(A0, A1)) {
<> 130:d75b3fe1f5cb 4001 return Callback<R(A0, A1)>(obj, method);
<> 128:9bcdf88f62b0 4002 }
<> 128:9bcdf88f62b0 4003
<> 128:9bcdf88f62b0 4004 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4005 *
<> 128:9bcdf88f62b0 4006 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4007 * @param method Member function to attach
<> 128:9bcdf88f62b0 4008 * @return Callback with infered type
<> 128:9bcdf88f62b0 4009 */
<> 130:d75b3fe1f5cb 4010 template<typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4011 Callback<R(A0, A1)> callback(const U *obj, R (T::*method)(A0, A1) const) {
<> 130:d75b3fe1f5cb 4012 return Callback<R(A0, A1)>(obj, method);
<> 128:9bcdf88f62b0 4013 }
<> 128:9bcdf88f62b0 4014
<> 128:9bcdf88f62b0 4015 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4016 *
<> 128:9bcdf88f62b0 4017 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4018 * @param method Member function to attach
<> 128:9bcdf88f62b0 4019 * @return Callback with infered type
<> 128:9bcdf88f62b0 4020 */
<> 130:d75b3fe1f5cb 4021 template<typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4022 Callback<R(A0, A1)> callback(volatile U *obj, R (T::*method)(A0, A1) volatile) {
<> 130:d75b3fe1f5cb 4023 return Callback<R(A0, A1)>(obj, method);
<> 128:9bcdf88f62b0 4024 }
<> 128:9bcdf88f62b0 4025
<> 128:9bcdf88f62b0 4026 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4027 *
<> 128:9bcdf88f62b0 4028 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4029 * @param method Member function to attach
<> 128:9bcdf88f62b0 4030 * @return Callback with infered type
<> 128:9bcdf88f62b0 4031 */
<> 130:d75b3fe1f5cb 4032 template<typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4033 Callback<R(A0, A1)> callback(const volatile U *obj, R (T::*method)(A0, A1) const volatile) {
<> 130:d75b3fe1f5cb 4034 return Callback<R(A0, A1)>(obj, method);
<> 128:9bcdf88f62b0 4035 }
<> 128:9bcdf88f62b0 4036
<> 128:9bcdf88f62b0 4037 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4038 *
<> 128:9bcdf88f62b0 4039 * @param func Static function to attach
<> 128:9bcdf88f62b0 4040 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4041 * @return Callback with infered type
<> 128:9bcdf88f62b0 4042 */
<> 130:d75b3fe1f5cb 4043 template <typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4044 Callback<R(A0, A1)> callback(R (*func)(T*, A0, A1), U *arg) {
<> 128:9bcdf88f62b0 4045 return Callback<R(A0, A1)>(func, arg);
<> 128:9bcdf88f62b0 4046 }
<> 128:9bcdf88f62b0 4047
<> 128:9bcdf88f62b0 4048 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4049 *
<> 128:9bcdf88f62b0 4050 * @param func Static function to attach
<> 128:9bcdf88f62b0 4051 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4052 * @return Callback with infered type
<> 128:9bcdf88f62b0 4053 */
<> 130:d75b3fe1f5cb 4054 template <typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4055 Callback<R(A0, A1)> callback(R (*func)(const T*, A0, A1), const U *arg) {
<> 128:9bcdf88f62b0 4056 return Callback<R(A0, A1)>(func, arg);
<> 128:9bcdf88f62b0 4057 }
<> 128:9bcdf88f62b0 4058
<> 128:9bcdf88f62b0 4059 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4060 *
<> 128:9bcdf88f62b0 4061 * @param func Static function to attach
<> 128:9bcdf88f62b0 4062 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4063 * @return Callback with infered type
<> 128:9bcdf88f62b0 4064 */
<> 130:d75b3fe1f5cb 4065 template <typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4066 Callback<R(A0, A1)> callback(R (*func)(volatile T*, A0, A1), volatile U *arg) {
<> 128:9bcdf88f62b0 4067 return Callback<R(A0, A1)>(func, arg);
<> 128:9bcdf88f62b0 4068 }
<> 128:9bcdf88f62b0 4069
<> 128:9bcdf88f62b0 4070 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4071 *
<> 128:9bcdf88f62b0 4072 * @param func Static function to attach
<> 128:9bcdf88f62b0 4073 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4074 * @return Callback with infered type
<> 128:9bcdf88f62b0 4075 */
<> 130:d75b3fe1f5cb 4076 template <typename T, typename U, typename R, typename A0, typename A1>
<> 130:d75b3fe1f5cb 4077 Callback<R(A0, A1)> callback(R (*func)(const volatile T*, A0, A1), const volatile U *arg) {
<> 128:9bcdf88f62b0 4078 return Callback<R(A0, A1)>(func, arg);
<> 128:9bcdf88f62b0 4079 }
<> 128:9bcdf88f62b0 4080
<> 128:9bcdf88f62b0 4081 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4082 *
<> 128:9bcdf88f62b0 4083 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4084 * @param func Static function to attach
<> 128:9bcdf88f62b0 4085 * @return Callback with infered type
<> 128:9bcdf88f62b0 4086 * @deprecated
<> 128:9bcdf88f62b0 4087 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4088 */
<> 130:d75b3fe1f5cb 4089 template <typename T, typename U, typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 4090 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4091 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4092 Callback<R(A0, A1)> callback(U *obj, R (*func)(T*, A0, A1)) {
<> 128:9bcdf88f62b0 4093 return Callback<R(A0, A1)>(func, obj);
<> 128:9bcdf88f62b0 4094 }
<> 128:9bcdf88f62b0 4095
<> 128:9bcdf88f62b0 4096 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4097 *
<> 128:9bcdf88f62b0 4098 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4099 * @param func Static function to attach
<> 128:9bcdf88f62b0 4100 * @return Callback with infered type
<> 128:9bcdf88f62b0 4101 * @deprecated
<> 128:9bcdf88f62b0 4102 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4103 */
<> 130:d75b3fe1f5cb 4104 template <typename T, typename U, typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 4105 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4106 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4107 Callback<R(A0, A1)> callback(const U *obj, R (*func)(const T*, A0, A1)) {
<> 128:9bcdf88f62b0 4108 return Callback<R(A0, A1)>(func, obj);
<> 128:9bcdf88f62b0 4109 }
<> 128:9bcdf88f62b0 4110
<> 128:9bcdf88f62b0 4111 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4112 *
<> 128:9bcdf88f62b0 4113 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4114 * @param func Static function to attach
<> 128:9bcdf88f62b0 4115 * @return Callback with infered type
<> 128:9bcdf88f62b0 4116 * @deprecated
<> 128:9bcdf88f62b0 4117 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4118 */
<> 130:d75b3fe1f5cb 4119 template <typename T, typename U, typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 4120 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4121 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4122 Callback<R(A0, A1)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1)) {
<> 128:9bcdf88f62b0 4123 return Callback<R(A0, A1)>(func, obj);
<> 128:9bcdf88f62b0 4124 }
<> 128:9bcdf88f62b0 4125
<> 128:9bcdf88f62b0 4126 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4127 *
<> 128:9bcdf88f62b0 4128 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4129 * @param func Static function to attach
<> 128:9bcdf88f62b0 4130 * @return Callback with infered type
<> 128:9bcdf88f62b0 4131 * @deprecated
<> 128:9bcdf88f62b0 4132 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4133 */
<> 130:d75b3fe1f5cb 4134 template <typename T, typename U, typename R, typename A0, typename A1>
<> 128:9bcdf88f62b0 4135 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4136 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4137 Callback<R(A0, A1)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) {
<> 128:9bcdf88f62b0 4138 return Callback<R(A0, A1)>(func, obj);
<> 128:9bcdf88f62b0 4139 }
<> 128:9bcdf88f62b0 4140
<> 128:9bcdf88f62b0 4141
<> 128:9bcdf88f62b0 4142 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4143 *
<> 128:9bcdf88f62b0 4144 * @param func Static function to attach
<> 128:9bcdf88f62b0 4145 * @return Callback with infered type
<> 128:9bcdf88f62b0 4146 */
<> 128:9bcdf88f62b0 4147 template <typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 4148 Callback<R(A0, A1, A2)> callback(R (*func)(A0, A1, A2) = 0) {
<> 128:9bcdf88f62b0 4149 return Callback<R(A0, A1, A2)>(func);
<> 128:9bcdf88f62b0 4150 }
<> 128:9bcdf88f62b0 4151
<> 128:9bcdf88f62b0 4152 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4153 *
<> 128:9bcdf88f62b0 4154 * @param func Static function to attach
<> 128:9bcdf88f62b0 4155 * @return Callback with infered type
<> 128:9bcdf88f62b0 4156 */
<> 128:9bcdf88f62b0 4157 template <typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 4158 Callback<R(A0, A1, A2)> callback(const Callback<R(A0, A1, A2)> &func) {
<> 128:9bcdf88f62b0 4159 return Callback<R(A0, A1, A2)>(func);
<> 128:9bcdf88f62b0 4160 }
<> 128:9bcdf88f62b0 4161
<> 128:9bcdf88f62b0 4162 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4163 *
<> 128:9bcdf88f62b0 4164 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4165 * @param method Member function to attach
<> 128:9bcdf88f62b0 4166 * @return Callback with infered type
<> 128:9bcdf88f62b0 4167 */
<> 130:d75b3fe1f5cb 4168 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4169 Callback<R(A0, A1, A2)> callback(U *obj, R (T::*method)(A0, A1, A2)) {
<> 130:d75b3fe1f5cb 4170 return Callback<R(A0, A1, A2)>(obj, method);
<> 128:9bcdf88f62b0 4171 }
<> 128:9bcdf88f62b0 4172
<> 128:9bcdf88f62b0 4173 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4174 *
<> 128:9bcdf88f62b0 4175 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4176 * @param method Member function to attach
<> 128:9bcdf88f62b0 4177 * @return Callback with infered type
<> 128:9bcdf88f62b0 4178 */
<> 130:d75b3fe1f5cb 4179 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4180 Callback<R(A0, A1, A2)> callback(const U *obj, R (T::*method)(A0, A1, A2) const) {
<> 130:d75b3fe1f5cb 4181 return Callback<R(A0, A1, A2)>(obj, method);
<> 128:9bcdf88f62b0 4182 }
<> 128:9bcdf88f62b0 4183
<> 128:9bcdf88f62b0 4184 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4185 *
<> 128:9bcdf88f62b0 4186 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4187 * @param method Member function to attach
<> 128:9bcdf88f62b0 4188 * @return Callback with infered type
<> 128:9bcdf88f62b0 4189 */
<> 130:d75b3fe1f5cb 4190 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4191 Callback<R(A0, A1, A2)> callback(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) {
<> 130:d75b3fe1f5cb 4192 return Callback<R(A0, A1, A2)>(obj, method);
<> 128:9bcdf88f62b0 4193 }
<> 128:9bcdf88f62b0 4194
<> 128:9bcdf88f62b0 4195 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4196 *
<> 128:9bcdf88f62b0 4197 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4198 * @param method Member function to attach
<> 128:9bcdf88f62b0 4199 * @return Callback with infered type
<> 128:9bcdf88f62b0 4200 */
<> 130:d75b3fe1f5cb 4201 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4202 Callback<R(A0, A1, A2)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) {
<> 130:d75b3fe1f5cb 4203 return Callback<R(A0, A1, A2)>(obj, method);
<> 128:9bcdf88f62b0 4204 }
<> 128:9bcdf88f62b0 4205
<> 128:9bcdf88f62b0 4206 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4207 *
<> 128:9bcdf88f62b0 4208 * @param func Static function to attach
<> 128:9bcdf88f62b0 4209 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4210 * @return Callback with infered type
<> 128:9bcdf88f62b0 4211 */
<> 130:d75b3fe1f5cb 4212 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4213 Callback<R(A0, A1, A2)> callback(R (*func)(T*, A0, A1, A2), U *arg) {
<> 128:9bcdf88f62b0 4214 return Callback<R(A0, A1, A2)>(func, arg);
<> 128:9bcdf88f62b0 4215 }
<> 128:9bcdf88f62b0 4216
<> 128:9bcdf88f62b0 4217 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4218 *
<> 128:9bcdf88f62b0 4219 * @param func Static function to attach
<> 128:9bcdf88f62b0 4220 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4221 * @return Callback with infered type
<> 128:9bcdf88f62b0 4222 */
<> 130:d75b3fe1f5cb 4223 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4224 Callback<R(A0, A1, A2)> callback(R (*func)(const T*, A0, A1, A2), const U *arg) {
<> 128:9bcdf88f62b0 4225 return Callback<R(A0, A1, A2)>(func, arg);
<> 128:9bcdf88f62b0 4226 }
<> 128:9bcdf88f62b0 4227
<> 128:9bcdf88f62b0 4228 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4229 *
<> 128:9bcdf88f62b0 4230 * @param func Static function to attach
<> 128:9bcdf88f62b0 4231 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4232 * @return Callback with infered type
<> 128:9bcdf88f62b0 4233 */
<> 130:d75b3fe1f5cb 4234 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4235 Callback<R(A0, A1, A2)> callback(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) {
<> 128:9bcdf88f62b0 4236 return Callback<R(A0, A1, A2)>(func, arg);
<> 128:9bcdf88f62b0 4237 }
<> 128:9bcdf88f62b0 4238
<> 128:9bcdf88f62b0 4239 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4240 *
<> 128:9bcdf88f62b0 4241 * @param func Static function to attach
<> 128:9bcdf88f62b0 4242 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4243 * @return Callback with infered type
<> 128:9bcdf88f62b0 4244 */
<> 130:d75b3fe1f5cb 4245 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 130:d75b3fe1f5cb 4246 Callback<R(A0, A1, A2)> callback(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) {
<> 128:9bcdf88f62b0 4247 return Callback<R(A0, A1, A2)>(func, arg);
<> 128:9bcdf88f62b0 4248 }
<> 128:9bcdf88f62b0 4249
<> 128:9bcdf88f62b0 4250 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4251 *
<> 128:9bcdf88f62b0 4252 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4253 * @param func Static function to attach
<> 128:9bcdf88f62b0 4254 * @return Callback with infered type
<> 128:9bcdf88f62b0 4255 * @deprecated
<> 128:9bcdf88f62b0 4256 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4257 */
<> 130:d75b3fe1f5cb 4258 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 4259 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4260 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4261 Callback<R(A0, A1, A2)> callback(U *obj, R (*func)(T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 4262 return Callback<R(A0, A1, A2)>(func, obj);
<> 128:9bcdf88f62b0 4263 }
<> 128:9bcdf88f62b0 4264
<> 128:9bcdf88f62b0 4265 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4266 *
<> 128:9bcdf88f62b0 4267 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4268 * @param func Static function to attach
<> 128:9bcdf88f62b0 4269 * @return Callback with infered type
<> 128:9bcdf88f62b0 4270 * @deprecated
<> 128:9bcdf88f62b0 4271 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4272 */
<> 130:d75b3fe1f5cb 4273 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 4274 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4275 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4276 Callback<R(A0, A1, A2)> callback(const U *obj, R (*func)(const T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 4277 return Callback<R(A0, A1, A2)>(func, obj);
<> 128:9bcdf88f62b0 4278 }
<> 128:9bcdf88f62b0 4279
<> 128:9bcdf88f62b0 4280 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4281 *
<> 128:9bcdf88f62b0 4282 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4283 * @param func Static function to attach
<> 128:9bcdf88f62b0 4284 * @return Callback with infered type
<> 128:9bcdf88f62b0 4285 * @deprecated
<> 128:9bcdf88f62b0 4286 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4287 */
<> 130:d75b3fe1f5cb 4288 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 4289 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4290 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4291 Callback<R(A0, A1, A2)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 4292 return Callback<R(A0, A1, A2)>(func, obj);
<> 128:9bcdf88f62b0 4293 }
<> 128:9bcdf88f62b0 4294
<> 128:9bcdf88f62b0 4295 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4296 *
<> 128:9bcdf88f62b0 4297 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4298 * @param func Static function to attach
<> 128:9bcdf88f62b0 4299 * @return Callback with infered type
<> 128:9bcdf88f62b0 4300 * @deprecated
<> 128:9bcdf88f62b0 4301 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4302 */
<> 130:d75b3fe1f5cb 4303 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
<> 128:9bcdf88f62b0 4304 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4305 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4306 Callback<R(A0, A1, A2)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) {
<> 128:9bcdf88f62b0 4307 return Callback<R(A0, A1, A2)>(func, obj);
<> 128:9bcdf88f62b0 4308 }
<> 128:9bcdf88f62b0 4309
<> 128:9bcdf88f62b0 4310
<> 128:9bcdf88f62b0 4311 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4312 *
<> 128:9bcdf88f62b0 4313 * @param func Static function to attach
<> 128:9bcdf88f62b0 4314 * @return Callback with infered type
<> 128:9bcdf88f62b0 4315 */
<> 128:9bcdf88f62b0 4316 template <typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 4317 Callback<R(A0, A1, A2, A3)> callback(R (*func)(A0, A1, A2, A3) = 0) {
<> 128:9bcdf88f62b0 4318 return Callback<R(A0, A1, A2, A3)>(func);
<> 128:9bcdf88f62b0 4319 }
<> 128:9bcdf88f62b0 4320
<> 128:9bcdf88f62b0 4321 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4322 *
<> 128:9bcdf88f62b0 4323 * @param func Static function to attach
<> 128:9bcdf88f62b0 4324 * @return Callback with infered type
<> 128:9bcdf88f62b0 4325 */
<> 128:9bcdf88f62b0 4326 template <typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 4327 Callback<R(A0, A1, A2, A3)> callback(const Callback<R(A0, A1, A2, A3)> &func) {
<> 128:9bcdf88f62b0 4328 return Callback<R(A0, A1, A2, A3)>(func);
<> 128:9bcdf88f62b0 4329 }
<> 128:9bcdf88f62b0 4330
<> 128:9bcdf88f62b0 4331 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4332 *
<> 128:9bcdf88f62b0 4333 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4334 * @param method Member function to attach
<> 128:9bcdf88f62b0 4335 * @return Callback with infered type
<> 128:9bcdf88f62b0 4336 */
<> 130:d75b3fe1f5cb 4337 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4338 Callback<R(A0, A1, A2, A3)> callback(U *obj, R (T::*method)(A0, A1, A2, A3)) {
<> 130:d75b3fe1f5cb 4339 return Callback<R(A0, A1, A2, A3)>(obj, method);
<> 128:9bcdf88f62b0 4340 }
<> 128:9bcdf88f62b0 4341
<> 128:9bcdf88f62b0 4342 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4343 *
<> 128:9bcdf88f62b0 4344 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4345 * @param method Member function to attach
<> 128:9bcdf88f62b0 4346 * @return Callback with infered type
<> 128:9bcdf88f62b0 4347 */
<> 130:d75b3fe1f5cb 4348 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4349 Callback<R(A0, A1, A2, A3)> callback(const U *obj, R (T::*method)(A0, A1, A2, A3) const) {
<> 130:d75b3fe1f5cb 4350 return Callback<R(A0, A1, A2, A3)>(obj, method);
<> 128:9bcdf88f62b0 4351 }
<> 128:9bcdf88f62b0 4352
<> 128:9bcdf88f62b0 4353 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4354 *
<> 128:9bcdf88f62b0 4355 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4356 * @param method Member function to attach
<> 128:9bcdf88f62b0 4357 * @return Callback with infered type
<> 128:9bcdf88f62b0 4358 */
<> 130:d75b3fe1f5cb 4359 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4360 Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
<> 130:d75b3fe1f5cb 4361 return Callback<R(A0, A1, A2, A3)>(obj, method);
<> 128:9bcdf88f62b0 4362 }
<> 128:9bcdf88f62b0 4363
<> 128:9bcdf88f62b0 4364 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4365 *
<> 128:9bcdf88f62b0 4366 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4367 * @param method Member function to attach
<> 128:9bcdf88f62b0 4368 * @return Callback with infered type
<> 128:9bcdf88f62b0 4369 */
<> 130:d75b3fe1f5cb 4370 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4371 Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
<> 130:d75b3fe1f5cb 4372 return Callback<R(A0, A1, A2, A3)>(obj, method);
<> 128:9bcdf88f62b0 4373 }
<> 128:9bcdf88f62b0 4374
<> 128:9bcdf88f62b0 4375 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4376 *
<> 128:9bcdf88f62b0 4377 * @param func Static function to attach
<> 128:9bcdf88f62b0 4378 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4379 * @return Callback with infered type
<> 128:9bcdf88f62b0 4380 */
<> 130:d75b3fe1f5cb 4381 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4382 Callback<R(A0, A1, A2, A3)> callback(R (*func)(T*, A0, A1, A2, A3), U *arg) {
<> 128:9bcdf88f62b0 4383 return Callback<R(A0, A1, A2, A3)>(func, arg);
<> 128:9bcdf88f62b0 4384 }
<> 128:9bcdf88f62b0 4385
<> 128:9bcdf88f62b0 4386 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4387 *
<> 128:9bcdf88f62b0 4388 * @param func Static function to attach
<> 128:9bcdf88f62b0 4389 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4390 * @return Callback with infered type
<> 128:9bcdf88f62b0 4391 */
<> 130:d75b3fe1f5cb 4392 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4393 Callback<R(A0, A1, A2, A3)> callback(R (*func)(const T*, A0, A1, A2, A3), const U *arg) {
<> 128:9bcdf88f62b0 4394 return Callback<R(A0, A1, A2, A3)>(func, arg);
<> 128:9bcdf88f62b0 4395 }
<> 128:9bcdf88f62b0 4396
<> 128:9bcdf88f62b0 4397 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4398 *
<> 128:9bcdf88f62b0 4399 * @param func Static function to attach
<> 128:9bcdf88f62b0 4400 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4401 * @return Callback with infered type
<> 128:9bcdf88f62b0 4402 */
<> 130:d75b3fe1f5cb 4403 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4404 Callback<R(A0, A1, A2, A3)> callback(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) {
<> 128:9bcdf88f62b0 4405 return Callback<R(A0, A1, A2, A3)>(func, arg);
<> 128:9bcdf88f62b0 4406 }
<> 128:9bcdf88f62b0 4407
<> 128:9bcdf88f62b0 4408 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4409 *
<> 128:9bcdf88f62b0 4410 * @param func Static function to attach
<> 128:9bcdf88f62b0 4411 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4412 * @return Callback with infered type
<> 128:9bcdf88f62b0 4413 */
<> 130:d75b3fe1f5cb 4414 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 130:d75b3fe1f5cb 4415 Callback<R(A0, A1, A2, A3)> callback(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) {
<> 128:9bcdf88f62b0 4416 return Callback<R(A0, A1, A2, A3)>(func, arg);
<> 128:9bcdf88f62b0 4417 }
<> 128:9bcdf88f62b0 4418
<> 128:9bcdf88f62b0 4419 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4420 *
<> 128:9bcdf88f62b0 4421 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4422 * @param func Static function to attach
<> 128:9bcdf88f62b0 4423 * @return Callback with infered type
<> 128:9bcdf88f62b0 4424 * @deprecated
<> 128:9bcdf88f62b0 4425 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4426 */
<> 130:d75b3fe1f5cb 4427 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 4428 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4429 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4430 Callback<R(A0, A1, A2, A3)> callback(U *obj, R (*func)(T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 4431 return Callback<R(A0, A1, A2, A3)>(func, obj);
<> 128:9bcdf88f62b0 4432 }
<> 128:9bcdf88f62b0 4433
<> 128:9bcdf88f62b0 4434 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4435 *
<> 128:9bcdf88f62b0 4436 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4437 * @param func Static function to attach
<> 128:9bcdf88f62b0 4438 * @return Callback with infered type
<> 128:9bcdf88f62b0 4439 * @deprecated
<> 128:9bcdf88f62b0 4440 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4441 */
<> 130:d75b3fe1f5cb 4442 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 4443 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4444 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4445 Callback<R(A0, A1, A2, A3)> callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 4446 return Callback<R(A0, A1, A2, A3)>(func, obj);
<> 128:9bcdf88f62b0 4447 }
<> 128:9bcdf88f62b0 4448
<> 128:9bcdf88f62b0 4449 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4450 *
<> 128:9bcdf88f62b0 4451 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4452 * @param func Static function to attach
<> 128:9bcdf88f62b0 4453 * @return Callback with infered type
<> 128:9bcdf88f62b0 4454 * @deprecated
<> 128:9bcdf88f62b0 4455 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4456 */
<> 130:d75b3fe1f5cb 4457 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 4458 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4459 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4460 Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 4461 return Callback<R(A0, A1, A2, A3)>(func, obj);
<> 128:9bcdf88f62b0 4462 }
<> 128:9bcdf88f62b0 4463
<> 128:9bcdf88f62b0 4464 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4465 *
<> 128:9bcdf88f62b0 4466 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4467 * @param func Static function to attach
<> 128:9bcdf88f62b0 4468 * @return Callback with infered type
<> 128:9bcdf88f62b0 4469 * @deprecated
<> 128:9bcdf88f62b0 4470 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4471 */
<> 130:d75b3fe1f5cb 4472 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
<> 128:9bcdf88f62b0 4473 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4474 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4475 Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) {
<> 128:9bcdf88f62b0 4476 return Callback<R(A0, A1, A2, A3)>(func, obj);
<> 128:9bcdf88f62b0 4477 }
<> 128:9bcdf88f62b0 4478
<> 128:9bcdf88f62b0 4479
<> 128:9bcdf88f62b0 4480 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4481 *
<> 128:9bcdf88f62b0 4482 * @param func Static function to attach
<> 128:9bcdf88f62b0 4483 * @return Callback with infered type
<> 128:9bcdf88f62b0 4484 */
<> 128:9bcdf88f62b0 4485 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 4486 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(A0, A1, A2, A3, A4) = 0) {
<> 128:9bcdf88f62b0 4487 return Callback<R(A0, A1, A2, A3, A4)>(func);
<> 128:9bcdf88f62b0 4488 }
<> 128:9bcdf88f62b0 4489
<> 128:9bcdf88f62b0 4490 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4491 *
<> 128:9bcdf88f62b0 4492 * @param func Static function to attach
<> 128:9bcdf88f62b0 4493 * @return Callback with infered type
<> 128:9bcdf88f62b0 4494 */
<> 128:9bcdf88f62b0 4495 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 4496 Callback<R(A0, A1, A2, A3, A4)> callback(const Callback<R(A0, A1, A2, A3, A4)> &func) {
<> 128:9bcdf88f62b0 4497 return Callback<R(A0, A1, A2, A3, A4)>(func);
<> 128:9bcdf88f62b0 4498 }
<> 128:9bcdf88f62b0 4499
<> 128:9bcdf88f62b0 4500 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4501 *
<> 128:9bcdf88f62b0 4502 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4503 * @param method Member function to attach
<> 128:9bcdf88f62b0 4504 * @return Callback with infered type
<> 128:9bcdf88f62b0 4505 */
<> 130:d75b3fe1f5cb 4506 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4507 Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
<> 130:d75b3fe1f5cb 4508 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
<> 128:9bcdf88f62b0 4509 }
<> 128:9bcdf88f62b0 4510
<> 128:9bcdf88f62b0 4511 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4512 *
<> 128:9bcdf88f62b0 4513 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4514 * @param method Member function to attach
<> 128:9bcdf88f62b0 4515 * @return Callback with infered type
<> 128:9bcdf88f62b0 4516 */
<> 130:d75b3fe1f5cb 4517 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4518 Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
<> 130:d75b3fe1f5cb 4519 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
<> 128:9bcdf88f62b0 4520 }
<> 128:9bcdf88f62b0 4521
<> 128:9bcdf88f62b0 4522 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4523 *
<> 128:9bcdf88f62b0 4524 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4525 * @param method Member function to attach
<> 128:9bcdf88f62b0 4526 * @return Callback with infered type
<> 128:9bcdf88f62b0 4527 */
<> 130:d75b3fe1f5cb 4528 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4529 Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
<> 130:d75b3fe1f5cb 4530 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
<> 128:9bcdf88f62b0 4531 }
<> 128:9bcdf88f62b0 4532
<> 128:9bcdf88f62b0 4533 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4534 *
<> 128:9bcdf88f62b0 4535 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4536 * @param method Member function to attach
<> 128:9bcdf88f62b0 4537 * @return Callback with infered type
<> 128:9bcdf88f62b0 4538 */
<> 130:d75b3fe1f5cb 4539 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4540 Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
<> 130:d75b3fe1f5cb 4541 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
<> 128:9bcdf88f62b0 4542 }
<> 128:9bcdf88f62b0 4543
<> 128:9bcdf88f62b0 4544 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4545 *
<> 128:9bcdf88f62b0 4546 * @param func Static function to attach
<> 128:9bcdf88f62b0 4547 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4548 * @return Callback with infered type
<> 128:9bcdf88f62b0 4549 */
<> 130:d75b3fe1f5cb 4550 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4551 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) {
<> 128:9bcdf88f62b0 4552 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
<> 128:9bcdf88f62b0 4553 }
<> 128:9bcdf88f62b0 4554
<> 128:9bcdf88f62b0 4555 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4556 *
<> 128:9bcdf88f62b0 4557 * @param func Static function to attach
<> 128:9bcdf88f62b0 4558 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4559 * @return Callback with infered type
<> 128:9bcdf88f62b0 4560 */
<> 130:d75b3fe1f5cb 4561 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4562 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) {
<> 128:9bcdf88f62b0 4563 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
<> 128:9bcdf88f62b0 4564 }
<> 128:9bcdf88f62b0 4565
<> 128:9bcdf88f62b0 4566 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4567 *
<> 128:9bcdf88f62b0 4568 * @param func Static function to attach
<> 128:9bcdf88f62b0 4569 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4570 * @return Callback with infered type
<> 128:9bcdf88f62b0 4571 */
<> 130:d75b3fe1f5cb 4572 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4573 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) {
<> 128:9bcdf88f62b0 4574 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
<> 128:9bcdf88f62b0 4575 }
<> 128:9bcdf88f62b0 4576
<> 128:9bcdf88f62b0 4577 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4578 *
<> 128:9bcdf88f62b0 4579 * @param func Static function to attach
<> 128:9bcdf88f62b0 4580 * @param arg Pointer argument to function
<> 128:9bcdf88f62b0 4581 * @return Callback with infered type
<> 128:9bcdf88f62b0 4582 */
<> 130:d75b3fe1f5cb 4583 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 130:d75b3fe1f5cb 4584 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) {
<> 128:9bcdf88f62b0 4585 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
<> 128:9bcdf88f62b0 4586 }
<> 128:9bcdf88f62b0 4587
<> 128:9bcdf88f62b0 4588 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4589 *
<> 128:9bcdf88f62b0 4590 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4591 * @param func Static function to attach
<> 128:9bcdf88f62b0 4592 * @return Callback with infered type
<> 128:9bcdf88f62b0 4593 * @deprecated
<> 128:9bcdf88f62b0 4594 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4595 */
<> 130:d75b3fe1f5cb 4596 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 4597 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4598 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4599 Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 4600 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
<> 128:9bcdf88f62b0 4601 }
<> 128:9bcdf88f62b0 4602
<> 128:9bcdf88f62b0 4603 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4604 *
<> 128:9bcdf88f62b0 4605 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4606 * @param func Static function to attach
<> 128:9bcdf88f62b0 4607 * @return Callback with infered type
<> 128:9bcdf88f62b0 4608 * @deprecated
<> 128:9bcdf88f62b0 4609 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4610 */
<> 130:d75b3fe1f5cb 4611 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 4612 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4613 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4614 Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 4615 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
<> 128:9bcdf88f62b0 4616 }
<> 128:9bcdf88f62b0 4617
<> 128:9bcdf88f62b0 4618 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4619 *
<> 128:9bcdf88f62b0 4620 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4621 * @param func Static function to attach
<> 128:9bcdf88f62b0 4622 * @return Callback with infered type
<> 128:9bcdf88f62b0 4623 * @deprecated
<> 128:9bcdf88f62b0 4624 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4625 */
<> 130:d75b3fe1f5cb 4626 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 4627 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4628 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4629 Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 4630 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
<> 128:9bcdf88f62b0 4631 }
<> 128:9bcdf88f62b0 4632
<> 128:9bcdf88f62b0 4633 /** Create a callback class with type infered from the arguments
<> 128:9bcdf88f62b0 4634 *
<> 128:9bcdf88f62b0 4635 * @param obj Optional pointer to object to bind to function
<> 128:9bcdf88f62b0 4636 * @param func Static function to attach
<> 128:9bcdf88f62b0 4637 * @return Callback with infered type
<> 128:9bcdf88f62b0 4638 * @deprecated
<> 128:9bcdf88f62b0 4639 * Arguments to callback have been reordered to callback(func, arg)
<> 128:9bcdf88f62b0 4640 */
<> 130:d75b3fe1f5cb 4641 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
<> 128:9bcdf88f62b0 4642 MBED_DEPRECATED_SINCE("mbed-os-5.1",
<> 128:9bcdf88f62b0 4643 "Arguments to callback have been reordered to callback(func, arg)")
<> 130:d75b3fe1f5cb 4644 Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) {
<> 128:9bcdf88f62b0 4645 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
<> 128:9bcdf88f62b0 4646 }
<> 128:9bcdf88f62b0 4647
<> 128:9bcdf88f62b0 4648
<> 128:9bcdf88f62b0 4649 } // namespace mbed
<> 128:9bcdf88f62b0 4650
<> 128:9bcdf88f62b0 4651 #endif
<> 128:9bcdf88f62b0 4652
<> 128:9bcdf88f62b0 4653
<> 128:9bcdf88f62b0 4654 /** @}*/