Christopher Haster / mbed-hal

Dependencies:   target-freescale

Fork of mbed-hal by Morpheus

Committer:
Christopher Haster
Date:
Wed Apr 06 09:41:33 2016 -0500
Revision:
20:fbc6173aa5b2
Added Binder class for statically allocated function binding

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 20:fbc6173aa5b2 1 /* mbed Microcontroller Library
Christopher Haster 20:fbc6173aa5b2 2 * Copyright (c) 2006-2015 ARM Limited
Christopher Haster 20:fbc6173aa5b2 3 *
Christopher Haster 20:fbc6173aa5b2 4 * Licensed under the Apache License, Version 2.0 (the "License");
Christopher Haster 20:fbc6173aa5b2 5 * you may not use this file except in compliance with the License.
Christopher Haster 20:fbc6173aa5b2 6 * You may obtain a copy of the License at
Christopher Haster 20:fbc6173aa5b2 7 *
Christopher Haster 20:fbc6173aa5b2 8 * http://www.apache.org/licenses/LICENSE-2.0
Christopher Haster 20:fbc6173aa5b2 9 *
Christopher Haster 20:fbc6173aa5b2 10 * Unless required by applicable law or agreed to in writing, software
Christopher Haster 20:fbc6173aa5b2 11 * distributed under the License is distributed on an "AS IS" BASIS,
Christopher Haster 20:fbc6173aa5b2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Christopher Haster 20:fbc6173aa5b2 13 * See the License for the specific language governing permissions and
Christopher Haster 20:fbc6173aa5b2 14 * limitations under the License.
Christopher Haster 20:fbc6173aa5b2 15 */
Christopher Haster 20:fbc6173aa5b2 16 #ifndef MBED_BINDER_H
Christopher Haster 20:fbc6173aa5b2 17 #define MBED_BINDER_H
Christopher Haster 20:fbc6173aa5b2 18
Christopher Haster 20:fbc6173aa5b2 19 #include "FunctionPointer.h"
Christopher Haster 20:fbc6173aa5b2 20
Christopher Haster 20:fbc6173aa5b2 21 #include <string.h>
Christopher Haster 20:fbc6173aa5b2 22 #include <stdint.h>
Christopher Haster 20:fbc6173aa5b2 23
Christopher Haster 20:fbc6173aa5b2 24 namespace mbed {
Christopher Haster 20:fbc6173aa5b2 25
Christopher Haster 20:fbc6173aa5b2 26 // Binding with memory management by user
Christopher Haster 20:fbc6173aa5b2 27 template <typename F, typename B1=void, typename B2=void, typename B3=void, typename B4=void>
Christopher Haster 20:fbc6173aa5b2 28 class Binder;
Christopher Haster 20:fbc6173aa5b2 29
Christopher Haster 20:fbc6173aa5b2 30 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 31 */
Christopher Haster 20:fbc6173aa5b2 32 template <typename R, typename B1, typename B2, typename B3, typename B4>
Christopher Haster 20:fbc6173aa5b2 33 class Binder<R(), B1, B2, B3, B4> {
Christopher Haster 20:fbc6173aa5b2 34 public:
Christopher Haster 20:fbc6173aa5b2 35 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 36 */
Christopher Haster 20:fbc6173aa5b2 37 Binder() {}
Christopher Haster 20:fbc6173aa5b2 38
Christopher Haster 20:fbc6173aa5b2 39 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 40 */
Christopher Haster 20:fbc6173aa5b2 41 Binder(FuncPtr<R(B1, B2, B3, B4)> func, B1 b1, B2 b2, B3 b3, B4 b4) {
Christopher Haster 20:fbc6173aa5b2 42 attach(func, b1, b2, b3, b4);
Christopher Haster 20:fbc6173aa5b2 43 }
Christopher Haster 20:fbc6173aa5b2 44
Christopher Haster 20:fbc6173aa5b2 45 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 46 */
Christopher Haster 20:fbc6173aa5b2 47 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 48 Binder(T *object, M method, B1 b1, B2 b2, B3 b3, B4 b4) {
Christopher Haster 20:fbc6173aa5b2 49 attach(object, method, b1, b2, b3, b4);
Christopher Haster 20:fbc6173aa5b2 50 }
Christopher Haster 20:fbc6173aa5b2 51
Christopher Haster 20:fbc6173aa5b2 52 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 53 */
Christopher Haster 20:fbc6173aa5b2 54 void attach(FuncPtr<R(B1, B2, B3, B4)> func, B1 b1, B2 b2, B3 b3, B4 b4) {
Christopher Haster 20:fbc6173aa5b2 55 _func = func;
Christopher Haster 20:fbc6173aa5b2 56 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 57 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 58 _b3 = b3;
Christopher Haster 20:fbc6173aa5b2 59 _b4 = b4;
Christopher Haster 20:fbc6173aa5b2 60 }
Christopher Haster 20:fbc6173aa5b2 61
Christopher Haster 20:fbc6173aa5b2 62 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 63 */
Christopher Haster 20:fbc6173aa5b2 64 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 65 void attach(T *object, M method, B1 b1, B2 b2, B3 b3, B4 b4) {
Christopher Haster 20:fbc6173aa5b2 66 _func = FuncPtr<R(B1, B2, B3, B4)>(object, method);
Christopher Haster 20:fbc6173aa5b2 67 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 68 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 69 _b3 = b3;
Christopher Haster 20:fbc6173aa5b2 70 _b4 = b4;
Christopher Haster 20:fbc6173aa5b2 71 }
Christopher Haster 20:fbc6173aa5b2 72
Christopher Haster 20:fbc6173aa5b2 73 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 74 */
Christopher Haster 20:fbc6173aa5b2 75 R call() {
Christopher Haster 20:fbc6173aa5b2 76 return _func(_b1, _b2, _b3, _b4);
Christopher Haster 20:fbc6173aa5b2 77 }
Christopher Haster 20:fbc6173aa5b2 78
Christopher Haster 20:fbc6173aa5b2 79 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 80 R operator()() {
Christopher Haster 20:fbc6173aa5b2 81 return _func(_b1, _b2, _b3, _b4);
Christopher Haster 20:fbc6173aa5b2 82 }
Christopher Haster 20:fbc6173aa5b2 83 #endif
Christopher Haster 20:fbc6173aa5b2 84 private:
Christopher Haster 20:fbc6173aa5b2 85 FuncPtr<R(B1, B2, B3, B4)> _func;
Christopher Haster 20:fbc6173aa5b2 86 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 87 B2 _b2;
Christopher Haster 20:fbc6173aa5b2 88 B3 _b3;
Christopher Haster 20:fbc6173aa5b2 89 B4 _b4;
Christopher Haster 20:fbc6173aa5b2 90 };
Christopher Haster 20:fbc6173aa5b2 91
Christopher Haster 20:fbc6173aa5b2 92
Christopher Haster 20:fbc6173aa5b2 93 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 94 */
Christopher Haster 20:fbc6173aa5b2 95 template <typename R, typename A1, typename B1, typename B2, typename B3>
Christopher Haster 20:fbc6173aa5b2 96 class Binder<R(A1), B1, B2, B3> {
Christopher Haster 20:fbc6173aa5b2 97 public:
Christopher Haster 20:fbc6173aa5b2 98 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 99 */
Christopher Haster 20:fbc6173aa5b2 100 Binder() {}
Christopher Haster 20:fbc6173aa5b2 101
Christopher Haster 20:fbc6173aa5b2 102 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 103 */
Christopher Haster 20:fbc6173aa5b2 104 Binder(FuncPtr<R(B1, B2, B3, A1)> func, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 105 attach(func, b1, b2, b3);
Christopher Haster 20:fbc6173aa5b2 106 }
Christopher Haster 20:fbc6173aa5b2 107
Christopher Haster 20:fbc6173aa5b2 108 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 109 */
Christopher Haster 20:fbc6173aa5b2 110 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 111 Binder(T *object, M method, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 112 attach(object, method, b1, b2, b3);
Christopher Haster 20:fbc6173aa5b2 113 }
Christopher Haster 20:fbc6173aa5b2 114
Christopher Haster 20:fbc6173aa5b2 115 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 116 */
Christopher Haster 20:fbc6173aa5b2 117 void attach(FuncPtr<R(B1, B2, B3, A1)> func, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 118 _func = func;
Christopher Haster 20:fbc6173aa5b2 119 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 120 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 121 _b3 = b3;
Christopher Haster 20:fbc6173aa5b2 122 }
Christopher Haster 20:fbc6173aa5b2 123
Christopher Haster 20:fbc6173aa5b2 124 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 125 */
Christopher Haster 20:fbc6173aa5b2 126 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 127 void attach(T *object, M method, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 128 _func = FuncPtr<R(B1, B2, B3, A1)>(object, method);
Christopher Haster 20:fbc6173aa5b2 129 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 130 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 131 _b3 = b3;
Christopher Haster 20:fbc6173aa5b2 132 }
Christopher Haster 20:fbc6173aa5b2 133
Christopher Haster 20:fbc6173aa5b2 134 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 135 */
Christopher Haster 20:fbc6173aa5b2 136 R call(A1 a1) {
Christopher Haster 20:fbc6173aa5b2 137 return _func(_b1, _b2, _b3, a1);
Christopher Haster 20:fbc6173aa5b2 138 }
Christopher Haster 20:fbc6173aa5b2 139
Christopher Haster 20:fbc6173aa5b2 140 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 141 R operator()(A1 a1) {
Christopher Haster 20:fbc6173aa5b2 142 return _func(_b1, _b2, _b3, a1);
Christopher Haster 20:fbc6173aa5b2 143 }
Christopher Haster 20:fbc6173aa5b2 144 #endif
Christopher Haster 20:fbc6173aa5b2 145 private:
Christopher Haster 20:fbc6173aa5b2 146 FuncPtr<R(B1, B2, B3, A1)> _func;
Christopher Haster 20:fbc6173aa5b2 147 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 148 B2 _b2;
Christopher Haster 20:fbc6173aa5b2 149 B3 _b3;
Christopher Haster 20:fbc6173aa5b2 150 };
Christopher Haster 20:fbc6173aa5b2 151
Christopher Haster 20:fbc6173aa5b2 152 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 153 */
Christopher Haster 20:fbc6173aa5b2 154 template <typename R, typename B1, typename B2, typename B3>
Christopher Haster 20:fbc6173aa5b2 155 class Binder<R(), B1, B2, B3> {
Christopher Haster 20:fbc6173aa5b2 156 public:
Christopher Haster 20:fbc6173aa5b2 157 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 158 */
Christopher Haster 20:fbc6173aa5b2 159 Binder() {}
Christopher Haster 20:fbc6173aa5b2 160
Christopher Haster 20:fbc6173aa5b2 161 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 162 */
Christopher Haster 20:fbc6173aa5b2 163 Binder(FuncPtr<R(B1, B2, B3)> func, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 164 attach(func, b1, b2, b3);
Christopher Haster 20:fbc6173aa5b2 165 }
Christopher Haster 20:fbc6173aa5b2 166
Christopher Haster 20:fbc6173aa5b2 167 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 168 */
Christopher Haster 20:fbc6173aa5b2 169 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 170 Binder(T *object, M method, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 171 attach(object, method, b1, b2, b3);
Christopher Haster 20:fbc6173aa5b2 172 }
Christopher Haster 20:fbc6173aa5b2 173
Christopher Haster 20:fbc6173aa5b2 174 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 175 */
Christopher Haster 20:fbc6173aa5b2 176 void attach(FuncPtr<R(B1, B2, B3)> func, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 177 _func = func;
Christopher Haster 20:fbc6173aa5b2 178 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 179 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 180 _b3 = b3;
Christopher Haster 20:fbc6173aa5b2 181 }
Christopher Haster 20:fbc6173aa5b2 182
Christopher Haster 20:fbc6173aa5b2 183 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 184 */
Christopher Haster 20:fbc6173aa5b2 185 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 186 void attach(T *object, M method, B1 b1, B2 b2, B3 b3) {
Christopher Haster 20:fbc6173aa5b2 187 _func = FuncPtr<R(B1, B2, B3)>(object, method);
Christopher Haster 20:fbc6173aa5b2 188 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 189 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 190 _b3 = b3;
Christopher Haster 20:fbc6173aa5b2 191 }
Christopher Haster 20:fbc6173aa5b2 192
Christopher Haster 20:fbc6173aa5b2 193 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 194 */
Christopher Haster 20:fbc6173aa5b2 195 R call() {
Christopher Haster 20:fbc6173aa5b2 196 return _func(_b1, _b2, _b3);
Christopher Haster 20:fbc6173aa5b2 197 }
Christopher Haster 20:fbc6173aa5b2 198
Christopher Haster 20:fbc6173aa5b2 199 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 200 R operator()() {
Christopher Haster 20:fbc6173aa5b2 201 return _func(_b1, _b2, _b3);
Christopher Haster 20:fbc6173aa5b2 202 }
Christopher Haster 20:fbc6173aa5b2 203 #endif
Christopher Haster 20:fbc6173aa5b2 204 private:
Christopher Haster 20:fbc6173aa5b2 205 FuncPtr<R(B1, B2, B3)> _func;
Christopher Haster 20:fbc6173aa5b2 206 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 207 B2 _b2;
Christopher Haster 20:fbc6173aa5b2 208 B3 _b3;
Christopher Haster 20:fbc6173aa5b2 209 };
Christopher Haster 20:fbc6173aa5b2 210
Christopher Haster 20:fbc6173aa5b2 211 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 212 */
Christopher Haster 20:fbc6173aa5b2 213 template <typename R, typename A1, typename A2, typename B1, typename B2>
Christopher Haster 20:fbc6173aa5b2 214 class Binder<R(A1, A2), B1, B2> {
Christopher Haster 20:fbc6173aa5b2 215 public:
Christopher Haster 20:fbc6173aa5b2 216 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 217 */
Christopher Haster 20:fbc6173aa5b2 218 Binder() {}
Christopher Haster 20:fbc6173aa5b2 219
Christopher Haster 20:fbc6173aa5b2 220 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 221 */
Christopher Haster 20:fbc6173aa5b2 222 Binder(FuncPtr<R(B1, B2, A1, A2)> func, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 223 attach(func, b1, b2);
Christopher Haster 20:fbc6173aa5b2 224 }
Christopher Haster 20:fbc6173aa5b2 225
Christopher Haster 20:fbc6173aa5b2 226 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 227 */
Christopher Haster 20:fbc6173aa5b2 228 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 229 Binder(T *object, M method, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 230 attach(object, method, b1, b2);
Christopher Haster 20:fbc6173aa5b2 231 }
Christopher Haster 20:fbc6173aa5b2 232
Christopher Haster 20:fbc6173aa5b2 233 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 234 */
Christopher Haster 20:fbc6173aa5b2 235 void attach(FuncPtr<R(B1, B2, A1, A2)> func, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 236 _func = func;
Christopher Haster 20:fbc6173aa5b2 237 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 238 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 239 }
Christopher Haster 20:fbc6173aa5b2 240
Christopher Haster 20:fbc6173aa5b2 241 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 242 */
Christopher Haster 20:fbc6173aa5b2 243 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 244 void attach(T *object, M method, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 245 _func = FuncPtr<R(B1, B2, A1, A2)>(object, method);
Christopher Haster 20:fbc6173aa5b2 246 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 247 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 248 }
Christopher Haster 20:fbc6173aa5b2 249
Christopher Haster 20:fbc6173aa5b2 250 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 251 */
Christopher Haster 20:fbc6173aa5b2 252 R call(A1 a1, A2 a2) {
Christopher Haster 20:fbc6173aa5b2 253 return _func(_b1, _b2, a1, a2);
Christopher Haster 20:fbc6173aa5b2 254 }
Christopher Haster 20:fbc6173aa5b2 255
Christopher Haster 20:fbc6173aa5b2 256 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 257 R operator()(A1 a1, A2 a2) {
Christopher Haster 20:fbc6173aa5b2 258 return _func(_b1, _b2, a1, a2);
Christopher Haster 20:fbc6173aa5b2 259 }
Christopher Haster 20:fbc6173aa5b2 260 #endif
Christopher Haster 20:fbc6173aa5b2 261 private:
Christopher Haster 20:fbc6173aa5b2 262 FuncPtr<R(B1, B2, A1, A2)> _func;
Christopher Haster 20:fbc6173aa5b2 263 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 264 B2 _b2;
Christopher Haster 20:fbc6173aa5b2 265 };
Christopher Haster 20:fbc6173aa5b2 266
Christopher Haster 20:fbc6173aa5b2 267 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 268 */
Christopher Haster 20:fbc6173aa5b2 269 template <typename R, typename A1, typename B1, typename B2>
Christopher Haster 20:fbc6173aa5b2 270 class Binder<R(A1), B1, B2> {
Christopher Haster 20:fbc6173aa5b2 271 public:
Christopher Haster 20:fbc6173aa5b2 272 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 273 */
Christopher Haster 20:fbc6173aa5b2 274 Binder() {}
Christopher Haster 20:fbc6173aa5b2 275
Christopher Haster 20:fbc6173aa5b2 276 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 277 */
Christopher Haster 20:fbc6173aa5b2 278 Binder(FuncPtr<R(B1, B2, A1)> func, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 279 attach(func, b1, b2);
Christopher Haster 20:fbc6173aa5b2 280 }
Christopher Haster 20:fbc6173aa5b2 281
Christopher Haster 20:fbc6173aa5b2 282 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 283 */
Christopher Haster 20:fbc6173aa5b2 284 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 285 Binder(T *object, M method, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 286 attach(object, method, b1, b2);
Christopher Haster 20:fbc6173aa5b2 287 }
Christopher Haster 20:fbc6173aa5b2 288
Christopher Haster 20:fbc6173aa5b2 289 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 290 */
Christopher Haster 20:fbc6173aa5b2 291 void attach(FuncPtr<R(B1, B2, A1)> func, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 292 _func = func;
Christopher Haster 20:fbc6173aa5b2 293 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 294 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 295 }
Christopher Haster 20:fbc6173aa5b2 296
Christopher Haster 20:fbc6173aa5b2 297 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 298 */
Christopher Haster 20:fbc6173aa5b2 299 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 300 void attach(T *object, M method, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 301 _func = FuncPtr<R(B1, B2, A1)>(object, method);
Christopher Haster 20:fbc6173aa5b2 302 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 303 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 304 }
Christopher Haster 20:fbc6173aa5b2 305
Christopher Haster 20:fbc6173aa5b2 306 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 307 */
Christopher Haster 20:fbc6173aa5b2 308 R call(A1 a1) {
Christopher Haster 20:fbc6173aa5b2 309 return _func(_b1, _b2, a1);
Christopher Haster 20:fbc6173aa5b2 310 }
Christopher Haster 20:fbc6173aa5b2 311
Christopher Haster 20:fbc6173aa5b2 312 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 313 R operator()(A1 a1) {
Christopher Haster 20:fbc6173aa5b2 314 return _func(_b1, _b2, a1);
Christopher Haster 20:fbc6173aa5b2 315 }
Christopher Haster 20:fbc6173aa5b2 316 #endif
Christopher Haster 20:fbc6173aa5b2 317 private:
Christopher Haster 20:fbc6173aa5b2 318 FuncPtr<R(B1, B2, A1)> _func;
Christopher Haster 20:fbc6173aa5b2 319 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 320 B2 _b2;
Christopher Haster 20:fbc6173aa5b2 321 };
Christopher Haster 20:fbc6173aa5b2 322
Christopher Haster 20:fbc6173aa5b2 323 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 324 */
Christopher Haster 20:fbc6173aa5b2 325 template <typename R, typename B1, typename B2>
Christopher Haster 20:fbc6173aa5b2 326 class Binder<R(), B1, B2> {
Christopher Haster 20:fbc6173aa5b2 327 public:
Christopher Haster 20:fbc6173aa5b2 328 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 329 */
Christopher Haster 20:fbc6173aa5b2 330 Binder() {}
Christopher Haster 20:fbc6173aa5b2 331
Christopher Haster 20:fbc6173aa5b2 332 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 333 */
Christopher Haster 20:fbc6173aa5b2 334 Binder(FuncPtr<R(B1, B2)> func, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 335 attach(func, b1, b2);
Christopher Haster 20:fbc6173aa5b2 336 }
Christopher Haster 20:fbc6173aa5b2 337
Christopher Haster 20:fbc6173aa5b2 338 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 339 */
Christopher Haster 20:fbc6173aa5b2 340 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 341 Binder(T *object, M method, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 342 attach(object, method, b1, b2);
Christopher Haster 20:fbc6173aa5b2 343 }
Christopher Haster 20:fbc6173aa5b2 344
Christopher Haster 20:fbc6173aa5b2 345 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 346 */
Christopher Haster 20:fbc6173aa5b2 347 void attach(FuncPtr<R(B1, B2)> func, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 348 _func = func;
Christopher Haster 20:fbc6173aa5b2 349 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 350 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 351 }
Christopher Haster 20:fbc6173aa5b2 352
Christopher Haster 20:fbc6173aa5b2 353 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 354 */
Christopher Haster 20:fbc6173aa5b2 355 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 356 void attach(T *object, M method, B1 b1, B2 b2) {
Christopher Haster 20:fbc6173aa5b2 357 _func = FuncPtr<R(B1, B2)>(object, method);
Christopher Haster 20:fbc6173aa5b2 358 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 359 _b2 = b2;
Christopher Haster 20:fbc6173aa5b2 360 }
Christopher Haster 20:fbc6173aa5b2 361
Christopher Haster 20:fbc6173aa5b2 362 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 363 */
Christopher Haster 20:fbc6173aa5b2 364 R call() {
Christopher Haster 20:fbc6173aa5b2 365 return _func(_b1, _b2);
Christopher Haster 20:fbc6173aa5b2 366 }
Christopher Haster 20:fbc6173aa5b2 367
Christopher Haster 20:fbc6173aa5b2 368 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 369 R operator()() {
Christopher Haster 20:fbc6173aa5b2 370 return _func(_b1, _b2);
Christopher Haster 20:fbc6173aa5b2 371 }
Christopher Haster 20:fbc6173aa5b2 372 #endif
Christopher Haster 20:fbc6173aa5b2 373 private:
Christopher Haster 20:fbc6173aa5b2 374 FuncPtr<R(B1, B2)> _func;
Christopher Haster 20:fbc6173aa5b2 375 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 376 B2 _b2;
Christopher Haster 20:fbc6173aa5b2 377 };
Christopher Haster 20:fbc6173aa5b2 378
Christopher Haster 20:fbc6173aa5b2 379
Christopher Haster 20:fbc6173aa5b2 380 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 381 */
Christopher Haster 20:fbc6173aa5b2 382 template <typename R, typename A1, typename A2, typename A3, typename B1>
Christopher Haster 20:fbc6173aa5b2 383 class Binder<R(A1, A2, A3), B1> {
Christopher Haster 20:fbc6173aa5b2 384 public:
Christopher Haster 20:fbc6173aa5b2 385 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 386 */
Christopher Haster 20:fbc6173aa5b2 387 Binder() {}
Christopher Haster 20:fbc6173aa5b2 388
Christopher Haster 20:fbc6173aa5b2 389 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 390 */
Christopher Haster 20:fbc6173aa5b2 391 Binder(FuncPtr<R(B1, A1, A2, A3)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 392 attach(func, b1);
Christopher Haster 20:fbc6173aa5b2 393 }
Christopher Haster 20:fbc6173aa5b2 394
Christopher Haster 20:fbc6173aa5b2 395 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 396 */
Christopher Haster 20:fbc6173aa5b2 397 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 398 Binder(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 399 attach(object, method, b1);
Christopher Haster 20:fbc6173aa5b2 400 }
Christopher Haster 20:fbc6173aa5b2 401
Christopher Haster 20:fbc6173aa5b2 402 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 403 */
Christopher Haster 20:fbc6173aa5b2 404 void attach(FuncPtr<R(B1, A1, A2, A3)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 405 _func = func;
Christopher Haster 20:fbc6173aa5b2 406 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 407 }
Christopher Haster 20:fbc6173aa5b2 408
Christopher Haster 20:fbc6173aa5b2 409 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 410 */
Christopher Haster 20:fbc6173aa5b2 411 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 412 void attach(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 413 _func = FuncPtr<R(B1, A1, A2, A3)>(object, method);
Christopher Haster 20:fbc6173aa5b2 414 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 415 }
Christopher Haster 20:fbc6173aa5b2 416
Christopher Haster 20:fbc6173aa5b2 417 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 418 */
Christopher Haster 20:fbc6173aa5b2 419 R call(A1 a1, A2 a2, A3 a3) {
Christopher Haster 20:fbc6173aa5b2 420 return _func(_b1, a1, a2, a3);
Christopher Haster 20:fbc6173aa5b2 421 }
Christopher Haster 20:fbc6173aa5b2 422
Christopher Haster 20:fbc6173aa5b2 423 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 424 R operator()(A1 a1, A2 a2, A3 a3) {
Christopher Haster 20:fbc6173aa5b2 425 return _func(_b1, a1, a2, a3);
Christopher Haster 20:fbc6173aa5b2 426 }
Christopher Haster 20:fbc6173aa5b2 427 #endif
Christopher Haster 20:fbc6173aa5b2 428 private:
Christopher Haster 20:fbc6173aa5b2 429 FuncPtr<R(B1, A1, A2, A3)> _func;
Christopher Haster 20:fbc6173aa5b2 430 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 431 };
Christopher Haster 20:fbc6173aa5b2 432
Christopher Haster 20:fbc6173aa5b2 433 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 434 */
Christopher Haster 20:fbc6173aa5b2 435 template <typename R, typename A1, typename A2, typename B1>
Christopher Haster 20:fbc6173aa5b2 436 class Binder<R(A1, A2), B1> {
Christopher Haster 20:fbc6173aa5b2 437 public:
Christopher Haster 20:fbc6173aa5b2 438 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 439 */
Christopher Haster 20:fbc6173aa5b2 440 Binder() {}
Christopher Haster 20:fbc6173aa5b2 441
Christopher Haster 20:fbc6173aa5b2 442 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 443 */
Christopher Haster 20:fbc6173aa5b2 444 Binder(FuncPtr<R(B1, A1, A2)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 445 attach(func, b1);
Christopher Haster 20:fbc6173aa5b2 446 }
Christopher Haster 20:fbc6173aa5b2 447
Christopher Haster 20:fbc6173aa5b2 448 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 449 */
Christopher Haster 20:fbc6173aa5b2 450 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 451 Binder(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 452 attach(object, method, b1);
Christopher Haster 20:fbc6173aa5b2 453 }
Christopher Haster 20:fbc6173aa5b2 454
Christopher Haster 20:fbc6173aa5b2 455 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 456 */
Christopher Haster 20:fbc6173aa5b2 457 void attach(FuncPtr<R(B1, A1, A2)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 458 _func = func;
Christopher Haster 20:fbc6173aa5b2 459 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 460 }
Christopher Haster 20:fbc6173aa5b2 461
Christopher Haster 20:fbc6173aa5b2 462 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 463 */
Christopher Haster 20:fbc6173aa5b2 464 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 465 void attach(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 466 _func = FuncPtr<R(B1, A1, A2)>(object, method);
Christopher Haster 20:fbc6173aa5b2 467 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 468 }
Christopher Haster 20:fbc6173aa5b2 469
Christopher Haster 20:fbc6173aa5b2 470 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 471 */
Christopher Haster 20:fbc6173aa5b2 472 R call(A1 a1, A2 a2) {
Christopher Haster 20:fbc6173aa5b2 473 return _func(_b1, a1, a2);
Christopher Haster 20:fbc6173aa5b2 474 }
Christopher Haster 20:fbc6173aa5b2 475
Christopher Haster 20:fbc6173aa5b2 476 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 477 R operator()(A1 a1, A2 a2) {
Christopher Haster 20:fbc6173aa5b2 478 return _func(_b1, a1, a2);
Christopher Haster 20:fbc6173aa5b2 479 }
Christopher Haster 20:fbc6173aa5b2 480 #endif
Christopher Haster 20:fbc6173aa5b2 481 private:
Christopher Haster 20:fbc6173aa5b2 482 FuncPtr<R(B1, A1, A2)> _func;
Christopher Haster 20:fbc6173aa5b2 483 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 484 };
Christopher Haster 20:fbc6173aa5b2 485
Christopher Haster 20:fbc6173aa5b2 486 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 487 */
Christopher Haster 20:fbc6173aa5b2 488 template <typename R, typename A1, typename B1>
Christopher Haster 20:fbc6173aa5b2 489 class Binder<R(A1), B1> {
Christopher Haster 20:fbc6173aa5b2 490 public:
Christopher Haster 20:fbc6173aa5b2 491 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 492 */
Christopher Haster 20:fbc6173aa5b2 493 Binder() {}
Christopher Haster 20:fbc6173aa5b2 494
Christopher Haster 20:fbc6173aa5b2 495 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 496 */
Christopher Haster 20:fbc6173aa5b2 497 Binder(FuncPtr<R(B1, A1)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 498 attach(func, b1);
Christopher Haster 20:fbc6173aa5b2 499 }
Christopher Haster 20:fbc6173aa5b2 500
Christopher Haster 20:fbc6173aa5b2 501 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 502 */
Christopher Haster 20:fbc6173aa5b2 503 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 504 Binder(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 505 attach(object, method, b1);
Christopher Haster 20:fbc6173aa5b2 506 }
Christopher Haster 20:fbc6173aa5b2 507
Christopher Haster 20:fbc6173aa5b2 508 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 509 */
Christopher Haster 20:fbc6173aa5b2 510 void attach(FuncPtr<R(B1, A1)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 511 _func = func;
Christopher Haster 20:fbc6173aa5b2 512 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 513 }
Christopher Haster 20:fbc6173aa5b2 514
Christopher Haster 20:fbc6173aa5b2 515 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 516 */
Christopher Haster 20:fbc6173aa5b2 517 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 518 void attach(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 519 _func = FuncPtr<R(B1, A1)>(object, method);
Christopher Haster 20:fbc6173aa5b2 520 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 521 }
Christopher Haster 20:fbc6173aa5b2 522
Christopher Haster 20:fbc6173aa5b2 523 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 524 */
Christopher Haster 20:fbc6173aa5b2 525 R call(A1 a1) {
Christopher Haster 20:fbc6173aa5b2 526 return _func(_b1, a1);
Christopher Haster 20:fbc6173aa5b2 527 }
Christopher Haster 20:fbc6173aa5b2 528
Christopher Haster 20:fbc6173aa5b2 529 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 530 R operator()(A1 a1) {
Christopher Haster 20:fbc6173aa5b2 531 return _func(_b1, a1);
Christopher Haster 20:fbc6173aa5b2 532 }
Christopher Haster 20:fbc6173aa5b2 533 #endif
Christopher Haster 20:fbc6173aa5b2 534 private:
Christopher Haster 20:fbc6173aa5b2 535 FuncPtr<R(B1, A1)> _func;
Christopher Haster 20:fbc6173aa5b2 536 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 537 };
Christopher Haster 20:fbc6173aa5b2 538
Christopher Haster 20:fbc6173aa5b2 539 /** Binding with memory ownership on the user
Christopher Haster 20:fbc6173aa5b2 540 */
Christopher Haster 20:fbc6173aa5b2 541 template <typename R, typename B1>
Christopher Haster 20:fbc6173aa5b2 542 class Binder<R(), B1> {
Christopher Haster 20:fbc6173aa5b2 543 public:
Christopher Haster 20:fbc6173aa5b2 544 /** Create an empty Binder
Christopher Haster 20:fbc6173aa5b2 545 */
Christopher Haster 20:fbc6173aa5b2 546 Binder() {}
Christopher Haster 20:fbc6173aa5b2 547
Christopher Haster 20:fbc6173aa5b2 548 /** Create a Binder, binding arguments to function
Christopher Haster 20:fbc6173aa5b2 549 */
Christopher Haster 20:fbc6173aa5b2 550 Binder(FuncPtr<R(B1)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 551 attach(func, b1);
Christopher Haster 20:fbc6173aa5b2 552 }
Christopher Haster 20:fbc6173aa5b2 553
Christopher Haster 20:fbc6173aa5b2 554 /** Create a Binder, binding arguments to a method
Christopher Haster 20:fbc6173aa5b2 555 */
Christopher Haster 20:fbc6173aa5b2 556 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 557 Binder(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 558 attach(object, method, b1);
Christopher Haster 20:fbc6173aa5b2 559 }
Christopher Haster 20:fbc6173aa5b2 560
Christopher Haster 20:fbc6173aa5b2 561 /** Bind arguments to a function
Christopher Haster 20:fbc6173aa5b2 562 */
Christopher Haster 20:fbc6173aa5b2 563 void attach(FuncPtr<R(B1)> func, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 564 _func = func;
Christopher Haster 20:fbc6173aa5b2 565 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 566 }
Christopher Haster 20:fbc6173aa5b2 567
Christopher Haster 20:fbc6173aa5b2 568 /** Bind arguments to a method
Christopher Haster 20:fbc6173aa5b2 569 */
Christopher Haster 20:fbc6173aa5b2 570 template <typename T, typename M>
Christopher Haster 20:fbc6173aa5b2 571 void attach(T *object, M method, B1 b1) {
Christopher Haster 20:fbc6173aa5b2 572 _func = FuncPtr<R(B1)>(object, method);
Christopher Haster 20:fbc6173aa5b2 573 _b1 = b1;
Christopher Haster 20:fbc6173aa5b2 574 }
Christopher Haster 20:fbc6173aa5b2 575
Christopher Haster 20:fbc6173aa5b2 576 /** Call the bound function
Christopher Haster 20:fbc6173aa5b2 577 */
Christopher Haster 20:fbc6173aa5b2 578 R call() {
Christopher Haster 20:fbc6173aa5b2 579 return _func(_b1);
Christopher Haster 20:fbc6173aa5b2 580 }
Christopher Haster 20:fbc6173aa5b2 581
Christopher Haster 20:fbc6173aa5b2 582 #ifdef MBED_OPERATORS
Christopher Haster 20:fbc6173aa5b2 583 R operator()() {
Christopher Haster 20:fbc6173aa5b2 584 return _func(_b1);
Christopher Haster 20:fbc6173aa5b2 585 }
Christopher Haster 20:fbc6173aa5b2 586 #endif
Christopher Haster 20:fbc6173aa5b2 587 private:
Christopher Haster 20:fbc6173aa5b2 588 FuncPtr<R(B1)> _func;
Christopher Haster 20:fbc6173aa5b2 589 B1 _b1;
Christopher Haster 20:fbc6173aa5b2 590 };
Christopher Haster 20:fbc6173aa5b2 591
Christopher Haster 20:fbc6173aa5b2 592 } // namespace mbed
Christopher Haster 20:fbc6173aa5b2 593
Christopher Haster 20:fbc6173aa5b2 594 #endif