OLD | NEW |
1 // This file was GENERATED by command: | |
2 // pump.py bind.h.pump | |
3 // DO NOT EDIT BY HAND!!! | |
4 | |
5 /* | 1 /* |
6 * Copyright 2012 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. |
7 * | 3 * |
8 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
9 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
10 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
11 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
12 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
13 */ | 9 */ |
14 | 10 |
15 // To generate bind.h from bind.h.pump, execute: | |
16 // /home/build/google3/third_party/gtest/scripts/pump.py bind.h.pump | |
17 | |
18 // Bind() is an overloaded function that converts method calls into function | 11 // Bind() is an overloaded function that converts method calls into function |
19 // objects (aka functors). The method object is captured as a scoped_refptr<> if | 12 // objects (aka functors). The method object is captured as a scoped_refptr<> if |
20 // possible, and as a raw pointer otherwise. Any arguments to the method are | 13 // possible, and as a raw pointer otherwise. Any arguments to the method are |
21 // captured by value. The return value of Bind is a stateful, nullary function | 14 // captured by value. The return value of Bind is a stateful, nullary function |
22 // object. Care should be taken about the lifetime of objects captured by | 15 // object. Care should be taken about the lifetime of objects captured by |
23 // Bind(); the returned functor knows nothing about the lifetime of a non | 16 // Bind(); the returned functor knows nothing about the lifetime of a non |
24 // ref-counted method object or any arguments passed by pointer, and calling the | 17 // ref-counted method object or any arguments passed by pointer, and calling the |
25 // functor with a destroyed object will surely do bad things. | 18 // functor with a destroyed object will surely do bad things. |
26 // | 19 // |
27 // Example usage: | 20 // Example usage: |
(...skipping 29 matching lines...) Expand all Loading... |
57 // auto functor = rtc::Bind(&Bar::Test, bar); | 50 // auto functor = rtc::Bind(&Bar::Test, bar); |
58 // bar = nullptr; | 51 // bar = nullptr; |
59 // // The functor stores an internal scoped_refptr<Bar>, so this is safe. | 52 // // The functor stores an internal scoped_refptr<Bar>, so this is safe. |
60 // functor(); | 53 // functor(); |
61 // } | 54 // } |
62 // | 55 // |
63 | 56 |
64 #ifndef WEBRTC_BASE_BIND_H_ | 57 #ifndef WEBRTC_BASE_BIND_H_ |
65 #define WEBRTC_BASE_BIND_H_ | 58 #define WEBRTC_BASE_BIND_H_ |
66 | 59 |
| 60 #include <tuple> |
| 61 #include <type_traits> |
| 62 |
67 #include "webrtc/base/scoped_ref_ptr.h" | 63 #include "webrtc/base/scoped_ref_ptr.h" |
68 #include "webrtc/base/template_util.h" | 64 #include "webrtc/base/template_util.h" |
69 | 65 |
70 #define NONAME | 66 #define NONAME |
71 | 67 |
72 namespace rtc { | 68 namespace rtc { |
73 namespace detail { | 69 namespace detail { |
74 // This is needed because the template parameters in Bind can't be resolved | 70 // This is needed because the template parameters in Bind can't be resolved |
75 // if they're used both as parameters of the function pointer type and as | 71 // if they're used both as parameters of the function pointer type and as |
76 // parameters to Bind itself: the function pointer parameters are exact | 72 // parameters to Bind itself: the function pointer parameters are exact |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 // otherwise. | 120 // otherwise. |
125 template <class T> | 121 template <class T> |
126 struct PointerType { | 122 struct PointerType { |
127 typedef typename TernaryTypeOperator<IsRefCounted<T>::value, | 123 typedef typename TernaryTypeOperator<IsRefCounted<T>::value, |
128 scoped_refptr<T>, | 124 scoped_refptr<T>, |
129 T*>::type type; | 125 T*>::type type; |
130 }; | 126 }; |
131 | 127 |
132 } // namespace detail | 128 } // namespace detail |
133 | 129 |
134 template <class ObjectT, class MethodT, class R> | 130 template <class ObjectT, class MethodT, class R, typename... Args> |
135 class MethodFunctor0 { | 131 class MethodFunctor { |
136 public: | 132 public: |
137 MethodFunctor0(MethodT method, ObjectT* object) | 133 MethodFunctor(MethodT method, ObjectT* object, Args... args) |
138 : method_(method), object_(object) {} | 134 : method_(method), object_(object), args_(args...) {} |
139 R operator()() const { | 135 R operator()() const { |
140 return (object_->*method_)(); } | 136 return CallMethod(typename sequence_generator<sizeof...(Args)>::type()); |
| 137 } |
| 138 |
141 private: | 139 private: |
| 140 // Use sequence_generator (see template_util.h) to expand a MethodFunctor |
| 141 // with 2 arguments to (std::get<0>(args_), std::get<1>(args_)), for |
| 142 // instance. |
| 143 template <int... S> |
| 144 R CallMethod(sequence<S...>) const { |
| 145 return (object_->*method_)(std::get<S>(args_)...); |
| 146 } |
| 147 |
142 MethodT method_; | 148 MethodT method_; |
143 typename detail::PointerType<ObjectT>::type object_; | 149 typename detail::PointerType<ObjectT>::type object_; |
| 150 typename std::tuple<typename std::remove_reference<Args>::type...> args_; |
144 }; | 151 }; |
145 | 152 |
146 template <class FunctorT, class R> | 153 template <class FunctorT, class R, typename... Args> |
147 class Functor0 { | 154 class Functor { |
148 public: | 155 public: |
149 explicit Functor0(const FunctorT& functor) | 156 Functor(const FunctorT& functor, Args... args) |
150 : functor_(functor) {} | 157 : functor_(functor), args_(args...) {} |
151 R operator()() const { | 158 R operator()() const { |
152 return functor_(); } | 159 return CallFunction(typename sequence_generator<sizeof...(Args)>::type()); |
| 160 } |
| 161 |
153 private: | 162 private: |
| 163 // Use sequence_generator (see template_util.h) to expand a Functor |
| 164 // with 2 arguments to (std::get<0>(args_), std::get<1>(args_)), for |
| 165 // instance. |
| 166 template <int... S> |
| 167 R CallFunction(sequence<S...>) const { |
| 168 return functor_(std::get<S>(args_)...); |
| 169 } |
| 170 |
154 FunctorT functor_; | 171 FunctorT functor_; |
| 172 typename std::tuple<typename std::remove_reference<Args>::type...> args_; |
155 }; | 173 }; |
156 | 174 |
| 175 #define FP_T(x) R (ObjectT::*x)(Args...) |
157 | 176 |
158 #define FP_T(x) R (ObjectT::*x)() | 177 template <class ObjectT, class R, typename... Args> |
159 | 178 MethodFunctor<ObjectT, FP_T(NONAME), R, Args...> Bind( |
160 template <class ObjectT, class R> | 179 FP_T(method), |
161 MethodFunctor0<ObjectT, FP_T(NONAME), R> | 180 ObjectT* object, |
162 Bind(FP_T(method), ObjectT* object) { | 181 typename detail::identity<Args>::type... args) { |
163 return MethodFunctor0<ObjectT, FP_T(NONAME), R>( | 182 return MethodFunctor<ObjectT, FP_T(NONAME), R, Args...>(method, object, |
164 method, object); | 183 args...); |
165 } | 184 } |
166 | 185 |
167 #undef FP_T | 186 #undef FP_T |
168 #define FP_T(x) R (ObjectT::*x)() const | 187 #define FP_T(x) R (ObjectT::*x)(Args...) const |
169 | 188 |
170 template <class ObjectT, class R> | 189 template <class ObjectT, class R, typename... Args> |
171 MethodFunctor0<const ObjectT, FP_T(NONAME), R> | 190 MethodFunctor<const ObjectT, FP_T(NONAME), R, Args...> Bind( |
172 Bind(FP_T(method), const ObjectT* object) { | 191 FP_T(method), |
173 return MethodFunctor0<const ObjectT, FP_T(NONAME), R>( | 192 const ObjectT* object, |
174 method, object); | 193 typename detail::identity<Args>::type... args) { |
| 194 return MethodFunctor<const ObjectT, FP_T(NONAME), R, Args...>(method, object, |
| 195 args...); |
175 } | 196 } |
176 | 197 |
177 #undef FP_T | 198 #undef FP_T |
178 #define FP_T(x) R (ObjectT::*x)() | 199 #define FP_T(x) R (ObjectT::*x)(Args...) |
179 | 200 |
180 template <class ObjectT, class R> | 201 template <class ObjectT, class R, typename... Args> |
181 MethodFunctor0<ObjectT, FP_T(NONAME), R> | 202 MethodFunctor<ObjectT, FP_T(NONAME), R, Args...> Bind( |
182 Bind(FP_T(method), const scoped_refptr<ObjectT>& object) { | 203 FP_T(method), |
183 return MethodFunctor0<ObjectT, FP_T(NONAME), R>( | 204 const scoped_refptr<ObjectT>& object, |
184 method, object.get()); | 205 typename detail::identity<Args>::type... args) { |
| 206 return MethodFunctor<ObjectT, FP_T(NONAME), R, Args...>(method, object.get(), |
| 207 args...); |
185 } | 208 } |
186 | 209 |
187 #undef FP_T | 210 #undef FP_T |
188 #define FP_T(x) R (*x)() | 211 #define FP_T(x) R (*x)(Args...) |
189 | 212 |
190 template <class R> | 213 template <class R, typename... Args> |
191 Functor0<FP_T(NONAME), R> | 214 Functor<FP_T(NONAME), R, Args...> Bind( |
192 Bind(FP_T(function)) { | 215 FP_T(function), |
193 return Functor0<FP_T(NONAME), R>( | 216 typename detail::identity<Args>::type... args) { |
194 function); | 217 return Functor<FP_T(NONAME), R, Args...>(function, args...); |
195 } | 218 } |
196 | 219 |
197 #undef FP_T | 220 #undef FP_T |
198 | |
199 template <class ObjectT, class MethodT, class R, | |
200 class P1> | |
201 class MethodFunctor1 { | |
202 public: | |
203 MethodFunctor1(MethodT method, ObjectT* object, | |
204 P1 p1) | |
205 : method_(method), object_(object), | |
206 p1_(p1) {} | |
207 R operator()() const { | |
208 return (object_->*method_)(p1_); } | |
209 private: | |
210 MethodT method_; | |
211 typename detail::PointerType<ObjectT>::type object_; | |
212 typename rtc::remove_reference<P1>::type p1_; | |
213 }; | |
214 | |
215 template <class FunctorT, class R, | |
216 class P1> | |
217 class Functor1 { | |
218 public: | |
219 Functor1(const FunctorT& functor, P1 p1) | |
220 : functor_(functor), | |
221 p1_(p1) {} | |
222 R operator()() const { | |
223 return functor_(p1_); } | |
224 private: | |
225 FunctorT functor_; | |
226 typename rtc::remove_reference<P1>::type p1_; | |
227 }; | |
228 | |
229 | |
230 #define FP_T(x) R (ObjectT::*x)(P1) | |
231 | |
232 template <class ObjectT, class R, | |
233 class P1> | |
234 MethodFunctor1<ObjectT, FP_T(NONAME), R, P1> | |
235 Bind(FP_T(method), ObjectT* object, | |
236 typename detail::identity<P1>::type p1) { | |
237 return MethodFunctor1<ObjectT, FP_T(NONAME), R, P1>( | |
238 method, object, p1); | |
239 } | |
240 | |
241 #undef FP_T | |
242 #define FP_T(x) R (ObjectT::*x)(P1) const | |
243 | |
244 template <class ObjectT, class R, | |
245 class P1> | |
246 MethodFunctor1<const ObjectT, FP_T(NONAME), R, P1> | |
247 Bind(FP_T(method), const ObjectT* object, | |
248 typename detail::identity<P1>::type p1) { | |
249 return MethodFunctor1<const ObjectT, FP_T(NONAME), R, P1>( | |
250 method, object, p1); | |
251 } | |
252 | |
253 #undef FP_T | |
254 #define FP_T(x) R (ObjectT::*x)(P1) | |
255 | |
256 template <class ObjectT, class R, | |
257 class P1> | |
258 MethodFunctor1<ObjectT, FP_T(NONAME), R, P1> | |
259 Bind(FP_T(method), const scoped_refptr<ObjectT>& object, | |
260 typename detail::identity<P1>::type p1) { | |
261 return MethodFunctor1<ObjectT, FP_T(NONAME), R, P1>( | |
262 method, object.get(), p1); | |
263 } | |
264 | |
265 #undef FP_T | |
266 #define FP_T(x) R (*x)(P1) | |
267 | |
268 template <class R, | |
269 class P1> | |
270 Functor1<FP_T(NONAME), R, P1> | |
271 Bind(FP_T(function), | |
272 typename detail::identity<P1>::type p1) { | |
273 return Functor1<FP_T(NONAME), R, P1>( | |
274 function, p1); | |
275 } | |
276 | |
277 #undef FP_T | |
278 | |
279 template <class ObjectT, class MethodT, class R, | |
280 class P1, | |
281 class P2> | |
282 class MethodFunctor2 { | |
283 public: | |
284 MethodFunctor2(MethodT method, ObjectT* object, | |
285 P1 p1, | |
286 P2 p2) | |
287 : method_(method), object_(object), | |
288 p1_(p1), | |
289 p2_(p2) {} | |
290 R operator()() const { | |
291 return (object_->*method_)(p1_, p2_); } | |
292 private: | |
293 MethodT method_; | |
294 typename detail::PointerType<ObjectT>::type object_; | |
295 typename rtc::remove_reference<P1>::type p1_; | |
296 typename rtc::remove_reference<P2>::type p2_; | |
297 }; | |
298 | |
299 template <class FunctorT, class R, | |
300 class P1, | |
301 class P2> | |
302 class Functor2 { | |
303 public: | |
304 Functor2(const FunctorT& functor, P1 p1, P2 p2) | |
305 : functor_(functor), | |
306 p1_(p1), | |
307 p2_(p2) {} | |
308 R operator()() const { | |
309 return functor_(p1_, p2_); } | |
310 private: | |
311 FunctorT functor_; | |
312 typename rtc::remove_reference<P1>::type p1_; | |
313 typename rtc::remove_reference<P2>::type p2_; | |
314 }; | |
315 | |
316 | |
317 #define FP_T(x) R (ObjectT::*x)(P1, P2) | |
318 | |
319 template <class ObjectT, class R, | |
320 class P1, | |
321 class P2> | |
322 MethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2> | |
323 Bind(FP_T(method), ObjectT* object, | |
324 typename detail::identity<P1>::type p1, | |
325 typename detail::identity<P2>::type p2) { | |
326 return MethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2>( | |
327 method, object, p1, p2); | |
328 } | |
329 | |
330 #undef FP_T | |
331 #define FP_T(x) R (ObjectT::*x)(P1, P2) const | |
332 | |
333 template <class ObjectT, class R, | |
334 class P1, | |
335 class P2> | |
336 MethodFunctor2<const ObjectT, FP_T(NONAME), R, P1, P2> | |
337 Bind(FP_T(method), const ObjectT* object, | |
338 typename detail::identity<P1>::type p1, | |
339 typename detail::identity<P2>::type p2) { | |
340 return MethodFunctor2<const ObjectT, FP_T(NONAME), R, P1, P2>( | |
341 method, object, p1, p2); | |
342 } | |
343 | |
344 #undef FP_T | |
345 #define FP_T(x) R (ObjectT::*x)(P1, P2) | |
346 | |
347 template <class ObjectT, class R, | |
348 class P1, | |
349 class P2> | |
350 MethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2> | |
351 Bind(FP_T(method), const scoped_refptr<ObjectT>& object, | |
352 typename detail::identity<P1>::type p1, | |
353 typename detail::identity<P2>::type p2) { | |
354 return MethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2>( | |
355 method, object.get(), p1, p2); | |
356 } | |
357 | |
358 #undef FP_T | |
359 #define FP_T(x) R (*x)(P1, P2) | |
360 | |
361 template <class R, | |
362 class P1, | |
363 class P2> | |
364 Functor2<FP_T(NONAME), R, P1, P2> | |
365 Bind(FP_T(function), | |
366 typename detail::identity<P1>::type p1, | |
367 typename detail::identity<P2>::type p2) { | |
368 return Functor2<FP_T(NONAME), R, P1, P2>( | |
369 function, p1, p2); | |
370 } | |
371 | |
372 #undef FP_T | |
373 | |
374 template <class ObjectT, class MethodT, class R, | |
375 class P1, | |
376 class P2, | |
377 class P3> | |
378 class MethodFunctor3 { | |
379 public: | |
380 MethodFunctor3(MethodT method, ObjectT* object, | |
381 P1 p1, | |
382 P2 p2, | |
383 P3 p3) | |
384 : method_(method), object_(object), | |
385 p1_(p1), | |
386 p2_(p2), | |
387 p3_(p3) {} | |
388 R operator()() const { | |
389 return (object_->*method_)(p1_, p2_, p3_); } | |
390 private: | |
391 MethodT method_; | |
392 typename detail::PointerType<ObjectT>::type object_; | |
393 typename rtc::remove_reference<P1>::type p1_; | |
394 typename rtc::remove_reference<P2>::type p2_; | |
395 typename rtc::remove_reference<P3>::type p3_; | |
396 }; | |
397 | |
398 template <class FunctorT, class R, | |
399 class P1, | |
400 class P2, | |
401 class P3> | |
402 class Functor3 { | |
403 public: | |
404 Functor3(const FunctorT& functor, P1 p1, P2 p2, P3 p3) | |
405 : functor_(functor), | |
406 p1_(p1), | |
407 p2_(p2), | |
408 p3_(p3) {} | |
409 R operator()() const { | |
410 return functor_(p1_, p2_, p3_); } | |
411 private: | |
412 FunctorT functor_; | |
413 typename rtc::remove_reference<P1>::type p1_; | |
414 typename rtc::remove_reference<P2>::type p2_; | |
415 typename rtc::remove_reference<P3>::type p3_; | |
416 }; | |
417 | |
418 | |
419 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3) | |
420 | |
421 template <class ObjectT, class R, | |
422 class P1, | |
423 class P2, | |
424 class P3> | |
425 MethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3> | |
426 Bind(FP_T(method), ObjectT* object, | |
427 typename detail::identity<P1>::type p1, | |
428 typename detail::identity<P2>::type p2, | |
429 typename detail::identity<P3>::type p3) { | |
430 return MethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3>( | |
431 method, object, p1, p2, p3); | |
432 } | |
433 | |
434 #undef FP_T | |
435 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3) const | |
436 | |
437 template <class ObjectT, class R, | |
438 class P1, | |
439 class P2, | |
440 class P3> | |
441 MethodFunctor3<const ObjectT, FP_T(NONAME), R, P1, P2, P3> | |
442 Bind(FP_T(method), const ObjectT* object, | |
443 typename detail::identity<P1>::type p1, | |
444 typename detail::identity<P2>::type p2, | |
445 typename detail::identity<P3>::type p3) { | |
446 return MethodFunctor3<const ObjectT, FP_T(NONAME), R, P1, P2, P3>( | |
447 method, object, p1, p2, p3); | |
448 } | |
449 | |
450 #undef FP_T | |
451 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3) | |
452 | |
453 template <class ObjectT, class R, | |
454 class P1, | |
455 class P2, | |
456 class P3> | |
457 MethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3> | |
458 Bind(FP_T(method), const scoped_refptr<ObjectT>& object, | |
459 typename detail::identity<P1>::type p1, | |
460 typename detail::identity<P2>::type p2, | |
461 typename detail::identity<P3>::type p3) { | |
462 return MethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3>( | |
463 method, object.get(), p1, p2, p3); | |
464 } | |
465 | |
466 #undef FP_T | |
467 #define FP_T(x) R (*x)(P1, P2, P3) | |
468 | |
469 template <class R, | |
470 class P1, | |
471 class P2, | |
472 class P3> | |
473 Functor3<FP_T(NONAME), R, P1, P2, P3> | |
474 Bind(FP_T(function), | |
475 typename detail::identity<P1>::type p1, | |
476 typename detail::identity<P2>::type p2, | |
477 typename detail::identity<P3>::type p3) { | |
478 return Functor3<FP_T(NONAME), R, P1, P2, P3>( | |
479 function, p1, p2, p3); | |
480 } | |
481 | |
482 #undef FP_T | |
483 | |
484 template <class ObjectT, class MethodT, class R, | |
485 class P1, | |
486 class P2, | |
487 class P3, | |
488 class P4> | |
489 class MethodFunctor4 { | |
490 public: | |
491 MethodFunctor4(MethodT method, ObjectT* object, | |
492 P1 p1, | |
493 P2 p2, | |
494 P3 p3, | |
495 P4 p4) | |
496 : method_(method), object_(object), | |
497 p1_(p1), | |
498 p2_(p2), | |
499 p3_(p3), | |
500 p4_(p4) {} | |
501 R operator()() const { | |
502 return (object_->*method_)(p1_, p2_, p3_, p4_); } | |
503 private: | |
504 MethodT method_; | |
505 typename detail::PointerType<ObjectT>::type object_; | |
506 typename rtc::remove_reference<P1>::type p1_; | |
507 typename rtc::remove_reference<P2>::type p2_; | |
508 typename rtc::remove_reference<P3>::type p3_; | |
509 typename rtc::remove_reference<P4>::type p4_; | |
510 }; | |
511 | |
512 template <class FunctorT, class R, | |
513 class P1, | |
514 class P2, | |
515 class P3, | |
516 class P4> | |
517 class Functor4 { | |
518 public: | |
519 Functor4(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4) | |
520 : functor_(functor), | |
521 p1_(p1), | |
522 p2_(p2), | |
523 p3_(p3), | |
524 p4_(p4) {} | |
525 R operator()() const { | |
526 return functor_(p1_, p2_, p3_, p4_); } | |
527 private: | |
528 FunctorT functor_; | |
529 typename rtc::remove_reference<P1>::type p1_; | |
530 typename rtc::remove_reference<P2>::type p2_; | |
531 typename rtc::remove_reference<P3>::type p3_; | |
532 typename rtc::remove_reference<P4>::type p4_; | |
533 }; | |
534 | |
535 | |
536 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4) | |
537 | |
538 template <class ObjectT, class R, | |
539 class P1, | |
540 class P2, | |
541 class P3, | |
542 class P4> | |
543 MethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4> | |
544 Bind(FP_T(method), ObjectT* object, | |
545 typename detail::identity<P1>::type p1, | |
546 typename detail::identity<P2>::type p2, | |
547 typename detail::identity<P3>::type p3, | |
548 typename detail::identity<P4>::type p4) { | |
549 return MethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>( | |
550 method, object, p1, p2, p3, p4); | |
551 } | |
552 | |
553 #undef FP_T | |
554 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4) const | |
555 | |
556 template <class ObjectT, class R, | |
557 class P1, | |
558 class P2, | |
559 class P3, | |
560 class P4> | |
561 MethodFunctor4<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4> | |
562 Bind(FP_T(method), const ObjectT* object, | |
563 typename detail::identity<P1>::type p1, | |
564 typename detail::identity<P2>::type p2, | |
565 typename detail::identity<P3>::type p3, | |
566 typename detail::identity<P4>::type p4) { | |
567 return MethodFunctor4<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>( | |
568 method, object, p1, p2, p3, p4); | |
569 } | |
570 | |
571 #undef FP_T | |
572 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4) | |
573 | |
574 template <class ObjectT, class R, | |
575 class P1, | |
576 class P2, | |
577 class P3, | |
578 class P4> | |
579 MethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4> | |
580 Bind(FP_T(method), const scoped_refptr<ObjectT>& object, | |
581 typename detail::identity<P1>::type p1, | |
582 typename detail::identity<P2>::type p2, | |
583 typename detail::identity<P3>::type p3, | |
584 typename detail::identity<P4>::type p4) { | |
585 return MethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>( | |
586 method, object.get(), p1, p2, p3, p4); | |
587 } | |
588 | |
589 #undef FP_T | |
590 #define FP_T(x) R (*x)(P1, P2, P3, P4) | |
591 | |
592 template <class R, | |
593 class P1, | |
594 class P2, | |
595 class P3, | |
596 class P4> | |
597 Functor4<FP_T(NONAME), R, P1, P2, P3, P4> | |
598 Bind(FP_T(function), | |
599 typename detail::identity<P1>::type p1, | |
600 typename detail::identity<P2>::type p2, | |
601 typename detail::identity<P3>::type p3, | |
602 typename detail::identity<P4>::type p4) { | |
603 return Functor4<FP_T(NONAME), R, P1, P2, P3, P4>( | |
604 function, p1, p2, p3, p4); | |
605 } | |
606 | |
607 #undef FP_T | |
608 | |
609 template <class ObjectT, class MethodT, class R, | |
610 class P1, | |
611 class P2, | |
612 class P3, | |
613 class P4, | |
614 class P5> | |
615 class MethodFunctor5 { | |
616 public: | |
617 MethodFunctor5(MethodT method, ObjectT* object, | |
618 P1 p1, | |
619 P2 p2, | |
620 P3 p3, | |
621 P4 p4, | |
622 P5 p5) | |
623 : method_(method), object_(object), | |
624 p1_(p1), | |
625 p2_(p2), | |
626 p3_(p3), | |
627 p4_(p4), | |
628 p5_(p5) {} | |
629 R operator()() const { | |
630 return (object_->*method_)(p1_, p2_, p3_, p4_, p5_); } | |
631 private: | |
632 MethodT method_; | |
633 typename detail::PointerType<ObjectT>::type object_; | |
634 typename rtc::remove_reference<P1>::type p1_; | |
635 typename rtc::remove_reference<P2>::type p2_; | |
636 typename rtc::remove_reference<P3>::type p3_; | |
637 typename rtc::remove_reference<P4>::type p4_; | |
638 typename rtc::remove_reference<P5>::type p5_; | |
639 }; | |
640 | |
641 template <class FunctorT, class R, | |
642 class P1, | |
643 class P2, | |
644 class P3, | |
645 class P4, | |
646 class P5> | |
647 class Functor5 { | |
648 public: | |
649 Functor5(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) | |
650 : functor_(functor), | |
651 p1_(p1), | |
652 p2_(p2), | |
653 p3_(p3), | |
654 p4_(p4), | |
655 p5_(p5) {} | |
656 R operator()() const { | |
657 return functor_(p1_, p2_, p3_, p4_, p5_); } | |
658 private: | |
659 FunctorT functor_; | |
660 typename rtc::remove_reference<P1>::type p1_; | |
661 typename rtc::remove_reference<P2>::type p2_; | |
662 typename rtc::remove_reference<P3>::type p3_; | |
663 typename rtc::remove_reference<P4>::type p4_; | |
664 typename rtc::remove_reference<P5>::type p5_; | |
665 }; | |
666 | |
667 | |
668 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5) | |
669 | |
670 template <class ObjectT, class R, | |
671 class P1, | |
672 class P2, | |
673 class P3, | |
674 class P4, | |
675 class P5> | |
676 MethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5> | |
677 Bind(FP_T(method), ObjectT* object, | |
678 typename detail::identity<P1>::type p1, | |
679 typename detail::identity<P2>::type p2, | |
680 typename detail::identity<P3>::type p3, | |
681 typename detail::identity<P4>::type p4, | |
682 typename detail::identity<P5>::type p5) { | |
683 return MethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>( | |
684 method, object, p1, p2, p3, p4, p5); | |
685 } | |
686 | |
687 #undef FP_T | |
688 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5) const | |
689 | |
690 template <class ObjectT, class R, | |
691 class P1, | |
692 class P2, | |
693 class P3, | |
694 class P4, | |
695 class P5> | |
696 MethodFunctor5<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5> | |
697 Bind(FP_T(method), const ObjectT* object, | |
698 typename detail::identity<P1>::type p1, | |
699 typename detail::identity<P2>::type p2, | |
700 typename detail::identity<P3>::type p3, | |
701 typename detail::identity<P4>::type p4, | |
702 typename detail::identity<P5>::type p5) { | |
703 return MethodFunctor5<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>( | |
704 method, object, p1, p2, p3, p4, p5); | |
705 } | |
706 | |
707 #undef FP_T | |
708 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5) | |
709 | |
710 template <class ObjectT, class R, | |
711 class P1, | |
712 class P2, | |
713 class P3, | |
714 class P4, | |
715 class P5> | |
716 MethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5> | |
717 Bind(FP_T(method), const scoped_refptr<ObjectT>& object, | |
718 typename detail::identity<P1>::type p1, | |
719 typename detail::identity<P2>::type p2, | |
720 typename detail::identity<P3>::type p3, | |
721 typename detail::identity<P4>::type p4, | |
722 typename detail::identity<P5>::type p5) { | |
723 return MethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>( | |
724 method, object.get(), p1, p2, p3, p4, p5); | |
725 } | |
726 | |
727 #undef FP_T | |
728 #define FP_T(x) R (*x)(P1, P2, P3, P4, P5) | |
729 | |
730 template <class R, | |
731 class P1, | |
732 class P2, | |
733 class P3, | |
734 class P4, | |
735 class P5> | |
736 Functor5<FP_T(NONAME), R, P1, P2, P3, P4, P5> | |
737 Bind(FP_T(function), | |
738 typename detail::identity<P1>::type p1, | |
739 typename detail::identity<P2>::type p2, | |
740 typename detail::identity<P3>::type p3, | |
741 typename detail::identity<P4>::type p4, | |
742 typename detail::identity<P5>::type p5) { | |
743 return Functor5<FP_T(NONAME), R, P1, P2, P3, P4, P5>( | |
744 function, p1, p2, p3, p4, p5); | |
745 } | |
746 | |
747 #undef FP_T | |
748 | |
749 template <class ObjectT, class MethodT, class R, | |
750 class P1, | |
751 class P2, | |
752 class P3, | |
753 class P4, | |
754 class P5, | |
755 class P6> | |
756 class MethodFunctor6 { | |
757 public: | |
758 MethodFunctor6(MethodT method, ObjectT* object, | |
759 P1 p1, | |
760 P2 p2, | |
761 P3 p3, | |
762 P4 p4, | |
763 P5 p5, | |
764 P6 p6) | |
765 : method_(method), object_(object), | |
766 p1_(p1), | |
767 p2_(p2), | |
768 p3_(p3), | |
769 p4_(p4), | |
770 p5_(p5), | |
771 p6_(p6) {} | |
772 R operator()() const { | |
773 return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_); } | |
774 private: | |
775 MethodT method_; | |
776 typename detail::PointerType<ObjectT>::type object_; | |
777 typename rtc::remove_reference<P1>::type p1_; | |
778 typename rtc::remove_reference<P2>::type p2_; | |
779 typename rtc::remove_reference<P3>::type p3_; | |
780 typename rtc::remove_reference<P4>::type p4_; | |
781 typename rtc::remove_reference<P5>::type p5_; | |
782 typename rtc::remove_reference<P6>::type p6_; | |
783 }; | |
784 | |
785 template <class FunctorT, class R, | |
786 class P1, | |
787 class P2, | |
788 class P3, | |
789 class P4, | |
790 class P5, | |
791 class P6> | |
792 class Functor6 { | |
793 public: | |
794 Functor6(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) | |
795 : functor_(functor), | |
796 p1_(p1), | |
797 p2_(p2), | |
798 p3_(p3), | |
799 p4_(p4), | |
800 p5_(p5), | |
801 p6_(p6) {} | |
802 R operator()() const { | |
803 return functor_(p1_, p2_, p3_, p4_, p5_, p6_); } | |
804 private: | |
805 FunctorT functor_; | |
806 typename rtc::remove_reference<P1>::type p1_; | |
807 typename rtc::remove_reference<P2>::type p2_; | |
808 typename rtc::remove_reference<P3>::type p3_; | |
809 typename rtc::remove_reference<P4>::type p4_; | |
810 typename rtc::remove_reference<P5>::type p5_; | |
811 typename rtc::remove_reference<P6>::type p6_; | |
812 }; | |
813 | |
814 | |
815 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6) | |
816 | |
817 template <class ObjectT, class R, | |
818 class P1, | |
819 class P2, | |
820 class P3, | |
821 class P4, | |
822 class P5, | |
823 class P6> | |
824 MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> | |
825 Bind(FP_T(method), ObjectT* object, | |
826 typename detail::identity<P1>::type p1, | |
827 typename detail::identity<P2>::type p2, | |
828 typename detail::identity<P3>::type p3, | |
829 typename detail::identity<P4>::type p4, | |
830 typename detail::identity<P5>::type p5, | |
831 typename detail::identity<P6>::type p6) { | |
832 return MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>( | |
833 method, object, p1, p2, p3, p4, p5, p6); | |
834 } | |
835 | |
836 #undef FP_T | |
837 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6) const | |
838 | |
839 template <class ObjectT, class R, | |
840 class P1, | |
841 class P2, | |
842 class P3, | |
843 class P4, | |
844 class P5, | |
845 class P6> | |
846 MethodFunctor6<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> | |
847 Bind(FP_T(method), const ObjectT* object, | |
848 typename detail::identity<P1>::type p1, | |
849 typename detail::identity<P2>::type p2, | |
850 typename detail::identity<P3>::type p3, | |
851 typename detail::identity<P4>::type p4, | |
852 typename detail::identity<P5>::type p5, | |
853 typename detail::identity<P6>::type p6) { | |
854 return MethodFunctor6<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>( | |
855 method, object, p1, p2, p3, p4, p5, p6); | |
856 } | |
857 | |
858 #undef FP_T | |
859 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6) | |
860 | |
861 template <class ObjectT, class R, | |
862 class P1, | |
863 class P2, | |
864 class P3, | |
865 class P4, | |
866 class P5, | |
867 class P6> | |
868 MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> | |
869 Bind(FP_T(method), const scoped_refptr<ObjectT>& object, | |
870 typename detail::identity<P1>::type p1, | |
871 typename detail::identity<P2>::type p2, | |
872 typename detail::identity<P3>::type p3, | |
873 typename detail::identity<P4>::type p4, | |
874 typename detail::identity<P5>::type p5, | |
875 typename detail::identity<P6>::type p6) { | |
876 return MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>( | |
877 method, object.get(), p1, p2, p3, p4, p5, p6); | |
878 } | |
879 | |
880 #undef FP_T | |
881 #define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6) | |
882 | |
883 template <class R, | |
884 class P1, | |
885 class P2, | |
886 class P3, | |
887 class P4, | |
888 class P5, | |
889 class P6> | |
890 Functor6<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6> | |
891 Bind(FP_T(function), | |
892 typename detail::identity<P1>::type p1, | |
893 typename detail::identity<P2>::type p2, | |
894 typename detail::identity<P3>::type p3, | |
895 typename detail::identity<P4>::type p4, | |
896 typename detail::identity<P5>::type p5, | |
897 typename detail::identity<P6>::type p6) { | |
898 return Functor6<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>( | |
899 function, p1, p2, p3, p4, p5, p6); | |
900 } | |
901 | |
902 #undef FP_T | |
903 | |
904 template <class ObjectT, | |
905 class MethodT, | |
906 class R, | |
907 class P1, | |
908 class P2, | |
909 class P3, | |
910 class P4, | |
911 class P5, | |
912 class P6, | |
913 class P7> | |
914 class MethodFunctor7 { | |
915 public: | |
916 MethodFunctor7(MethodT method, | |
917 ObjectT* object, | |
918 P1 p1, | |
919 P2 p2, | |
920 P3 p3, | |
921 P4 p4, | |
922 P5 p5, | |
923 P6 p6, | |
924 P7 p7) | |
925 : method_(method), | |
926 object_(object), | |
927 p1_(p1), | |
928 p2_(p2), | |
929 p3_(p3), | |
930 p4_(p4), | |
931 p5_(p5), | |
932 p6_(p6), | |
933 p7_(p7) {} | |
934 R operator()() const { | |
935 return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_); | |
936 } | |
937 | |
938 private: | |
939 MethodT method_; | |
940 typename detail::PointerType<ObjectT>::type object_; | |
941 typename rtc::remove_reference<P1>::type p1_; | |
942 typename rtc::remove_reference<P2>::type p2_; | |
943 typename rtc::remove_reference<P3>::type p3_; | |
944 typename rtc::remove_reference<P4>::type p4_; | |
945 typename rtc::remove_reference<P5>::type p5_; | |
946 typename rtc::remove_reference<P6>::type p6_; | |
947 typename rtc::remove_reference<P7>::type p7_; | |
948 }; | |
949 | |
950 template <class FunctorT, | |
951 class R, | |
952 class P1, | |
953 class P2, | |
954 class P3, | |
955 class P4, | |
956 class P5, | |
957 class P6, | |
958 class P7> | |
959 class Functor7 { | |
960 public: | |
961 Functor7(const FunctorT& functor, | |
962 P1 p1, | |
963 P2 p2, | |
964 P3 p3, | |
965 P4 p4, | |
966 P5 p5, | |
967 P6 p6, | |
968 P7 p7) | |
969 : functor_(functor), | |
970 p1_(p1), | |
971 p2_(p2), | |
972 p3_(p3), | |
973 p4_(p4), | |
974 p5_(p5), | |
975 p6_(p6), | |
976 p7_(p7) {} | |
977 R operator()() const { return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_); } | |
978 | |
979 private: | |
980 FunctorT functor_; | |
981 typename rtc::remove_reference<P1>::type p1_; | |
982 typename rtc::remove_reference<P2>::type p2_; | |
983 typename rtc::remove_reference<P3>::type p3_; | |
984 typename rtc::remove_reference<P4>::type p4_; | |
985 typename rtc::remove_reference<P5>::type p5_; | |
986 typename rtc::remove_reference<P6>::type p6_; | |
987 typename rtc::remove_reference<P7>::type p7_; | |
988 }; | |
989 | |
990 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7) | |
991 | |
992 template <class ObjectT, | |
993 class R, | |
994 class P1, | |
995 class P2, | |
996 class P3, | |
997 class P4, | |
998 class P5, | |
999 class P6, | |
1000 class P7> | |
1001 MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind( | |
1002 FP_T(method), | |
1003 ObjectT* object, | |
1004 typename detail::identity<P1>::type p1, | |
1005 typename detail::identity<P2>::type p2, | |
1006 typename detail::identity<P3>::type p3, | |
1007 typename detail::identity<P4>::type p4, | |
1008 typename detail::identity<P5>::type p5, | |
1009 typename detail::identity<P6>::type p6, | |
1010 typename detail::identity<P7>::type p7) { | |
1011 return MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>( | |
1012 method, object, p1, p2, p3, p4, p5, p6, p7); | |
1013 } | |
1014 | |
1015 #undef FP_T | |
1016 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7) const | |
1017 | |
1018 template <class ObjectT, | |
1019 class R, | |
1020 class P1, | |
1021 class P2, | |
1022 class P3, | |
1023 class P4, | |
1024 class P5, | |
1025 class P6, | |
1026 class P7> | |
1027 MethodFunctor7<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind( | |
1028 FP_T(method), | |
1029 const ObjectT* object, | |
1030 typename detail::identity<P1>::type p1, | |
1031 typename detail::identity<P2>::type p2, | |
1032 typename detail::identity<P3>::type p3, | |
1033 typename detail::identity<P4>::type p4, | |
1034 typename detail::identity<P5>::type p5, | |
1035 typename detail::identity<P6>::type p6, | |
1036 typename detail::identity<P7>::type p7) { | |
1037 return MethodFunctor7<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, | |
1038 P7>(method, object, p1, p2, p3, p4, p5, p6, p7); | |
1039 } | |
1040 | |
1041 #undef FP_T | |
1042 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7) | |
1043 | |
1044 template <class ObjectT, | |
1045 class R, | |
1046 class P1, | |
1047 class P2, | |
1048 class P3, | |
1049 class P4, | |
1050 class P5, | |
1051 class P6, | |
1052 class P7> | |
1053 MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind( | |
1054 FP_T(method), | |
1055 const scoped_refptr<ObjectT>& object, | |
1056 typename detail::identity<P1>::type p1, | |
1057 typename detail::identity<P2>::type p2, | |
1058 typename detail::identity<P3>::type p3, | |
1059 typename detail::identity<P4>::type p4, | |
1060 typename detail::identity<P5>::type p5, | |
1061 typename detail::identity<P6>::type p6, | |
1062 typename detail::identity<P7>::type p7) { | |
1063 return MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>( | |
1064 method, object.get(), p1, p2, p3, p4, p5, p6, p7); | |
1065 } | |
1066 | |
1067 #undef FP_T | |
1068 #define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7) | |
1069 | |
1070 template <class R, | |
1071 class P1, | |
1072 class P2, | |
1073 class P3, | |
1074 class P4, | |
1075 class P5, | |
1076 class P6, | |
1077 class P7> | |
1078 Functor7<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind( | |
1079 FP_T(function), | |
1080 typename detail::identity<P1>::type p1, | |
1081 typename detail::identity<P2>::type p2, | |
1082 typename detail::identity<P3>::type p3, | |
1083 typename detail::identity<P4>::type p4, | |
1084 typename detail::identity<P5>::type p5, | |
1085 typename detail::identity<P6>::type p6, | |
1086 typename detail::identity<P7>::type p7) { | |
1087 return Functor7<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>( | |
1088 function, p1, p2, p3, p4, p5, p6, p7); | |
1089 } | |
1090 | |
1091 #undef FP_T | |
1092 | |
1093 template <class ObjectT, | |
1094 class MethodT, | |
1095 class R, | |
1096 class P1, | |
1097 class P2, | |
1098 class P3, | |
1099 class P4, | |
1100 class P5, | |
1101 class P6, | |
1102 class P7, | |
1103 class P8> | |
1104 class MethodFunctor8 { | |
1105 public: | |
1106 MethodFunctor8(MethodT method, | |
1107 ObjectT* object, | |
1108 P1 p1, | |
1109 P2 p2, | |
1110 P3 p3, | |
1111 P4 p4, | |
1112 P5 p5, | |
1113 P6 p6, | |
1114 P7 p7, | |
1115 P8 p8) | |
1116 : method_(method), | |
1117 object_(object), | |
1118 p1_(p1), | |
1119 p2_(p2), | |
1120 p3_(p3), | |
1121 p4_(p4), | |
1122 p5_(p5), | |
1123 p6_(p6), | |
1124 p7_(p7), | |
1125 p8_(p8) {} | |
1126 R operator()() const { | |
1127 return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_); | |
1128 } | |
1129 | |
1130 private: | |
1131 MethodT method_; | |
1132 typename detail::PointerType<ObjectT>::type object_; | |
1133 typename rtc::remove_reference<P1>::type p1_; | |
1134 typename rtc::remove_reference<P2>::type p2_; | |
1135 typename rtc::remove_reference<P3>::type p3_; | |
1136 typename rtc::remove_reference<P4>::type p4_; | |
1137 typename rtc::remove_reference<P5>::type p5_; | |
1138 typename rtc::remove_reference<P6>::type p6_; | |
1139 typename rtc::remove_reference<P7>::type p7_; | |
1140 typename rtc::remove_reference<P8>::type p8_; | |
1141 }; | |
1142 | |
1143 template <class FunctorT, | |
1144 class R, | |
1145 class P1, | |
1146 class P2, | |
1147 class P3, | |
1148 class P4, | |
1149 class P5, | |
1150 class P6, | |
1151 class P7, | |
1152 class P8> | |
1153 class Functor8 { | |
1154 public: | |
1155 Functor8(const FunctorT& functor, | |
1156 P1 p1, | |
1157 P2 p2, | |
1158 P3 p3, | |
1159 P4 p4, | |
1160 P5 p5, | |
1161 P6 p6, | |
1162 P7 p7, | |
1163 P8 p8) | |
1164 : functor_(functor), | |
1165 p1_(p1), | |
1166 p2_(p2), | |
1167 p3_(p3), | |
1168 p4_(p4), | |
1169 p5_(p5), | |
1170 p6_(p6), | |
1171 p7_(p7), | |
1172 p8_(p8) {} | |
1173 R operator()() const { | |
1174 return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_); | |
1175 } | |
1176 | |
1177 private: | |
1178 FunctorT functor_; | |
1179 typename rtc::remove_reference<P1>::type p1_; | |
1180 typename rtc::remove_reference<P2>::type p2_; | |
1181 typename rtc::remove_reference<P3>::type p3_; | |
1182 typename rtc::remove_reference<P4>::type p4_; | |
1183 typename rtc::remove_reference<P5>::type p5_; | |
1184 typename rtc::remove_reference<P6>::type p6_; | |
1185 typename rtc::remove_reference<P7>::type p7_; | |
1186 typename rtc::remove_reference<P8>::type p8_; | |
1187 }; | |
1188 | |
1189 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8) | |
1190 | |
1191 template <class ObjectT, | |
1192 class R, | |
1193 class P1, | |
1194 class P2, | |
1195 class P3, | |
1196 class P4, | |
1197 class P5, | |
1198 class P6, | |
1199 class P7, | |
1200 class P8> | |
1201 MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind( | |
1202 FP_T(method), | |
1203 ObjectT* object, | |
1204 typename detail::identity<P1>::type p1, | |
1205 typename detail::identity<P2>::type p2, | |
1206 typename detail::identity<P3>::type p3, | |
1207 typename detail::identity<P4>::type p4, | |
1208 typename detail::identity<P5>::type p5, | |
1209 typename detail::identity<P6>::type p6, | |
1210 typename detail::identity<P7>::type p7, | |
1211 typename detail::identity<P8>::type p8) { | |
1212 return MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, | |
1213 P8>(method, object, p1, p2, p3, p4, p5, p6, p7, p8); | |
1214 } | |
1215 | |
1216 #undef FP_T | |
1217 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8) const | |
1218 | |
1219 template <class ObjectT, | |
1220 class R, | |
1221 class P1, | |
1222 class P2, | |
1223 class P3, | |
1224 class P4, | |
1225 class P5, | |
1226 class P6, | |
1227 class P7, | |
1228 class P8> | |
1229 MethodFunctor8<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> | |
1230 Bind(FP_T(method), | |
1231 const ObjectT* object, | |
1232 typename detail::identity<P1>::type p1, | |
1233 typename detail::identity<P2>::type p2, | |
1234 typename detail::identity<P3>::type p3, | |
1235 typename detail::identity<P4>::type p4, | |
1236 typename detail::identity<P5>::type p5, | |
1237 typename detail::identity<P6>::type p6, | |
1238 typename detail::identity<P7>::type p7, | |
1239 typename detail::identity<P8>::type p8) { | |
1240 return MethodFunctor8<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, | |
1241 P7, P8>(method, object, p1, p2, p3, p4, p5, p6, p7, p8); | |
1242 } | |
1243 | |
1244 #undef FP_T | |
1245 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8) | |
1246 | |
1247 template <class ObjectT, | |
1248 class R, | |
1249 class P1, | |
1250 class P2, | |
1251 class P3, | |
1252 class P4, | |
1253 class P5, | |
1254 class P6, | |
1255 class P7, | |
1256 class P8> | |
1257 MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind( | |
1258 FP_T(method), | |
1259 const scoped_refptr<ObjectT>& object, | |
1260 typename detail::identity<P1>::type p1, | |
1261 typename detail::identity<P2>::type p2, | |
1262 typename detail::identity<P3>::type p3, | |
1263 typename detail::identity<P4>::type p4, | |
1264 typename detail::identity<P5>::type p5, | |
1265 typename detail::identity<P6>::type p6, | |
1266 typename detail::identity<P7>::type p7, | |
1267 typename detail::identity<P8>::type p8) { | |
1268 return MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, | |
1269 P8>(method, object.get(), p1, p2, p3, p4, p5, p6, p7, | |
1270 p8); | |
1271 } | |
1272 | |
1273 #undef FP_T | |
1274 #define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7, P8) | |
1275 | |
1276 template <class R, | |
1277 class P1, | |
1278 class P2, | |
1279 class P3, | |
1280 class P4, | |
1281 class P5, | |
1282 class P6, | |
1283 class P7, | |
1284 class P8> | |
1285 Functor8<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind( | |
1286 FP_T(function), | |
1287 typename detail::identity<P1>::type p1, | |
1288 typename detail::identity<P2>::type p2, | |
1289 typename detail::identity<P3>::type p3, | |
1290 typename detail::identity<P4>::type p4, | |
1291 typename detail::identity<P5>::type p5, | |
1292 typename detail::identity<P6>::type p6, | |
1293 typename detail::identity<P7>::type p7, | |
1294 typename detail::identity<P8>::type p8) { | |
1295 return Functor8<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8>( | |
1296 function, p1, p2, p3, p4, p5, p6, p7, p8); | |
1297 } | |
1298 | |
1299 #undef FP_T | |
1300 | |
1301 template <class ObjectT, | |
1302 class MethodT, | |
1303 class R, | |
1304 class P1, | |
1305 class P2, | |
1306 class P3, | |
1307 class P4, | |
1308 class P5, | |
1309 class P6, | |
1310 class P7, | |
1311 class P8, | |
1312 class P9> | |
1313 class MethodFunctor9 { | |
1314 public: | |
1315 MethodFunctor9(MethodT method, | |
1316 ObjectT* object, | |
1317 P1 p1, | |
1318 P2 p2, | |
1319 P3 p3, | |
1320 P4 p4, | |
1321 P5 p5, | |
1322 P6 p6, | |
1323 P7 p7, | |
1324 P8 p8, | |
1325 P9 p9) | |
1326 : method_(method), | |
1327 object_(object), | |
1328 p1_(p1), | |
1329 p2_(p2), | |
1330 p3_(p3), | |
1331 p4_(p4), | |
1332 p5_(p5), | |
1333 p6_(p6), | |
1334 p7_(p7), | |
1335 p8_(p8), | |
1336 p9_(p9) {} | |
1337 R operator()() const { | |
1338 return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_); | |
1339 } | |
1340 | |
1341 private: | |
1342 MethodT method_; | |
1343 typename detail::PointerType<ObjectT>::type object_; | |
1344 typename rtc::remove_reference<P1>::type p1_; | |
1345 typename rtc::remove_reference<P2>::type p2_; | |
1346 typename rtc::remove_reference<P3>::type p3_; | |
1347 typename rtc::remove_reference<P4>::type p4_; | |
1348 typename rtc::remove_reference<P5>::type p5_; | |
1349 typename rtc::remove_reference<P6>::type p6_; | |
1350 typename rtc::remove_reference<P7>::type p7_; | |
1351 typename rtc::remove_reference<P8>::type p8_; | |
1352 typename rtc::remove_reference<P9>::type p9_; | |
1353 }; | |
1354 | |
1355 template <class FunctorT, | |
1356 class R, | |
1357 class P1, | |
1358 class P2, | |
1359 class P3, | |
1360 class P4, | |
1361 class P5, | |
1362 class P6, | |
1363 class P7, | |
1364 class P8, | |
1365 class P9> | |
1366 class Functor9 { | |
1367 public: | |
1368 Functor9(const FunctorT& functor, | |
1369 P1 p1, | |
1370 P2 p2, | |
1371 P3 p3, | |
1372 P4 p4, | |
1373 P5 p5, | |
1374 P6 p6, | |
1375 P7 p7, | |
1376 P8 p8, | |
1377 P9 p9) | |
1378 : functor_(functor), | |
1379 p1_(p1), | |
1380 p2_(p2), | |
1381 p3_(p3), | |
1382 p4_(p4), | |
1383 p5_(p5), | |
1384 p6_(p6), | |
1385 p7_(p7), | |
1386 p8_(p8), | |
1387 p9_(p9) {} | |
1388 R operator()() const { | |
1389 return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_); | |
1390 } | |
1391 | |
1392 private: | |
1393 FunctorT functor_; | |
1394 typename rtc::remove_reference<P1>::type p1_; | |
1395 typename rtc::remove_reference<P2>::type p2_; | |
1396 typename rtc::remove_reference<P3>::type p3_; | |
1397 typename rtc::remove_reference<P4>::type p4_; | |
1398 typename rtc::remove_reference<P5>::type p5_; | |
1399 typename rtc::remove_reference<P6>::type p6_; | |
1400 typename rtc::remove_reference<P7>::type p7_; | |
1401 typename rtc::remove_reference<P8>::type p8_; | |
1402 typename rtc::remove_reference<P9>::type p9_; | |
1403 }; | |
1404 | |
1405 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9) | |
1406 | |
1407 template <class ObjectT, | |
1408 class R, | |
1409 class P1, | |
1410 class P2, | |
1411 class P3, | |
1412 class P4, | |
1413 class P5, | |
1414 class P6, | |
1415 class P7, | |
1416 class P8, | |
1417 class P9> | |
1418 MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9> | |
1419 Bind(FP_T(method), | |
1420 ObjectT* object, | |
1421 typename detail::identity<P1>::type p1, | |
1422 typename detail::identity<P2>::type p2, | |
1423 typename detail::identity<P3>::type p3, | |
1424 typename detail::identity<P4>::type p4, | |
1425 typename detail::identity<P5>::type p5, | |
1426 typename detail::identity<P6>::type p6, | |
1427 typename detail::identity<P7>::type p7, | |
1428 typename detail::identity<P8>::type p8, | |
1429 typename detail::identity<P9>::type p9) { | |
1430 return MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, | |
1431 P8, P9>(method, object, p1, p2, p3, p4, p5, p6, p7, p8, | |
1432 p9); | |
1433 } | |
1434 | |
1435 #undef FP_T | |
1436 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9) const | |
1437 | |
1438 template <class ObjectT, | |
1439 class R, | |
1440 class P1, | |
1441 class P2, | |
1442 class P3, | |
1443 class P4, | |
1444 class P5, | |
1445 class P6, | |
1446 class P7, | |
1447 class P8, | |
1448 class P9> | |
1449 MethodFunctor9<const ObjectT, | |
1450 FP_T(NONAME), | |
1451 R, | |
1452 P1, | |
1453 P2, | |
1454 P3, | |
1455 P4, | |
1456 P5, | |
1457 P6, | |
1458 P7, | |
1459 P8, | |
1460 P9> | |
1461 Bind(FP_T(method), | |
1462 const ObjectT* object, | |
1463 typename detail::identity<P1>::type p1, | |
1464 typename detail::identity<P2>::type p2, | |
1465 typename detail::identity<P3>::type p3, | |
1466 typename detail::identity<P4>::type p4, | |
1467 typename detail::identity<P5>::type p5, | |
1468 typename detail::identity<P6>::type p6, | |
1469 typename detail::identity<P7>::type p7, | |
1470 typename detail::identity<P8>::type p8, | |
1471 typename detail::identity<P9>::type p9) { | |
1472 return MethodFunctor9<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, | |
1473 P7, P8, P9>(method, object, p1, p2, p3, p4, p5, p6, p7, | |
1474 p8, p9); | |
1475 } | |
1476 | |
1477 #undef FP_T | |
1478 #define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9) | |
1479 | |
1480 template <class ObjectT, | |
1481 class R, | |
1482 class P1, | |
1483 class P2, | |
1484 class P3, | |
1485 class P4, | |
1486 class P5, | |
1487 class P6, | |
1488 class P7, | |
1489 class P8, | |
1490 class P9> | |
1491 MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9> | |
1492 Bind(FP_T(method), | |
1493 const scoped_refptr<ObjectT>& object, | |
1494 typename detail::identity<P1>::type p1, | |
1495 typename detail::identity<P2>::type p2, | |
1496 typename detail::identity<P3>::type p3, | |
1497 typename detail::identity<P4>::type p4, | |
1498 typename detail::identity<P5>::type p5, | |
1499 typename detail::identity<P6>::type p6, | |
1500 typename detail::identity<P7>::type p7, | |
1501 typename detail::identity<P8>::type p8, | |
1502 typename detail::identity<P9>::type p9) { | |
1503 return MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, | |
1504 P8, P9>(method, object.get(), p1, p2, p3, p4, p5, p6, | |
1505 p7, p8, p9); | |
1506 } | |
1507 | |
1508 #undef FP_T | |
1509 #define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9) | |
1510 | |
1511 template <class R, | |
1512 class P1, | |
1513 class P2, | |
1514 class P3, | |
1515 class P4, | |
1516 class P5, | |
1517 class P6, | |
1518 class P7, | |
1519 class P8, | |
1520 class P9> | |
1521 Functor9<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9> Bind( | |
1522 FP_T(function), | |
1523 typename detail::identity<P1>::type p1, | |
1524 typename detail::identity<P2>::type p2, | |
1525 typename detail::identity<P3>::type p3, | |
1526 typename detail::identity<P4>::type p4, | |
1527 typename detail::identity<P5>::type p5, | |
1528 typename detail::identity<P6>::type p6, | |
1529 typename detail::identity<P7>::type p7, | |
1530 typename detail::identity<P8>::type p8, | |
1531 typename detail::identity<P9>::type p9) { | |
1532 return Functor9<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>( | |
1533 function, p1, p2, p3, p4, p5, p6, p7, p8, p9); | |
1534 } | |
1535 | |
1536 #undef FP_T | |
1537 | 221 |
1538 } // namespace rtc | 222 } // namespace rtc |
1539 | 223 |
1540 #undef NONAME | 224 #undef NONAME |
1541 | 225 |
1542 #endif // WEBRTC_BASE_BIND_H_ | 226 #endif // WEBRTC_BASE_BIND_H_ |
OLD | NEW |