init

Dependencies:   mbed

Committer:
Nathan Yonkee
Date:
Fri Mar 02 07:16:49 2018 -0700
Revision:
10:46a4cf51ee38
Parent:
9:d58e77ebd769
remove mbed-os

Who changed what in which revision?

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