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