MacroRat / MouseCode

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat May 27 03:37:24 2017 +0000
Revision:
37:3dcc95e9321c
Parent:
18:6a4db94011d3
Need to get centered more before turns (so after moving forward). Also fix when both walls are missing!

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 /** @}*/