Initial commit

Dependencies:   FastPWM

Committer:
lypinator
Date:
Wed Sep 16 01:11:49 2020 +0000
Revision:
0:bb348c97df44
Added PWM

Who changed what in which revision?

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