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