Describes predefine macros for mbed online compiler (armcc)

Committer:
MACRUM
Date:
Thu Mar 16 21:58:09 2017 +0900
Revision:
6:40e873bbc5f7
Add licence header info

Who changed what in which revision?

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