Biomimetics MBED Library w/ Added Support for CAN3

Dependents:   CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2

Committer:
adimmit
Date:
Tue Mar 09 20:33:24 2021 +0000
Revision:
3:993b4d6ff61e
Parent:
0:083111ae2a11
added CAN3

Who changed what in which revision?

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