This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

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