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

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

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

Committer:
AnnaBridge
Date:
Wed Oct 11 12:36:33 2017 +0100
Revision:
153:b484a57bc302
Parent:
145:64910690c574
Release 153 of the mbed library.

Who changed what in which revision?

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