Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

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