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:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

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