Committer:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4
Date:
Tue Jun 14 09:21:18 2022 +0000
Revision:
0:bdf663c61a82
lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1 /* mbed Microcontroller Library
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2 * Copyright (c) 2006-2015 ARM Limited
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4 * Licensed under the Apache License, Version 2.0 (the "License");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 5 * you may not use this file except in compliance with the License.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 6 * You may obtain a copy of the License at
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 7 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 8 * http://www.apache.org/licenses/LICENSE-2.0
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 9 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 10 * Unless required by applicable law or agreed to in writing, software
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 11 * distributed under the License is distributed on an "AS IS" BASIS,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 13 * See the License for the specific language governing permissions and
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 14 * limitations under the License.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 15 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 16 #ifndef MBED_CALLBACK_H
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 17 #define MBED_CALLBACK_H
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 18
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 19 #include <string.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 20 #include <stdint.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 21 #include <new>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 22 #include "platform/mbed_assert.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 23 #include "platform/mbed_toolchain.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 24
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 25 namespace mbed {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 26 /** \addtogroup platform */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 27
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 28
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 29 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 30 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 31 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 32 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 33 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 34 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 35 class Callback;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 36
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 37 // Internal sfinae declarations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 38 //
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 39 // These are used to eliminate overloads based on type attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 40 // 1. Does a function object have a call operator
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 41 // 2. Does a function object fit in the available storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 42 //
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 43 // These eliminations are handled cleanly by the compiler and avoid
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 44 // massive and misleading error messages when confronted with an
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 45 // invalid type (or worse, runtime failures)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 46 namespace detail {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 47 struct nil {};
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 48
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 49 template <bool B, typename R = nil>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 50 struct enable_if { typedef R type; };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 51
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 52 template <typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 53 struct enable_if<false, R> {};
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 54
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 55 template <typename M, M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 56 struct is_type {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 57 static const bool value = true;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 58 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 59 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 60
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 61 #define MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, M) \
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 62 typename detail::enable_if< \
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 63 detail::is_type<M, &F::operator()>::value && \
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 64 sizeof(F) <= sizeof(uintptr_t) \
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 65 >::type = detail::nil()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 66
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 67 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 68 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 69 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 70 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 71 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 72 template <typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 73 class Callback<R()> {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 74 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 75 /** Create a Callback with a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 76 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 77 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 78 Callback(R (*func)() = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 79 if (!func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 80 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 81 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 82 generate(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 83 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 84 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 85
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 86 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 87 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 88 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 89 Callback(const Callback<R()> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 90 if (func._ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 91 func._ops->move(this, &func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 92 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 93 _ops = func._ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 94 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 95
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 96 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 97 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 98 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 99 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 100 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 101 Callback(U *obj, R (T::*method)()) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 102 generate(method_context<T, R (T::*)()>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 103 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 104
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 105 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 106 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 107 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 108 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 109 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 110 Callback(const U *obj, R (T::*method)() const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 111 generate(method_context<const T, R (T::*)() const>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 112 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 113
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 114 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 115 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 116 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 117 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 118 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 119 Callback(volatile U *obj, R (T::*method)() volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 120 generate(method_context<volatile T, R (T::*)() volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 121 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 122
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 123 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 124 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 125 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 126 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 127 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 128 Callback(const volatile U *obj, R (T::*method)() const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 129 generate(method_context<const volatile T, R (T::*)() const volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 130 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 131
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 132 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 133 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 134 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 135 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 136 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 137 Callback(R (*func)(T*), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 138 generate(function_context<R (*)(T*), T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 139 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 140
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 141 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 142 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 143 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 144 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 145 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 146 Callback(R (*func)(const T*), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 147 generate(function_context<R (*)(const T*), const T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 148 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 149
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 150 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 151 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 152 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 153 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 154 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 155 Callback(R (*func)(volatile T*), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 156 generate(function_context<R (*)(volatile T*), volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 157 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 158
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 159 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 160 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 161 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 162 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 163 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 164 Callback(R (*func)(const volatile T*), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 165 generate(function_context<R (*)(const volatile T*), const volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 166 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 167
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 168 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 169 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 170 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 171 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 172 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 173 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)())) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 174 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 175 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 176
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 177 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 178 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 179 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 180 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 181 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 182 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 183 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 184 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 185
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 186 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 187 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 188 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 189 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 190 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 191 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 192 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 193 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 194
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 195 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 196 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 197 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 198 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 199 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 200 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 201 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 202 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 203
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 204 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 205 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 206 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 207 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 208 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 209 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 210 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 211 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 212 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 213 Callback(U *obj, R (*func)(T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 214 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 215 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 216
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 217 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 218 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 219 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 220 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 221 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 222 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 223 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 224 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 225 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 226 Callback(const U *obj, R (*func)(const T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 227 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 228 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 229
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 230 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 231 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 232 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 233 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 234 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 235 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 236 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 237 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 238 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 239 Callback(volatile U *obj, R (*func)(volatile T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 240 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 241 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 242
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 243 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 244 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 245 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 246 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 247 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 248 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 249 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 250 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 251 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 252 Callback(const volatile U *obj, R (*func)(const volatile T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 253 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 254 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 255
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 256 /** Destroy a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 257 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 258 ~Callback() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 259 if (_ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 260 _ops->dtor(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 261 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 262 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 263
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 264 /** Attach a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 265 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 266 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 267 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 268 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 269 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 270 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 271 void attach(R (*func)()) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 272 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 273 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 274 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 275
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 276 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 277 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 278 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 279 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 280 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 281 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 282 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 283 void attach(const Callback<R()> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 284 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 285 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 286 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 287
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 288 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 289 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 290 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 291 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 292 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 293 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 294 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 295 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 296 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 297 void attach(U *obj, R (T::*method)()) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 298 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 299 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 300 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 301
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 302 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 303 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 304 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 305 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 306 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 307 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 308 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 309 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 310 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 311 void attach(const U *obj, R (T::*method)() const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 312 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 313 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 314 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 315
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 316 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 317 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 318 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 319 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 320 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 321 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 322 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 323 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 324 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 325 void attach(volatile U *obj, R (T::*method)() volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 326 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 327 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 328 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 329
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 330 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 331 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 332 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 333 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 334 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 335 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 336 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 337 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 338 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 339 void attach(const volatile U *obj, R (T::*method)() const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 340 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 341 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 342 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 343
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 344 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 345 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 346 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 347 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 348 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 349 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 350 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 351 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 352 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 353 void attach(R (*func)(T*), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 354 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 355 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 356 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 357
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 358 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 359 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 360 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 361 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 362 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 363 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 364 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 365 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 366 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 367 void attach(R (*func)(const T*), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 368 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 369 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 370 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 371
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 372 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 373 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 374 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 375 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 376 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 377 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 378 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 379 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 380 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 381 void attach(R (*func)(volatile T*), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 382 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 383 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 384 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 385
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 386 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 387 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 388 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 389 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 390 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 391 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 392 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 393 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 394 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 395 void attach(R (*func)(const volatile T*), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 396 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 397 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 398 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 399
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 400 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 401 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 402 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 403 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 404 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 405 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 406 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 407 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 408 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 409 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)())) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 410 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 411 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 412 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 413
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 414 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 415 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 416 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 417 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 418 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 419 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 420 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 421 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 422 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 423 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 424 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 425 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 426 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 427
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 428 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 429 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 430 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 431 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 432 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 433 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 434 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 435 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 436 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 437 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 438 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 439 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 440 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 441
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 442 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 443 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 444 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 445 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 446 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 447 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 448 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 449 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 450 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 451 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)() const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 452 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 453 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 454 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 455
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 456 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 457 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 458 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 459 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 460 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 461 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 462 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 463 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 464 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 465 void attach(U *obj, R (*func)(T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 466 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 467 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 468 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 469
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 470 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 471 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 472 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 473 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 474 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 475 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 476 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 477 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 478 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 479 void attach(const U *obj, R (*func)(const T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 480 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 481 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 482 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 483
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 484 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 485 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 486 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 487 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 488 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 489 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 490 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 491 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 492 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 493 void attach(volatile U *obj, R (*func)(volatile T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 494 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 495 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 496 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 497
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 498 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 499 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 500 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 501 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 502 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 503 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 504 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 505 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 506 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 507 void attach(const volatile U *obj, R (*func)(const volatile T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 508 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 509 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 510 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 511
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 512 /** Assign a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 513 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 514 Callback &operator=(const Callback &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 515 if (this != &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 516 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 517 new (this) Callback(that);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 518 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 519
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 520 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 521 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 522
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 523 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 524 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 525 R call() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 526 MBED_ASSERT(_ops);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 527 return _ops->call(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 528 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 529
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 530 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 531 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 532 R operator()() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 533 return call();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 534 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 535
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 536 /** Test if function has been attached
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 537 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 538 operator bool() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 539 return _ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 540 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 541
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 542 /** Test for equality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 543 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 544 friend bool operator==(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 545 return memcmp(&l, &r, sizeof(Callback)) == 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 546 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 547
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 548 /** Test for inequality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 549 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 550 friend bool operator!=(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 551 return !(l == r);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 552 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 553
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 554 /** Static thunk for passing as C-style function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 555 * @param func Callback to call passed as void pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 556 * @return the value as determined by func which is of
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 557 * type and determined by the signiture of func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 558 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 559 static R thunk(void *func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 560 return static_cast<Callback*>(func)->call();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 561 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 562
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 563 private:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 564 // Stored as pointer to function and pointer to optional object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 565 // Function pointer is stored as union of possible function types
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 566 // to garuntee proper size and alignment
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 567 struct _class;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 568 union {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 569 void (*_staticfunc)();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 570 void (*_boundfunc)(_class*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 571 void (_class::*_methodfunc)();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 572 } _func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 573 void *_obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 574
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 575 // Dynamically dispatched operations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 576 const struct ops {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 577 R (*call)(const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 578 void (*move)(void*, const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 579 void (*dtor)(void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 580 } *_ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 581
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 582 // Generate operations for function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 583 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 584 void generate(const F &f) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 585 static const ops ops = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 586 &Callback::function_call<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 587 &Callback::function_move<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 588 &Callback::function_dtor<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 589 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 590
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 591 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 592 "Type F must not exceed the size of the Callback class");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 593 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 594 new (this) F(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 595 _ops = &ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 596 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 597
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 598 // Function attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 599 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 600 static R function_call(const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 601 return (*(F*)p)();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 602 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 603
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 604 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 605 static void function_move(void *d, const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 606 new (d) F(*(F*)p);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 607 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 608
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 609 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 610 static void function_dtor(void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 611 ((F*)p)->~F();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 612 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 613
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 614 // Wrappers for functions with context
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 615 template <typename O, typename M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 616 struct method_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 617 M method;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 618 O *obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 619
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 620 method_context(O *obj, M method)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 621 : method(method), obj(obj) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 622
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 623 R operator()() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 624 return (obj->*method)();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 625 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 626 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 627
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 628 template <typename F, typename A>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 629 struct function_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 630 F func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 631 A *arg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 632
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 633 function_context(F func, A *arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 634 : func(func), arg(arg) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 635
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 636 R operator()() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 637 return func(arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 638 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 639 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 640 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 641
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 642 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 643 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 644 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 645 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 646 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 647 template <typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 648 class Callback<R(A0)> {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 649 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 650 /** Create a Callback with a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 651 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 652 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 653 Callback(R (*func)(A0) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 654 if (!func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 655 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 656 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 657 generate(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 658 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 659 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 660
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 661 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 662 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 663 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 664 Callback(const Callback<R(A0)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 665 if (func._ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 666 func._ops->move(this, &func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 667 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 668 _ops = func._ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 669 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 670
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 671 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 672 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 673 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 674 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 675 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 676 Callback(U *obj, R (T::*method)(A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 677 generate(method_context<T, R (T::*)(A0)>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 678 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 679
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 680 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 681 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 682 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 683 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 684 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 685 Callback(const U *obj, R (T::*method)(A0) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 686 generate(method_context<const T, R (T::*)(A0) const>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 687 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 688
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 689 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 690 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 691 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 692 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 693 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 694 Callback(volatile U *obj, R (T::*method)(A0) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 695 generate(method_context<volatile T, R (T::*)(A0) volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 696 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 697
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 698 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 699 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 700 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 701 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 702 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 703 Callback(const volatile U *obj, R (T::*method)(A0) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 704 generate(method_context<const volatile T, R (T::*)(A0) const volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 705 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 706
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 707 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 708 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 709 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 710 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 711 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 712 Callback(R (*func)(T*, A0), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 713 generate(function_context<R (*)(T*, A0), T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 714 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 715
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 716 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 717 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 718 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 719 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 720 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 721 Callback(R (*func)(const T*, A0), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 722 generate(function_context<R (*)(const T*, A0), const T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 723 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 724
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 725 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 726 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 727 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 728 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 729 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 730 Callback(R (*func)(volatile T*, A0), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 731 generate(function_context<R (*)(volatile T*, A0), volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 732 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 733
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 734 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 735 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 736 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 737 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 738 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 739 Callback(R (*func)(const volatile T*, A0), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 740 generate(function_context<R (*)(const volatile T*, A0), const volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 741 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 742
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 743 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 744 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 745 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 746 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 747 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 748 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 749 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 750 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 751
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 752 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 753 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 754 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 755 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 756 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 757 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 758 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 759 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 760
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 761 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 762 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 763 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 764 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 765 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 766 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 767 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 768 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 769
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 770 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 771 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 772 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 773 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 774 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 775 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 776 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 777 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 778
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 779 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 780 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 781 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 782 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 783 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 784 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 785 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 786 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 787 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 788 Callback(U *obj, R (*func)(T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 789 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 790 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 791
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 792 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 793 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 794 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 795 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 796 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 797 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 798 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 799 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 800 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 801 Callback(const U *obj, R (*func)(const T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 802 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 803 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 804
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 805 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 806 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 807 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 808 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 809 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 810 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 811 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 812 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 813 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 814 Callback(volatile U *obj, R (*func)(volatile T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 815 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 816 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 817
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 818 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 819 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 820 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 821 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 822 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 823 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 824 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 825 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 826 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 827 Callback(const volatile U *obj, R (*func)(const volatile T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 828 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 829 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 830
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 831 /** Destroy a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 832 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 833 ~Callback() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 834 if (_ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 835 _ops->dtor(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 836 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 837 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 838
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 839 /** Attach a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 840 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 841 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 842 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 843 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 844 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 845 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 846 void attach(R (*func)(A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 847 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 848 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 849 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 850
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 851 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 852 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 853 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 854 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 855 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 856 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 857 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 858 void attach(const Callback<R(A0)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 859 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 860 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 861 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 862
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 863 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 864 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 865 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 866 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 867 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 868 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 869 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 870 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 871 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 872 void attach(U *obj, R (T::*method)(A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 873 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 874 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 875 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 876
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 877 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 878 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 879 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 880 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 881 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 882 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 883 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 884 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 885 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 886 void attach(const U *obj, R (T::*method)(A0) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 887 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 888 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 889 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 890
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 891 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 892 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 893 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 894 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 895 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 896 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 897 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 898 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 899 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 900 void attach(volatile U *obj, R (T::*method)(A0) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 901 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 902 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 903 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 904
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 905 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 906 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 907 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 908 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 909 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 910 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 911 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 912 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 913 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 914 void attach(const volatile U *obj, R (T::*method)(A0) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 915 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 916 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 917 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 918
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 919 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 920 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 921 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 922 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 923 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 924 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 925 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 926 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 927 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 928 void attach(R (*func)(T*, A0), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 929 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 930 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 931 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 932
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 933 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 934 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 935 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 936 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 937 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 938 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 939 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 940 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 941 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 942 void attach(R (*func)(const T*, A0), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 943 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 944 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 945 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 946
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 947 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 948 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 949 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 950 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 951 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 952 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 953 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 954 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 955 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 956 void attach(R (*func)(volatile T*, A0), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 957 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 958 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 959 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 960
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 961 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 962 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 963 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 964 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 965 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 966 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 967 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 968 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 969 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 970 void attach(R (*func)(const volatile T*, A0), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 971 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 972 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 973 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 974
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 975 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 976 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 977 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 978 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 979 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 980 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 981 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 982 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 983 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 984 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 985 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 986 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 987 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 988
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 989 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 990 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 991 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 992 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 993 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 994 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 995 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 996 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 997 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 998 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 999 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1000 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1001 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1002
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1003 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1004 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1005 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1006 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1007 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1008 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1009 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1010 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1011 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1012 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1013 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1014 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1015 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1016
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1017 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1018 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1019 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1020 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1021 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1022 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1023 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1024 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1025 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1026 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1027 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1028 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1029 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1030
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1031 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1032 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1033 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1034 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1035 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1036 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1037 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1038 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1039 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1040 void attach(U *obj, R (*func)(T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1041 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1042 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1043 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1044
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1045 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1046 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1047 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1048 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1049 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1050 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1051 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1052 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1053 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1054 void attach(const U *obj, R (*func)(const T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1055 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1056 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1057 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1058
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1059 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1060 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1061 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1062 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1063 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1064 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1065 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1066 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1067 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1068 void attach(volatile U *obj, R (*func)(volatile T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1069 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1070 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1071 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1072
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1073 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1074 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1075 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1076 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1077 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1078 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1079 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1080 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1081 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1082 void attach(const volatile U *obj, R (*func)(const volatile T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1083 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1084 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1085 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1086
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1087 /** Assign a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1088 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1089 Callback &operator=(const Callback &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1090 if (this != &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1091 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1092 new (this) Callback(that);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1093 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1094
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1095 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1096 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1097
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1098 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1099 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1100 R call(A0 a0) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1101 MBED_ASSERT(_ops);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1102 return _ops->call(this, a0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1103 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1104
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1105 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1106 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1107 R operator()(A0 a0) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1108 return call(a0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1109 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1110
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1111 /** Test if function has been attached
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1112 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1113 operator bool() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1114 return _ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1115 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1116
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1117 /** Test for equality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1118 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1119 friend bool operator==(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1120 return memcmp(&l, &r, sizeof(Callback)) == 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1121 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1122
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1123 /** Test for inequality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1124 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1125 friend bool operator!=(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1126 return !(l == r);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1127 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1128
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1129 /** Static thunk for passing as C-style function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1130 * @param func Callback to call passed as void pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1131 * @param a0 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1132 * @return the value as determined by func which is of
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1133 * type and determined by the signiture of func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1134 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1135 static R thunk(void *func, A0 a0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1136 return static_cast<Callback*>(func)->call(a0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1137 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1138
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1139 private:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1140 // Stored as pointer to function and pointer to optional object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1141 // Function pointer is stored as union of possible function types
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1142 // to garuntee proper size and alignment
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1143 struct _class;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1144 union {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1145 void (*_staticfunc)(A0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1146 void (*_boundfunc)(_class*, A0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1147 void (_class::*_methodfunc)(A0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1148 } _func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1149 void *_obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1150
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1151 // Dynamically dispatched operations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1152 const struct ops {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1153 R (*call)(const void*, A0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1154 void (*move)(void*, const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1155 void (*dtor)(void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1156 } *_ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1157
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1158 // Generate operations for function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1159 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1160 void generate(const F &f) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1161 static const ops ops = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1162 &Callback::function_call<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1163 &Callback::function_move<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1164 &Callback::function_dtor<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1165 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1166
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1167 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1168 "Type F must not exceed the size of the Callback class");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1169 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1170 new (this) F(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1171 _ops = &ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1172 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1173
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1174 // Function attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1175 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1176 static R function_call(const void *p, A0 a0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1177 return (*(F*)p)(a0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1178 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1179
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1180 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1181 static void function_move(void *d, const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1182 new (d) F(*(F*)p);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1183 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1184
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1185 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1186 static void function_dtor(void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1187 ((F*)p)->~F();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1188 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1189
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1190 // Wrappers for functions with context
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1191 template <typename O, typename M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1192 struct method_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1193 M method;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1194 O *obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1195
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1196 method_context(O *obj, M method)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1197 : method(method), obj(obj) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1198
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1199 R operator()(A0 a0) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1200 return (obj->*method)(a0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1201 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1202 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1203
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1204 template <typename F, typename A>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1205 struct function_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1206 F func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1207 A *arg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1208
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1209 function_context(F func, A *arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1210 : func(func), arg(arg) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1211
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1212 R operator()(A0 a0) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1213 return func(arg, a0);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1214 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1215 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1216 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1217
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1218 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1219 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1220 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1221 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1222 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1223 template <typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1224 class Callback<R(A0, A1)> {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1225 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1226 /** Create a Callback with a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1227 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1228 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1229 Callback(R (*func)(A0, A1) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1230 if (!func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1231 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1232 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1233 generate(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1234 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1235 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1236
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1237 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1238 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1239 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1240 Callback(const Callback<R(A0, A1)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1241 if (func._ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1242 func._ops->move(this, &func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1243 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1244 _ops = func._ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1245 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1246
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1247 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1248 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1249 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1250 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1251 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1252 Callback(U *obj, R (T::*method)(A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1253 generate(method_context<T, R (T::*)(A0, A1)>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1254 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1255
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1256 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1257 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1258 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1259 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1260 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1261 Callback(const U *obj, R (T::*method)(A0, A1) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1262 generate(method_context<const T, R (T::*)(A0, A1) const>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1263 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1264
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1265 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1266 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1267 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1268 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1269 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1270 Callback(volatile U *obj, R (T::*method)(A0, A1) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1271 generate(method_context<volatile T, R (T::*)(A0, A1) volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1272 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1273
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1274 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1275 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1276 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1277 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1278 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1279 Callback(const volatile U *obj, R (T::*method)(A0, A1) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1280 generate(method_context<const volatile T, R (T::*)(A0, A1) const volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1281 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1282
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1283 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1284 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1285 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1286 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1287 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1288 Callback(R (*func)(T*, A0, A1), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1289 generate(function_context<R (*)(T*, A0, A1), T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1290 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1291
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1292 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1293 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1294 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1295 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1296 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1297 Callback(R (*func)(const T*, A0, A1), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1298 generate(function_context<R (*)(const T*, A0, A1), const T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1299 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1300
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1301 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1302 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1303 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1304 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1305 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1306 Callback(R (*func)(volatile T*, A0, A1), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1307 generate(function_context<R (*)(volatile T*, A0, A1), volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1308 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1309
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1310 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1311 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1312 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1313 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1314 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1315 Callback(R (*func)(const volatile T*, A0, A1), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1316 generate(function_context<R (*)(const volatile T*, A0, A1), const volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1317 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1318
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1319 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1320 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1321 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1322 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1323 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1324 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1325 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1326 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1327
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1328 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1329 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1330 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1331 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1332 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1333 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1334 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1335 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1336
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1337 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1338 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1339 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1340 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1341 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1342 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1343 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1344 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1345
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1346 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1347 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1348 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1349 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1350 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1351 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1352 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1353 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1354
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1355 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1356 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1357 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1358 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1359 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1360 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1361 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1362 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1363 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1364 Callback(U *obj, R (*func)(T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1365 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1366 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1367
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1368 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1369 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1370 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1371 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1372 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1373 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1374 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1375 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1376 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1377 Callback(const U *obj, R (*func)(const T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1378 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1379 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1380
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1381 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1382 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1383 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1384 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1385 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1386 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1387 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1388 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1389 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1390 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1391 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1392 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1393
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1394 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1395 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1396 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1397 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1398 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1399 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1400 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1401 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1402 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1403 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1404 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1405 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1406
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1407 /** Destroy a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1408 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1409 ~Callback() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1410 if (_ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1411 _ops->dtor(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1412 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1413 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1414
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1415 /** Attach a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1416 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1417 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1418 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1419 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1420 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1421 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1422 void attach(R (*func)(A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1423 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1424 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1425 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1426
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1427 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1428 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1429 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1430 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1431 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1432 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1433 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1434 void attach(const Callback<R(A0, A1)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1435 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1436 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1437 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1438
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1439 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1440 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1441 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1442 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1443 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1444 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1445 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1446 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1447 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1448 void attach(U *obj, R (T::*method)(A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1449 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1450 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1451 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1452
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1453 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1454 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1455 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1456 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1457 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1458 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1459 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1460 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1461 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1462 void attach(const U *obj, R (T::*method)(A0, A1) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1463 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1464 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1465 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1466
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1467 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1468 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1469 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1470 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1471 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1472 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1473 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1474 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1475 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1476 void attach(volatile U *obj, R (T::*method)(A0, A1) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1477 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1478 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1479 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1480
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1481 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1482 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1483 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1484 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1485 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1486 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1487 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1488 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1489 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1490 void attach(const volatile U *obj, R (T::*method)(A0, A1) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1491 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1492 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1493 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1494
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1495 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1496 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1497 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1498 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1499 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1500 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1501 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1502 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1503 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1504 void attach(R (*func)(T*, A0, A1), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1505 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1506 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1507 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1508
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1509 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1510 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1511 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1512 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1513 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1514 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1515 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1516 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1517 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1518 void attach(R (*func)(const T*, A0, A1), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1519 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1520 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1521 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1522
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1523 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1524 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1525 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1526 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1527 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1528 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1529 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1530 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1531 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1532 void attach(R (*func)(volatile T*, A0, A1), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1533 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1534 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1535 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1536
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1537 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1538 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1539 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1540 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1541 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1542 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1543 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1544 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1545 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1546 void attach(R (*func)(const volatile T*, A0, A1), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1547 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1548 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1549 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1550
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1551 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1552 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1553 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1554 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1555 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1556 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1557 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1558 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1559 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1560 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1561 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1562 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1563 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1564
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1565 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1566 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1567 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1568 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1569 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1570 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1571 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1572 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1573 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1574 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1575 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1576 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1577 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1578
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1579 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1580 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1581 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1582 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1583 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1584 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1585 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1586 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1587 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1588 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1589 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1590 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1591 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1592
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1593 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1594 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1595 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1596 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1597 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1598 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1599 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1600 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1601 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1602 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1603 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1604 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1605 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1606
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1607 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1608 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1609 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1610 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1611 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1612 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1613 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1614 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1615 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1616 void attach(U *obj, R (*func)(T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1617 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1618 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1619 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1620
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1621 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1622 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1623 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1624 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1625 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1626 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1627 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1628 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1629 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1630 void attach(const U *obj, R (*func)(const T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1631 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1632 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1633 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1634
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1635 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1636 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1637 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1638 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1639 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1640 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1641 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1642 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1643 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1644 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1645 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1646 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1647 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1648
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1649 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1650 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1651 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1652 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1653 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1654 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1655 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1656 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1657 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1658 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1659 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1660 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1661 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1662
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1663 /** Assign a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1664 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1665 Callback &operator=(const Callback &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1666 if (this != &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1667 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1668 new (this) Callback(that);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1669 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1670
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1671 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1672 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1673
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1674 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1675 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1676 R call(A0 a0, A1 a1) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1677 MBED_ASSERT(_ops);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1678 return _ops->call(this, a0, a1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1679 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1680
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1681 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1682 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1683 R operator()(A0 a0, A1 a1) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1684 return call(a0, a1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1685 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1686
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1687 /** Test if function has been attached
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1688 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1689 operator bool() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1690 return _ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1691 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1692
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1693 /** Test for equality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1694 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1695 friend bool operator==(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1696 return memcmp(&l, &r, sizeof(Callback)) == 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1697 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1698
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1699 /** Test for inequality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1700 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1701 friend bool operator!=(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1702 return !(l == r);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1703 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1704
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1705 /** Static thunk for passing as C-style function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1706 * @param func Callback to call passed as void pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1707 * @param a0 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1708 * @param a1 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1709 * @return the value as determined by func which is of
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1710 * type and determined by the signiture of func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1711 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1712 static R thunk(void *func, A0 a0, A1 a1) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1713 return static_cast<Callback*>(func)->call(a0, a1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1714 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1715
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1716 private:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1717 // Stored as pointer to function and pointer to optional object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1718 // Function pointer is stored as union of possible function types
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1719 // to garuntee proper size and alignment
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1720 struct _class;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1721 union {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1722 void (*_staticfunc)(A0, A1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1723 void (*_boundfunc)(_class*, A0, A1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1724 void (_class::*_methodfunc)(A0, A1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1725 } _func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1726 void *_obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1727
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1728 // Dynamically dispatched operations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1729 const struct ops {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1730 R (*call)(const void*, A0, A1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1731 void (*move)(void*, const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1732 void (*dtor)(void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1733 } *_ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1734
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1735 // Generate operations for function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1736 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1737 void generate(const F &f) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1738 static const ops ops = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1739 &Callback::function_call<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1740 &Callback::function_move<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1741 &Callback::function_dtor<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1742 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1743
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1744 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1745 "Type F must not exceed the size of the Callback class");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1746 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1747 new (this) F(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1748 _ops = &ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1749 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1750
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1751 // Function attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1752 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1753 static R function_call(const void *p, A0 a0, A1 a1) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1754 return (*(F*)p)(a0, a1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1755 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1756
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1757 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1758 static void function_move(void *d, const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1759 new (d) F(*(F*)p);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1760 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1761
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1762 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1763 static void function_dtor(void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1764 ((F*)p)->~F();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1765 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1766
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1767 // Wrappers for functions with context
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1768 template <typename O, typename M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1769 struct method_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1770 M method;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1771 O *obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1772
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1773 method_context(O *obj, M method)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1774 : method(method), obj(obj) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1775
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1776 R operator()(A0 a0, A1 a1) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1777 return (obj->*method)(a0, a1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1778 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1779 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1780
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1781 template <typename F, typename A>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1782 struct function_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1783 F func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1784 A *arg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1785
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1786 function_context(F func, A *arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1787 : func(func), arg(arg) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1788
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1789 R operator()(A0 a0, A1 a1) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1790 return func(arg, a0, a1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1791 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1792 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1793 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1794
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1795 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1796 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1797 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1798 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1799 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1800 template <typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1801 class Callback<R(A0, A1, A2)> {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1802 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1803 /** Create a Callback with a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1804 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1805 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1806 Callback(R (*func)(A0, A1, A2) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1807 if (!func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1808 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1809 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1810 generate(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1811 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1812 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1813
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1814 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1815 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1816 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1817 Callback(const Callback<R(A0, A1, A2)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1818 if (func._ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1819 func._ops->move(this, &func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1820 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1821 _ops = func._ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1822 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1823
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1824 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1825 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1826 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1827 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1828 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1829 Callback(U *obj, R (T::*method)(A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1830 generate(method_context<T, R (T::*)(A0, A1, A2)>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1831 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1832
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1833 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1834 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1835 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1836 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1837 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1838 Callback(const U *obj, R (T::*method)(A0, A1, A2) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1839 generate(method_context<const T, R (T::*)(A0, A1, A2) const>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1840 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1841
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1842 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1843 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1844 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1845 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1846 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1847 Callback(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1848 generate(method_context<volatile T, R (T::*)(A0, A1, A2) volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1849 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1850
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1851 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1852 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1853 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1854 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1855 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1856 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1857 generate(method_context<const volatile T, R (T::*)(A0, A1, A2) const volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1858 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1859
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1860 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1861 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1862 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1863 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1864 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1865 Callback(R (*func)(T*, A0, A1, A2), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1866 generate(function_context<R (*)(T*, A0, A1, A2), T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1867 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1868
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1869 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1870 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1871 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1872 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1873 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1874 Callback(R (*func)(const T*, A0, A1, A2), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1875 generate(function_context<R (*)(const T*, A0, A1, A2), const T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1876 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1877
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1878 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1879 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1880 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1881 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1882 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1883 Callback(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1884 generate(function_context<R (*)(volatile T*, A0, A1, A2), volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1885 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1886
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1887 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1888 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1889 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1890 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1891 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1892 Callback(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1893 generate(function_context<R (*)(const volatile T*, A0, A1, A2), const volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1894 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1895
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1896 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1897 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1898 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1899 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1900 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1901 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1902 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1903 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1904
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1905 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1906 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1907 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1908 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1909 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1910 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1911 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1912 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1913
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1914 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1915 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1916 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1917 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1918 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1919 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1920 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1921 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1922
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1923 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1924 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1925 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1926 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1927 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1928 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1929 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1930 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1931
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1932 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1933 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1934 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1935 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1936 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1937 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1938 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1939 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1940 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1941 Callback(U *obj, R (*func)(T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1942 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1943 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1944
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1945 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1946 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1947 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1948 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1949 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1950 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1951 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1952 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1953 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1954 Callback(const U *obj, R (*func)(const T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1955 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1956 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1957
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1958 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1959 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1960 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1961 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1962 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1963 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1964 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1965 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1966 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1967 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1968 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1969 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1970
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1971 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1972 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1973 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1974 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1975 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1976 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1977 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1978 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1979 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1980 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1981 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1982 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1983
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1984 /** Destroy a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1985 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1986 ~Callback() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1987 if (_ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1988 _ops->dtor(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1989 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1990 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1991
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1992 /** Attach a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1993 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1994 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1995 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1996 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1997 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1998 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1999 void attach(R (*func)(A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2000 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2001 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2002 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2003
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2004 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2005 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2006 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2007 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2008 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2009 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2010 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2011 void attach(const Callback<R(A0, A1, A2)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2012 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2013 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2014 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2015
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2016 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2017 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2018 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2019 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2020 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2021 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2022 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2023 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2024 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2025 void attach(U *obj, R (T::*method)(A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2026 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2027 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2028 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2029
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2030 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2031 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2032 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2033 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2034 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2035 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2036 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2037 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2038 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2039 void attach(const U *obj, R (T::*method)(A0, A1, A2) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2040 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2041 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2042 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2043
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2044 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2045 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2046 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2047 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2048 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2049 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2050 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2051 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2052 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2053 void attach(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2054 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2055 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2056 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2057
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2058 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2059 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2060 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2061 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2062 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2063 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2064 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2065 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2066 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2067 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2068 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2069 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2070 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2071
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2072 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2073 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2074 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2075 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2076 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2077 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2078 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2079 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2080 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2081 void attach(R (*func)(T*, A0, A1, A2), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2082 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2083 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2084 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2085
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2086 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2087 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2088 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2089 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2090 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2091 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2092 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2093 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2094 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2095 void attach(R (*func)(const T*, A0, A1, A2), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2096 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2097 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2098 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2099
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2100 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2101 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2102 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2103 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2104 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2105 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2106 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2107 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2108 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2109 void attach(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2110 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2111 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2112 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2113
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2114 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2115 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2116 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2117 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2118 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2119 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2120 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2121 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2122 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2123 void attach(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2124 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2125 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2126 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2127
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2128 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2129 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2130 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2131 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2132 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2133 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2134 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2135 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2136 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2137 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2138 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2139 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2140 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2141
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2142 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2143 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2144 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2145 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2146 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2147 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2148 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2149 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2150 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2151 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2152 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2153 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2154 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2155
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2156 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2157 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2158 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2159 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2160 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2161 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2162 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2163 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2164 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2165 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2166 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2167 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2168 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2169
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2170 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2171 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2172 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2173 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2174 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2175 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2176 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2177 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2178 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2179 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2180 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2181 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2182 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2183
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2184 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2185 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2186 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2187 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2188 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2189 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2190 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2191 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2192 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2193 void attach(U *obj, R (*func)(T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2194 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2195 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2196 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2197
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2198 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2199 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2200 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2201 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2202 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2203 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2204 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2205 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2206 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2207 void attach(const U *obj, R (*func)(const T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2208 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2209 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2210 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2211
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2212 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2213 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2214 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2215 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2216 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2217 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2218 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2219 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2220 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2221 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2222 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2223 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2224 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2225
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2226 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2227 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2228 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2229 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2230 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2231 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2232 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2233 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2234 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2235 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2236 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2237 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2238 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2239
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2240 /** Assign a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2241 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2242 Callback &operator=(const Callback &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2243 if (this != &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2244 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2245 new (this) Callback(that);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2246 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2247
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2248 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2249 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2250
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2251 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2252 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2253 R call(A0 a0, A1 a1, A2 a2) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2254 MBED_ASSERT(_ops);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2255 return _ops->call(this, a0, a1, a2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2256 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2257
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2258 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2259 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2260 R operator()(A0 a0, A1 a1, A2 a2) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2261 return call(a0, a1, a2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2262 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2263
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2264 /** Test if function has been attached
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2265 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2266 operator bool() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2267 return _ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2268 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2269
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2270 /** Test for equality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2271 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2272 friend bool operator==(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2273 return memcmp(&l, &r, sizeof(Callback)) == 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2274 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2275
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2276 /** Test for inequality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2277 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2278 friend bool operator!=(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2279 return !(l == r);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2280 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2281
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2282 /** Static thunk for passing as C-style function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2283 * @param func Callback to call passed as void pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2284 * @param a0 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2285 * @param a1 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2286 * @param a2 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2287 * @return the value as determined by func which is of
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2288 * type and determined by the signiture of func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2289 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2290 static R thunk(void *func, A0 a0, A1 a1, A2 a2) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2291 return static_cast<Callback*>(func)->call(a0, a1, a2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2292 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2293
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2294 private:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2295 // Stored as pointer to function and pointer to optional object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2296 // Function pointer is stored as union of possible function types
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2297 // to garuntee proper size and alignment
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2298 struct _class;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2299 union {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2300 void (*_staticfunc)(A0, A1, A2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2301 void (*_boundfunc)(_class*, A0, A1, A2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2302 void (_class::*_methodfunc)(A0, A1, A2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2303 } _func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2304 void *_obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2305
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2306 // Dynamically dispatched operations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2307 const struct ops {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2308 R (*call)(const void*, A0, A1, A2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2309 void (*move)(void*, const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2310 void (*dtor)(void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2311 } *_ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2312
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2313 // Generate operations for function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2314 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2315 void generate(const F &f) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2316 static const ops ops = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2317 &Callback::function_call<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2318 &Callback::function_move<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2319 &Callback::function_dtor<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2320 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2321
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2322 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2323 "Type F must not exceed the size of the Callback class");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2324 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2325 new (this) F(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2326 _ops = &ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2327 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2328
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2329 // Function attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2330 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2331 static R function_call(const void *p, A0 a0, A1 a1, A2 a2) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2332 return (*(F*)p)(a0, a1, a2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2333 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2334
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2335 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2336 static void function_move(void *d, const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2337 new (d) F(*(F*)p);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2338 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2339
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2340 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2341 static void function_dtor(void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2342 ((F*)p)->~F();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2343 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2344
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2345 // Wrappers for functions with context
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2346 template <typename O, typename M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2347 struct method_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2348 M method;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2349 O *obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2350
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2351 method_context(O *obj, M method)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2352 : method(method), obj(obj) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2353
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2354 R operator()(A0 a0, A1 a1, A2 a2) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2355 return (obj->*method)(a0, a1, a2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2356 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2357 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2358
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2359 template <typename F, typename A>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2360 struct function_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2361 F func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2362 A *arg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2363
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2364 function_context(F func, A *arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2365 : func(func), arg(arg) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2366
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2367 R operator()(A0 a0, A1 a1, A2 a2) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2368 return func(arg, a0, a1, a2);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2369 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2370 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2371 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2372
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2373 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2374 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2375 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2376 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2377 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2378 template <typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2379 class Callback<R(A0, A1, A2, A3)> {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2380 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2381 /** Create a Callback with a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2382 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2383 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2384 Callback(R (*func)(A0, A1, A2, A3) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2385 if (!func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2386 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2387 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2388 generate(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2389 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2390 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2391
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2392 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2393 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2394 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2395 Callback(const Callback<R(A0, A1, A2, A3)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2396 if (func._ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2397 func._ops->move(this, &func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2398 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2399 _ops = func._ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2400 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2401
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2402 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2403 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2404 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2405 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2406 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2407 Callback(U *obj, R (T::*method)(A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2408 generate(method_context<T, R (T::*)(A0, A1, A2, A3)>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2409 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2410
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2411 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2412 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2413 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2414 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2415 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2416 Callback(const U *obj, R (T::*method)(A0, A1, A2, A3) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2417 generate(method_context<const T, R (T::*)(A0, A1, A2, A3) const>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2418 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2419
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2420 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2421 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2422 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2423 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2424 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2425 Callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2426 generate(method_context<volatile T, R (T::*)(A0, A1, A2, A3) volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2427 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2428
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2429 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2430 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2431 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2432 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2433 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2434 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2435 generate(method_context<const volatile T, R (T::*)(A0, A1, A2, A3) const volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2436 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2437
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2438 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2439 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2440 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2441 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2442 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2443 Callback(R (*func)(T*, A0, A1, A2, A3), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2444 generate(function_context<R (*)(T*, A0, A1, A2, A3), T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2445 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2446
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2447 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2448 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2449 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2450 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2451 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2452 Callback(R (*func)(const T*, A0, A1, A2, A3), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2453 generate(function_context<R (*)(const T*, A0, A1, A2, A3), const T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2454 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2455
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2456 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2457 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2458 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2459 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2460 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2461 Callback(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2462 generate(function_context<R (*)(volatile T*, A0, A1, A2, A3), volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2463 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2464
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2465 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2466 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2467 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2468 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2469 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2470 Callback(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2471 generate(function_context<R (*)(const volatile T*, A0, A1, A2, A3), const volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2472 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2473
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2474 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2475 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2476 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2477 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2478 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2479 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2480 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2481 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2482
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2483 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2484 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2485 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2486 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2487 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2488 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2489 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2490 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2491
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2492 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2493 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2494 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2495 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2496 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2497 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2498 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2499 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2500
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2501 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2502 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2503 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2504 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2505 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2506 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2507 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2508 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2509
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2510 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2511 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2512 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2513 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2514 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2515 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2516 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2517 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2518 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2519 Callback(U *obj, R (*func)(T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2520 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2521 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2522
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2523 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2524 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2525 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2526 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2527 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2528 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2529 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2530 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2531 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2532 Callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2533 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2534 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2535
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2536 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2537 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2538 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2539 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2540 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2541 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2542 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2543 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2544 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2545 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2546 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2547 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2548
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2549 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2550 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2551 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2552 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2553 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2554 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2555 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2556 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2557 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2558 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2559 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2560 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2561
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2562 /** Destroy a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2563 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2564 ~Callback() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2565 if (_ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2566 _ops->dtor(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2567 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2568 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2569
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2570 /** Attach a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2571 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2572 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2573 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2574 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2575 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2576 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2577 void attach(R (*func)(A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2578 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2579 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2580 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2581
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2582 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2583 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2584 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2585 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2586 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2587 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2588 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2589 void attach(const Callback<R(A0, A1, A2, A3)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2590 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2591 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2592 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2593
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2594 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2595 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2596 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2597 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2598 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2599 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2600 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2601 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2602 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2603 void attach(U *obj, R (T::*method)(A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2604 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2605 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2606 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2607
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2608 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2609 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2610 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2611 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2612 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2613 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2614 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2615 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2616 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2617 void attach(const U *obj, R (T::*method)(A0, A1, A2, A3) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2618 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2619 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2620 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2621
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2622 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2623 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2624 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2625 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2626 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2627 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2628 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2629 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2630 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2631 void attach(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2632 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2633 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2634 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2635
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2636 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2637 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2638 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2639 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2640 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2641 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2642 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2643 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2644 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2645 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2646 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2647 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2648 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2649
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2650 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2651 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2652 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2653 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2654 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2655 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2656 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2657 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2658 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2659 void attach(R (*func)(T*, A0, A1, A2, A3), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2660 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2661 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2662 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2663
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2664 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2665 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2666 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2667 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2668 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2669 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2670 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2671 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2672 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2673 void attach(R (*func)(const T*, A0, A1, A2, A3), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2674 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2675 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2676 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2677
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2678 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2679 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2680 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2681 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2682 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2683 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2684 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2685 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2686 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2687 void attach(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2688 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2689 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2690 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2691
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2692 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2693 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2694 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2695 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2696 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2697 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2698 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2699 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2700 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2701 void attach(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2702 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2703 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2704 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2705
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2706 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2707 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2708 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2709 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2710 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2711 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2712 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2713 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2714 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2715 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2716 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2717 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2718 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2719
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2720 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2721 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2722 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2723 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2724 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2725 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2726 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2727 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2728 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2729 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2730 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2731 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2732 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2733
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2734 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2735 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2736 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2737 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2738 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2739 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2740 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2741 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2742 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2743 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2744 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2745 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2746 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2747
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2748 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2749 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2750 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2751 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2752 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2753 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2754 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2755 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2756 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2757 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2758 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2759 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2760 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2761
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2762 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2763 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2764 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2765 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2766 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2767 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2768 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2769 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2770 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2771 void attach(U *obj, R (*func)(T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2772 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2773 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2774 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2775
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2776 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2777 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2778 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2779 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2780 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2781 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2782 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2783 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2784 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2785 void attach(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2786 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2787 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2788 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2789
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2790 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2791 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2792 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2793 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2794 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2795 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2796 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2797 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2798 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2799 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2800 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2801 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2802 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2803
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2804 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2805 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2806 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2807 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2808 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2809 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2810 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2811 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2812 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2813 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2814 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2815 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2816 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2817
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2818 /** Assign a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2819 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2820 Callback &operator=(const Callback &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2821 if (this != &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2822 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2823 new (this) Callback(that);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2824 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2825
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2826 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2827 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2828
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2829 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2830 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2831 R call(A0 a0, A1 a1, A2 a2, A3 a3) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2832 MBED_ASSERT(_ops);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2833 return _ops->call(this, a0, a1, a2, a3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2834 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2835
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2836 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2837 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2838 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2839 return call(a0, a1, a2, a3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2840 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2841
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2842 /** Test if function has been attached
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2843 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2844 operator bool() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2845 return _ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2846 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2847
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2848 /** Test for equality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2849 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2850 friend bool operator==(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2851 return memcmp(&l, &r, sizeof(Callback)) == 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2852 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2853
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2854 /** Test for inequality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2855 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2856 friend bool operator!=(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2857 return !(l == r);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2858 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2859
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2860 /** Static thunk for passing as C-style function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2861 * @param func Callback to call passed as void pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2862 * @param a0 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2863 * @param a1 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2864 * @param a2 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2865 * @param a3 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2866 * @return the value as determined by func which is of
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2867 * type and determined by the signiture of func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2868 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2869 static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2870 return static_cast<Callback*>(func)->call(a0, a1, a2, a3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2871 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2872
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2873 private:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2874 // Stored as pointer to function and pointer to optional object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2875 // Function pointer is stored as union of possible function types
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2876 // to garuntee proper size and alignment
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2877 struct _class;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2878 union {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2879 void (*_staticfunc)(A0, A1, A2, A3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2880 void (*_boundfunc)(_class*, A0, A1, A2, A3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2881 void (_class::*_methodfunc)(A0, A1, A2, A3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2882 } _func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2883 void *_obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2884
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2885 // Dynamically dispatched operations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2886 const struct ops {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2887 R (*call)(const void*, A0, A1, A2, A3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2888 void (*move)(void*, const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2889 void (*dtor)(void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2890 } *_ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2891
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2892 // Generate operations for function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2893 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2894 void generate(const F &f) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2895 static const ops ops = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2896 &Callback::function_call<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2897 &Callback::function_move<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2898 &Callback::function_dtor<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2899 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2900
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2901 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2902 "Type F must not exceed the size of the Callback class");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2903 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2904 new (this) F(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2905 _ops = &ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2906 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2907
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2908 // Function attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2909 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2910 static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2911 return (*(F*)p)(a0, a1, a2, a3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2912 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2913
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2914 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2915 static void function_move(void *d, const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2916 new (d) F(*(F*)p);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2917 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2918
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2919 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2920 static void function_dtor(void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2921 ((F*)p)->~F();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2922 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2923
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2924 // Wrappers for functions with context
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2925 template <typename O, typename M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2926 struct method_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2927 M method;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2928 O *obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2929
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2930 method_context(O *obj, M method)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2931 : method(method), obj(obj) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2932
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2933 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2934 return (obj->*method)(a0, a1, a2, a3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2935 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2936 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2937
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2938 template <typename F, typename A>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2939 struct function_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2940 F func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2941 A *arg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2942
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2943 function_context(F func, A *arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2944 : func(func), arg(arg) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2945
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2946 R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2947 return func(arg, a0, a1, a2, a3);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2948 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2949 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2950 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2951
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2952 /** Callback class based on template specialization
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2953 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2954 * @note Synchronization level: Not protected
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2955 * @ingroup platform
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2956 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2957 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2958 class Callback<R(A0, A1, A2, A3, A4)> {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2959 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2960 /** Create a Callback with a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2961 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2962 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2963 Callback(R (*func)(A0, A1, A2, A3, A4) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2964 if (!func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2965 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2966 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2967 generate(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2968 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2969 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2970
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2971 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2972 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2973 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2974 Callback(const Callback<R(A0, A1, A2, A3, A4)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2975 if (func._ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2976 func._ops->move(this, &func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2977 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2978 _ops = func._ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2979 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2980
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2981 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2982 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2983 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2984 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2985 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2986 Callback(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2987 generate(method_context<T, R (T::*)(A0, A1, A2, A3, A4)>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2988 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2989
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2990 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2991 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2992 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2993 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2994 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2995 Callback(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2996 generate(method_context<const T, R (T::*)(A0, A1, A2, A3, A4) const>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2997 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2998
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2999 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3000 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3001 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3002 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3003 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3004 Callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3005 generate(method_context<volatile T, R (T::*)(A0, A1, A2, A3, A4) volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3006 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3007
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3008 /** Create a Callback with a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3009 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3010 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3011 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3012 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3013 Callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3014 generate(method_context<const volatile T, R (T::*)(A0, A1, A2, A3, A4) const volatile>(obj, method));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3015 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3016
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3017 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3018 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3019 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3020 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3021 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3022 Callback(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3023 generate(function_context<R (*)(T*, A0, A1, A2, A3, A4), T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3024 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3025
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3026 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3027 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3028 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3029 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3030 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3031 Callback(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3032 generate(function_context<R (*)(const T*, A0, A1, A2, A3, A4), const T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3033 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3034
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3035 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3036 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3037 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3038 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3039 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3040 Callback(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3041 generate(function_context<R (*)(volatile T*, A0, A1, A2, A3, A4), volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3042 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3043
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3044 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3045 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3046 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3047 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3048 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3049 Callback(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3050 generate(function_context<R (*)(const volatile T*, A0, A1, A2, A3, A4), const volatile T>(func, arg));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3051 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3052
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3053 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3054 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3055 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3056 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3057 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3058 Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3059 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3060 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3061
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3062 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3063 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3064 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3065 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3066 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3067 Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3068 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3069 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3070
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3071 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3072 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3073 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3074 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3075 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3076 Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3077 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3078 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3079
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3080 /** Create a Callback with a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3081 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3082 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3083 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3084 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3085 Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3086 generate(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3087 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3088
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3089 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3090 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3091 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3092 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3093 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3094 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3095 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3096 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3097 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3098 Callback(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3099 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3100 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3101
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3102 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3103 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3104 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3105 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3106 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3107 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3108 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3109 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3110 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3111 Callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3112 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3113 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3114
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3115 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3116 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3117 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3118 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3119 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3120 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3121 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3122 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3123 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3124 Callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3125 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3126 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3127
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3128 /** Create a Callback with a static function and bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3129 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3130 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3131 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3132 * Arguments to callback have been reordered to Callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3133 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3134 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3135 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3136 "Arguments to callback have been reordered to Callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3137 Callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3138 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3139 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3140
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3141 /** Destroy a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3142 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3143 ~Callback() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3144 if (_ops) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3145 _ops->dtor(this);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3146 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3147 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3148
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3149 /** Attach a static function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3150 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3151 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3152 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3153 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3154 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3155 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3156 void attach(R (*func)(A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3157 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3158 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3159 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3160
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3161 /** Attach a Callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3162 * @param func The Callback to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3163 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3164 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3165 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3166 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3167 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3168 void attach(const Callback<R(A0, A1, A2, A3, A4)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3169 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3170 new (this) Callback(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3171 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3172
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3173 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3174 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3175 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3176 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3177 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3178 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3179 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3180 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3181 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3182 void attach(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3183 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3184 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3185 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3186
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3187 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3188 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3189 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3190 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3191 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3192 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3193 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3194 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3195 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3196 void attach(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3197 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3198 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3199 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3200
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3201 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3202 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3203 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3204 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3205 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3206 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3207 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3208 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3209 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3210 void attach(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3211 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3212 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3213 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3214
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3215 /** Attach a member function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3216 * @param obj Pointer to object to invoke member function on
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3217 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3218 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3219 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3220 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3221 template<typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3222 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3223 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3224 void attach(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3225 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3226 new (this) Callback(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3227 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3228
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3229 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3230 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3231 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3232 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3233 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3234 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3235 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3236 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3237 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3238 void attach(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3239 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3240 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3241 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3242
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3243 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3244 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3245 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3246 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3247 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3248 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3249 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3250 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3251 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3252 void attach(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3253 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3254 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3255 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3256
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3257 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3258 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3259 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3260 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3261 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3262 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3263 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3264 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3265 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3266 void attach(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3267 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3268 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3269 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3270
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3271 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3272 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3273 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3274 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3275 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3276 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3277 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3278 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3279 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3280 void attach(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3281 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3282 new (this) Callback(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3283 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3284
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3285 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3286 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3287 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3288 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3289 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3290 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3291 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3292 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3293 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3294 void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4))) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3295 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3296 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3297 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3298
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3299 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3300 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3301 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3302 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3303 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3304 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3305 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3306 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3307 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3308 void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3309 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3310 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3311 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3312
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3313 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3314 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3315 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3316 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3317 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3318 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3319 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3320 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3321 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3322 void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3323 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3324 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3325 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3326
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3327 /** Attach a function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3328 * @param f Function object to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3329 * @note The function object is limited to a single word of storage
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3330 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3331 * Replaced by simple assignment 'Callback cb = func'
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3332 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3333 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3334 MBED_DEPRECATED_SINCE("mbed-os-5.4",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3335 "Replaced by simple assignment 'Callback cb = func")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3336 void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R (F::*)(A0, A1, A2, A3, A4) const volatile)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3337 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3338 new (this) Callback(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3339 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3340
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3341 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3342 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3343 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3344 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3345 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3346 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3347 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3348 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3349 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3350 void attach(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3351 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3352 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3353 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3354
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3355 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3356 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3357 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3358 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3359 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3360 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3361 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3362 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3363 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3364 void attach(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3365 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3366 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3367 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3368
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3369 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3370 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3371 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3372 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3373 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3374 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3375 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3376 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3377 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3378 void attach(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3379 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3380 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3381 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3382
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3383 /** Attach a static function with a bound pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3384 * @param obj Pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3385 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3386 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3387 * Arguments to callback have been reordered to attach(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3388 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3389 template <typename T, typename U>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3390 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3391 "Arguments to callback have been reordered to attach(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3392 void attach(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3393 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3394 new (this) Callback(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3395 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3396
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3397 /** Assign a callback
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3398 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3399 Callback &operator=(const Callback &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3400 if (this != &that) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3401 this->~Callback();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3402 new (this) Callback(that);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3403 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3404
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3405 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3406 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3407
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3408 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3409 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3410 R call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3411 MBED_ASSERT(_ops);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3412 return _ops->call(this, a0, a1, a2, a3, a4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3413 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3414
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3415 /** Call the attached function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3416 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3417 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3418 return call(a0, a1, a2, a3, a4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3419 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3420
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3421 /** Test if function has been attached
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3422 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3423 operator bool() const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3424 return _ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3425 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3426
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3427 /** Test for equality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3428 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3429 friend bool operator==(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3430 return memcmp(&l, &r, sizeof(Callback)) == 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3431 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3432
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3433 /** Test for inequality
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3434 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3435 friend bool operator!=(const Callback &l, const Callback &r) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3436 return !(l == r);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3437 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3438
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3439 /** Static thunk for passing as C-style function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3440 * @param func Callback to call passed as void pointer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3441 * @param a0 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3442 * @param a1 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3443 * @param a2 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3444 * @param a3 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3445 * @param a4 An argument to be called with function func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3446 * @return the value as determined by func which is of
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3447 * type and determined by the signiture of func
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3448 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3449 static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3450 return static_cast<Callback*>(func)->call(a0, a1, a2, a3, a4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3451 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3452
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3453 private:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3454 // Stored as pointer to function and pointer to optional object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3455 // Function pointer is stored as union of possible function types
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3456 // to garuntee proper size and alignment
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3457 struct _class;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3458 union {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3459 void (*_staticfunc)(A0, A1, A2, A3, A4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3460 void (*_boundfunc)(_class*, A0, A1, A2, A3, A4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3461 void (_class::*_methodfunc)(A0, A1, A2, A3, A4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3462 } _func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3463 void *_obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3464
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3465 // Dynamically dispatched operations
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3466 const struct ops {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3467 R (*call)(const void*, A0, A1, A2, A3, A4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3468 void (*move)(void*, const void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3469 void (*dtor)(void*);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3470 } *_ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3471
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3472 // Generate operations for function object
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3473 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3474 void generate(const F &f) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3475 static const ops ops = {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3476 &Callback::function_call<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3477 &Callback::function_move<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3478 &Callback::function_dtor<F>,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3479 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3480
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3481 MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F),
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3482 "Type F must not exceed the size of the Callback class");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3483 memset(this, 0, sizeof(Callback));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3484 new (this) F(f);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3485 _ops = &ops;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3486 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3487
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3488 // Function attributes
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3489 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3490 static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3491 return (*(F*)p)(a0, a1, a2, a3, a4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3492 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3493
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3494 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3495 static void function_move(void *d, const void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3496 new (d) F(*(F*)p);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3497 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3498
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3499 template <typename F>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3500 static void function_dtor(void *p) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3501 ((F*)p)->~F();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3502 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3503
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3504 // Wrappers for functions with context
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3505 template <typename O, typename M>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3506 struct method_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3507 M method;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3508 O *obj;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3509
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3510 method_context(O *obj, M method)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3511 : method(method), obj(obj) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3512
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3513 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3514 return (obj->*method)(a0, a1, a2, a3, a4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3515 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3516 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3517
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3518 template <typename F, typename A>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3519 struct function_context {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3520 F func;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3521 A *arg;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3522
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3523 function_context(F func, A *arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3524 : func(func), arg(arg) {}
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3525
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3526 R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3527 return func(arg, a0, a1, a2, a3, a4);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3528 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3529 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3530 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3531
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3532 // Internally used event type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3533 typedef Callback<void(int)> event_callback_t;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3534
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3535
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3536 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3537 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3538 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3539 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3540 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3541 template <typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3542 Callback<R()> callback(R (*func)() = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3543 return Callback<R()>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3544 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3545
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3546 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3547 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3548 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3549 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3550 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3551 template <typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3552 Callback<R()> callback(const Callback<R()> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3553 return Callback<R()>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3554 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3555
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3556 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3557 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3558 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3559 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3560 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3561 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3562 template<typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3563 Callback<R()> callback(U *obj, R (T::*method)()) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3564 return Callback<R()>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3565 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3566
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3567 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3568 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3569 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3570 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3571 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3572 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3573 template<typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3574 Callback<R()> callback(const U *obj, R (T::*method)() const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3575 return Callback<R()>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3576 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3577
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3578 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3579 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3580 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3581 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3582 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3583 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3584 template<typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3585 Callback<R()> callback(volatile U *obj, R (T::*method)() volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3586 return Callback<R()>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3587 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3588
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3589 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3590 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3591 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3592 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3593 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3594 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3595 template<typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3596 Callback<R()> callback(const volatile U *obj, R (T::*method)() const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3597 return Callback<R()>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3598 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3599
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3600 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3601 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3602 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3603 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3604 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3605 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3606 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3607 Callback<R()> callback(R (*func)(T*), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3608 return Callback<R()>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3609 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3610
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3611 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3612 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3613 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3614 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3615 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3616 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3617 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3618 Callback<R()> callback(R (*func)(const T*), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3619 return Callback<R()>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3620 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3621
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3622 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3623 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3624 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3625 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3626 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3627 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3628 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3629 Callback<R()> callback(R (*func)(volatile T*), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3630 return Callback<R()>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3631 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3632
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3633 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3634 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3635 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3636 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3637 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3638 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3639 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3640 Callback<R()> callback(R (*func)(const volatile T*), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3641 return Callback<R()>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3642 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3643
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3644 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3645 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3646 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3647 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3648 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3649 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3650 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3651 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3652 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3653 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3654 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3655 Callback<R()> callback(U *obj, R (*func)(T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3656 return Callback<R()>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3657 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3658
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3659 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3660 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3661 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3662 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3663 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3664 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3665 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3666 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3667 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3668 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3669 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3670 Callback<R()> callback(const U *obj, R (*func)(const T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3671 return Callback<R()>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3672 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3673
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3674 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3675 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3676 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3677 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3678 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3679 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3680 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3681 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3682 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3683 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3684 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3685 Callback<R()> callback(volatile U *obj, R (*func)(volatile T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3686 return Callback<R()>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3687 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3688
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3689 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3690 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3691 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3692 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3693 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3694 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3695 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3696 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3697 template <typename T, typename U, typename R>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3698 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3699 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3700 Callback<R()> callback(const volatile U *obj, R (*func)(const volatile T*)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3701 return Callback<R()>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3702 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3703
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3704
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3705 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3706 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3707 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3708 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3709 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3710 template <typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3711 Callback<R(A0)> callback(R (*func)(A0) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3712 return Callback<R(A0)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3713 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3714
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3715 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3716 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3717 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3718 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3719 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3720 template <typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3721 Callback<R(A0)> callback(const Callback<R(A0)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3722 return Callback<R(A0)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3723 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3724
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3725 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3726 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3727 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3728 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3729 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3730 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3731 template<typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3732 Callback<R(A0)> callback(U *obj, R (T::*method)(A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3733 return Callback<R(A0)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3734 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3735
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3736 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3737 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3738 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3739 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3740 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3741 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3742 template<typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3743 Callback<R(A0)> callback(const U *obj, R (T::*method)(A0) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3744 return Callback<R(A0)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3745 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3746
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3747 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3748 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3749 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3750 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3751 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3752 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3753 template<typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3754 Callback<R(A0)> callback(volatile U *obj, R (T::*method)(A0) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3755 return Callback<R(A0)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3756 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3757
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3758 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3759 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3760 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3761 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3762 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3763 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3764 template<typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3765 Callback<R(A0)> callback(const volatile U *obj, R (T::*method)(A0) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3766 return Callback<R(A0)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3767 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3768
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3769 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3770 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3771 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3772 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3773 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3774 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3775 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3776 Callback<R(A0)> callback(R (*func)(T*, A0), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3777 return Callback<R(A0)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3778 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3779
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3780 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3781 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3782 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3783 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3784 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3785 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3786 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3787 Callback<R(A0)> callback(R (*func)(const T*, A0), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3788 return Callback<R(A0)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3789 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3790
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3791 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3792 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3793 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3794 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3795 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3796 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3797 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3798 Callback<R(A0)> callback(R (*func)(volatile T*, A0), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3799 return Callback<R(A0)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3800 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3801
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3802 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3803 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3804 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3805 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3806 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3807 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3808 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3809 Callback<R(A0)> callback(R (*func)(const volatile T*, A0), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3810 return Callback<R(A0)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3811 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3812
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3813 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3814 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3815 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3816 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3817 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3818 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3819 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3820 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3821 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3822 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3823 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3824 Callback<R(A0)> callback(U *obj, R (*func)(T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3825 return Callback<R(A0)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3826 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3827
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3828 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3829 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3830 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3831 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3832 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3833 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3834 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3835 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3836 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3837 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3838 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3839 Callback<R(A0)> callback(const U *obj, R (*func)(const T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3840 return Callback<R(A0)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3841 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3842
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3843 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3844 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3845 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3846 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3847 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3848 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3849 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3850 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3851 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3852 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3853 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3854 Callback<R(A0)> callback(volatile U *obj, R (*func)(volatile T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3855 return Callback<R(A0)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3856 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3857
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3858 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3859 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3860 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3861 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3862 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3863 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3864 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3865 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3866 template <typename T, typename U, typename R, typename A0>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3867 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3868 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3869 Callback<R(A0)> callback(const volatile U *obj, R (*func)(const volatile T*, A0)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3870 return Callback<R(A0)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3871 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3872
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3873
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3874 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3875 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3876 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3877 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3878 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3879 template <typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3880 Callback<R(A0, A1)> callback(R (*func)(A0, A1) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3881 return Callback<R(A0, A1)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3882 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3883
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3884 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3885 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3886 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3887 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3888 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3889 template <typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3890 Callback<R(A0, A1)> callback(const Callback<R(A0, A1)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3891 return Callback<R(A0, A1)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3892 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3893
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3894 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3895 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3896 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3897 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3898 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3899 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3900 template<typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3901 Callback<R(A0, A1)> callback(U *obj, R (T::*method)(A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3902 return Callback<R(A0, A1)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3903 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3904
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3905 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3906 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3907 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3908 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3909 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3910 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3911 template<typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3912 Callback<R(A0, A1)> callback(const U *obj, R (T::*method)(A0, A1) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3913 return Callback<R(A0, A1)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3914 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3915
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3916 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3917 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3918 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3919 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3920 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3921 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3922 template<typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3923 Callback<R(A0, A1)> callback(volatile U *obj, R (T::*method)(A0, A1) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3924 return Callback<R(A0, A1)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3925 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3926
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3927 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3928 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3929 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3930 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3931 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3932 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3933 template<typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3934 Callback<R(A0, A1)> callback(const volatile U *obj, R (T::*method)(A0, A1) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3935 return Callback<R(A0, A1)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3936 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3937
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3938 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3939 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3940 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3941 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3942 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3943 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3944 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3945 Callback<R(A0, A1)> callback(R (*func)(T*, A0, A1), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3946 return Callback<R(A0, A1)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3947 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3948
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3949 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3950 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3951 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3952 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3953 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3954 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3955 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3956 Callback<R(A0, A1)> callback(R (*func)(const T*, A0, A1), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3957 return Callback<R(A0, A1)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3958 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3959
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3960 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3961 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3962 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3963 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3964 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3965 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3966 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3967 Callback<R(A0, A1)> callback(R (*func)(volatile T*, A0, A1), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3968 return Callback<R(A0, A1)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3969 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3970
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3971 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3972 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3973 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3974 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3975 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3976 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3977 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3978 Callback<R(A0, A1)> callback(R (*func)(const volatile T*, A0, A1), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3979 return Callback<R(A0, A1)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3980 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3981
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3982 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3983 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3984 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3985 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3986 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3987 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3988 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3989 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3990 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3991 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3992 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3993 Callback<R(A0, A1)> callback(U *obj, R (*func)(T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3994 return Callback<R(A0, A1)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3995 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3996
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3997 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3998 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3999 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4000 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4001 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4002 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4003 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4004 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4005 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4006 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4007 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4008 Callback<R(A0, A1)> callback(const U *obj, R (*func)(const T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4009 return Callback<R(A0, A1)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4010 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4011
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4012 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4013 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4014 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4015 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4016 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4017 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4018 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4019 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4020 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4021 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4022 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4023 Callback<R(A0, A1)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4024 return Callback<R(A0, A1)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4025 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4026
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4027 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4028 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4029 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4030 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4031 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4032 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4033 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4034 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4035 template <typename T, typename U, typename R, typename A0, typename A1>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4036 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4037 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4038 Callback<R(A0, A1)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4039 return Callback<R(A0, A1)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4040 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4041
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4042
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4043 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4044 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4045 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4046 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4047 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4048 template <typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4049 Callback<R(A0, A1, A2)> callback(R (*func)(A0, A1, A2) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4050 return Callback<R(A0, A1, A2)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4051 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4052
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4053 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4054 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4055 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4056 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4057 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4058 template <typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4059 Callback<R(A0, A1, A2)> callback(const Callback<R(A0, A1, A2)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4060 return Callback<R(A0, A1, A2)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4061 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4062
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4063 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4064 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4065 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4066 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4067 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4068 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4069 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4070 Callback<R(A0, A1, A2)> callback(U *obj, R (T::*method)(A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4071 return Callback<R(A0, A1, A2)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4072 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4073
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4074 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4075 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4076 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4077 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4078 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4079 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4080 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4081 Callback<R(A0, A1, A2)> callback(const U *obj, R (T::*method)(A0, A1, A2) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4082 return Callback<R(A0, A1, A2)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4083 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4084
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4085 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4086 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4087 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4088 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4089 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4090 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4091 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4092 Callback<R(A0, A1, A2)> callback(volatile U *obj, R (T::*method)(A0, A1, A2) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4093 return Callback<R(A0, A1, A2)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4094 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4095
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4096 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4097 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4098 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4099 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4100 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4101 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4102 template<typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4103 Callback<R(A0, A1, A2)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4104 return Callback<R(A0, A1, A2)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4105 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4106
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4107 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4108 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4109 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4110 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4111 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4112 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4113 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4114 Callback<R(A0, A1, A2)> callback(R (*func)(T*, A0, A1, A2), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4115 return Callback<R(A0, A1, A2)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4116 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4117
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4118 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4119 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4120 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4121 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4122 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4123 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4124 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4125 Callback<R(A0, A1, A2)> callback(R (*func)(const T*, A0, A1, A2), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4126 return Callback<R(A0, A1, A2)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4127 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4128
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4129 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4130 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4131 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4132 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4133 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4134 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4135 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4136 Callback<R(A0, A1, A2)> callback(R (*func)(volatile T*, A0, A1, A2), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4137 return Callback<R(A0, A1, A2)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4138 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4139
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4140 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4141 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4142 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4143 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4144 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4145 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4146 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4147 Callback<R(A0, A1, A2)> callback(R (*func)(const volatile T*, A0, A1, A2), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4148 return Callback<R(A0, A1, A2)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4149 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4150
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4151 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4152 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4153 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4154 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4155 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4156 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4157 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4158 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4159 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4160 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4161 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4162 Callback<R(A0, A1, A2)> callback(U *obj, R (*func)(T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4163 return Callback<R(A0, A1, A2)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4164 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4165
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4166 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4167 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4168 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4169 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4170 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4171 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4172 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4173 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4174 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4175 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4176 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4177 Callback<R(A0, A1, A2)> callback(const U *obj, R (*func)(const T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4178 return Callback<R(A0, A1, A2)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4179 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4180
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4181 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4182 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4183 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4184 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4185 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4186 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4187 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4188 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4189 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4190 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4191 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4192 Callback<R(A0, A1, A2)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4193 return Callback<R(A0, A1, A2)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4194 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4195
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4196 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4197 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4198 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4199 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4200 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4201 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4202 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4203 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4204 template <typename T, typename U, typename R, typename A0, typename A1, typename A2>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4205 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4206 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4207 Callback<R(A0, A1, A2)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4208 return Callback<R(A0, A1, A2)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4209 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4210
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4211
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4212 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4213 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4214 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4215 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4216 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4217 template <typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4218 Callback<R(A0, A1, A2, A3)> callback(R (*func)(A0, A1, A2, A3) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4219 return Callback<R(A0, A1, A2, A3)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4220 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4221
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4222 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4223 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4224 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4225 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4226 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4227 template <typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4228 Callback<R(A0, A1, A2, A3)> callback(const Callback<R(A0, A1, A2, A3)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4229 return Callback<R(A0, A1, A2, A3)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4230 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4231
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4232 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4233 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4234 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4235 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4236 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4237 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4238 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4239 Callback<R(A0, A1, A2, A3)> callback(U *obj, R (T::*method)(A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4240 return Callback<R(A0, A1, A2, A3)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4241 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4242
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4243 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4244 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4245 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4246 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4247 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4248 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4249 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4250 Callback<R(A0, A1, A2, A3)> callback(const U *obj, R (T::*method)(A0, A1, A2, A3) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4251 return Callback<R(A0, A1, A2, A3)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4252 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4253
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4254 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4255 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4256 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4257 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4258 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4259 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4260 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4261 Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4262 return Callback<R(A0, A1, A2, A3)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4263 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4264
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4265 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4266 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4267 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4268 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4269 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4270 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4271 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4272 Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4273 return Callback<R(A0, A1, A2, A3)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4274 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4275
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4276 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4277 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4278 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4279 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4280 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4281 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4282 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4283 Callback<R(A0, A1, A2, A3)> callback(R (*func)(T*, A0, A1, A2, A3), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4284 return Callback<R(A0, A1, A2, A3)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4285 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4286
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4287 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4288 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4289 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4290 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4291 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4292 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4293 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4294 Callback<R(A0, A1, A2, A3)> callback(R (*func)(const T*, A0, A1, A2, A3), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4295 return Callback<R(A0, A1, A2, A3)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4296 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4297
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4298 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4299 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4300 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4301 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4302 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4303 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4304 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4305 Callback<R(A0, A1, A2, A3)> callback(R (*func)(volatile T*, A0, A1, A2, A3), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4306 return Callback<R(A0, A1, A2, A3)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4307 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4308
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4309 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4310 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4311 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4312 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4313 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4314 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4315 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4316 Callback<R(A0, A1, A2, A3)> callback(R (*func)(const volatile T*, A0, A1, A2, A3), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4317 return Callback<R(A0, A1, A2, A3)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4318 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4319
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4320 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4321 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4322 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4323 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4324 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4325 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4326 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4327 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4328 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4329 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4330 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4331 Callback<R(A0, A1, A2, A3)> callback(U *obj, R (*func)(T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4332 return Callback<R(A0, A1, A2, A3)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4333 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4334
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4335 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4336 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4337 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4338 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4339 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4340 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4341 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4342 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4343 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4344 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4345 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4346 Callback<R(A0, A1, A2, A3)> callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4347 return Callback<R(A0, A1, A2, A3)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4348 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4349
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4350 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4351 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4352 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4353 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4354 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4355 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4356 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4357 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4358 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4359 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4360 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4361 Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4362 return Callback<R(A0, A1, A2, A3)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4363 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4364
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4365 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4366 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4367 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4368 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4369 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4370 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4371 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4372 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4373 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4374 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4375 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4376 Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4377 return Callback<R(A0, A1, A2, A3)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4378 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4379
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4380
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4381 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4382 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4383 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4384 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4385 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4386 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4387 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(A0, A1, A2, A3, A4) = 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4388 return Callback<R(A0, A1, A2, A3, A4)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4389 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4390
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4391 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4392 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4393 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4394 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4395 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4396 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4397 Callback<R(A0, A1, A2, A3, A4)> callback(const Callback<R(A0, A1, A2, A3, A4)> &func) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4398 return Callback<R(A0, A1, A2, A3, A4)>(func);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4399 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4400
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4401 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4402 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4403 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4404 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4405 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4406 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4407 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4408 Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4409 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4410 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4411
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4412 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4413 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4414 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4415 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4416 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4417 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4418 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4419 Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4420 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4421 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4422
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4423 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4424 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4425 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4426 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4427 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4428 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4429 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4430 Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4431 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4432 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4433
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4434 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4435 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4436 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4437 * @param method Member function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4438 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4439 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4440 template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4441 Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4442 return Callback<R(A0, A1, A2, A3, A4)>(obj, method);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4443 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4444
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4445 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4446 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4447 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4448 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4449 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4450 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4451 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4452 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(T*, A0, A1, A2, A3, A4), U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4453 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4454 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4455
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4456 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4457 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4458 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4459 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4460 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4461 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4462 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4463 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(const T*, A0, A1, A2, A3, A4), const U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4464 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4465 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4466
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4467 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4468 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4469 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4470 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4471 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4472 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4473 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4474 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(volatile T*, A0, A1, A2, A3, A4), volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4475 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4476 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4477
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4478 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4479 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4480 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4481 * @param arg Pointer argument to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4482 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4483 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4484 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4485 Callback<R(A0, A1, A2, A3, A4)> callback(R (*func)(const volatile T*, A0, A1, A2, A3, A4), const volatile U *arg) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4486 return Callback<R(A0, A1, A2, A3, A4)>(func, arg);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4487 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4488
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4489 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4490 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4491 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4492 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4493 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4494 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4495 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4496 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4497 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4498 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4499 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4500 Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R (*func)(T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4501 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4502 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4503
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4504 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4505 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4506 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4507 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4508 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4509 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4510 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4511 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4512 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4513 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4514 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4515 Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R (*func)(const T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4516 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4517 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4518
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4519 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4520 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4521 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4522 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4523 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4524 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4525 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4526 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4527 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4528 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4529 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4530 Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R (*func)(volatile T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4531 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4532 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4533
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4534 /** Create a callback class with type infered from the arguments
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4535 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4536 * @param obj Optional pointer to object to bind to function
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4537 * @param func Static function to attach
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4538 * @return Callback with infered type
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4539 * @deprecated
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4540 * Arguments to callback have been reordered to callback(func, arg)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4541 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4542 template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4543 MBED_DEPRECATED_SINCE("mbed-os-5.1",
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4544 "Arguments to callback have been reordered to callback(func, arg)")
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4545 Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R (*func)(const volatile T*, A0, A1, A2, A3, A4)) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4546 return Callback<R(A0, A1, A2, A3, A4)>(func, obj);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4547 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4548
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4549
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4550 } // namespace mbed
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4551
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4552 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4553