00

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

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