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:
Anna Bridge
Date:
Wed Jan 17 16:13:02 2018 +0000
Revision:
160:5571c4ff569f
Parent:
158:1c57384330a6
Child:
165:d1b4690b3f8b
mbed library. Release version 158

Who changed what in which revision?

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