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:
AnnaBridge
Date:
Thu Nov 08 11:45:42 2018 +0000
Revision:
171:3a7713b1edbc
Parent:
170:e95d10626187
Child:
172:65be27845400
mbed library. Release version 164

Who changed what in which revision?

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