Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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