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

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

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

Committer:
AnnaBridge
Date:
Thu Nov 09 11:14:10 2017 +0000
Revision:
157:e7ca05fa8600
Parent:
156:ff21514d8981
Child:
158:1c57384330a6
Release 155 of the mbed library.

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