test test test

Dependencies:   mbed

Committer:
mohamedmoawya
Date:
Mon May 25 19:06:11 2020 +0000
Revision:
0:e4c5e6ec922e
snake game tteest

Who changed what in which revision?

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