Home | History | Annotate | Download | only in base
      1 // This file was GENERATED by command:
      2 //     pump.py bind.h.pump
      3 // DO NOT EDIT BY HAND!!!
      4 
      5 /*
      6  *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
      7  *
      8  *  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
     10  *  tree. An additional intellectual property rights grant can be found
     11  *  in the file PATENTS.  All contributing project authors may
     12  *  be found in the AUTHORS file in the root of the source tree.
     13  */
     14 
     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
     19 // 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
     21 // 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
     23 // 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
     25 // functor with a destroyed object will surely do bad things.
     26 //
     27 // Example usage:
     28 //   struct Foo {
     29 //     int Test1() { return 42; }
     30 //     int Test2() const { return 52; }
     31 //     int Test3(int x) { return x*x; }
     32 //     float Test4(int x, float y) { return x + y; }
     33 //   };
     34 //
     35 //   int main() {
     36 //     Foo foo;
     37 //     cout << rtc::Bind(&Foo::Test1, &foo)() << endl;
     38 //     cout << rtc::Bind(&Foo::Test2, &foo)() << endl;
     39 //     cout << rtc::Bind(&Foo::Test3, &foo, 3)() << endl;
     40 //     cout << rtc::Bind(&Foo::Test4, &foo, 7, 8.5f)() << endl;
     41 //   }
     42 //
     43 // Example usage of ref counted objects:
     44 //   struct Bar {
     45 //     int AddRef();
     46 //     int Release();
     47 //
     48 //     void Test() {}
     49 //     void BindThis() {
     50 //       // The functor passed to AsyncInvoke() will keep this object alive.
     51 //       invoker.AsyncInvoke(rtc::Bind(&Bar::Test, this));
     52 //     }
     53 //   };
     54 //
     55 //   int main() {
     56 //     rtc::scoped_refptr<Bar> bar = new rtc::RefCountedObject<Bar>();
     57 //     auto functor = rtc::Bind(&Bar::Test, bar);
     58 //     bar = nullptr;
     59 //     // The functor stores an internal scoped_refptr<Bar>, so this is safe.
     60 //     functor();
     61 //   }
     62 //
     63 
     64 #ifndef WEBRTC_BASE_BIND_H_
     65 #define WEBRTC_BASE_BIND_H_
     66 
     67 #include "webrtc/base/scoped_ref_ptr.h"
     68 #include "webrtc/base/template_util.h"
     69 
     70 #define NONAME
     71 
     72 namespace rtc {
     73 namespace detail {
     74 // 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
     76 // parameters to Bind itself: the function pointer parameters are exact
     77 // matches to the function prototype, but the parameters to bind have
     78 // references stripped. This trick allows the compiler to dictate the Bind
     79 // parameter types rather than deduce them.
     80 template <class T> struct identity { typedef T type; };
     81 
     82 // IsRefCounted<T>::value will be true for types that can be used in
     83 // rtc::scoped_refptr<T>, i.e. types that implements nullary functions AddRef()
     84 // and Release(), regardless of their return types. AddRef() and Release() can
     85 // be defined in T or any superclass of T.
     86 template <typename T>
     87 class IsRefCounted {
     88   // This is a complex implementation detail done with SFINAE.
     89 
     90   // Define types such that sizeof(Yes) != sizeof(No).
     91   struct Yes { char dummy[1]; };
     92   struct No { char dummy[2]; };
     93   // Define two overloaded template functions with return types of different
     94   // size. This way, we can use sizeof() on the return type to determine which
     95   // function the compiler would have chosen. One function will be preferred
     96   // over the other if it is possible to create it without compiler errors,
     97   // otherwise the compiler will simply remove it, and default to the less
     98   // preferred function.
     99   template <typename R>
    100   static Yes test(R* r, decltype(r->AddRef(), r->Release(), 42));
    101   template <typename C> static No test(...);
    102 
    103 public:
    104   // Trick the compiler to tell if it's possible to call AddRef() and Release().
    105   static const bool value = sizeof(test<T>((T*)nullptr, 42)) == sizeof(Yes);
    106 };
    107 
    108 // TernaryTypeOperator is a helper class to select a type based on a static bool
    109 // value.
    110 template <bool condition, typename IfTrueT, typename IfFalseT>
    111 struct TernaryTypeOperator {};
    112 
    113 template <typename IfTrueT, typename IfFalseT>
    114 struct TernaryTypeOperator<true, IfTrueT, IfFalseT> {
    115   typedef IfTrueT type;
    116 };
    117 
    118 template <typename IfTrueT, typename IfFalseT>
    119 struct TernaryTypeOperator<false, IfTrueT, IfFalseT> {
    120   typedef IfFalseT type;
    121 };
    122 
    123 // PointerType<T>::type will be scoped_refptr<T> for ref counted types, and T*
    124 // otherwise.
    125 template <class T>
    126 struct PointerType {
    127   typedef typename TernaryTypeOperator<IsRefCounted<T>::value,
    128                                        scoped_refptr<T>,
    129                                        T*>::type type;
    130 };
    131 
    132 }  // namespace detail
    133 
    134 template <class ObjectT, class MethodT, class R>
    135 class MethodFunctor0 {
    136  public:
    137   MethodFunctor0(MethodT method, ObjectT* object)
    138       : method_(method), object_(object) {}
    139   R operator()() const {
    140     return (object_->*method_)(); }
    141  private:
    142   MethodT method_;
    143   typename detail::PointerType<ObjectT>::type object_;
    144 };
    145 
    146 template <class FunctorT, class R>
    147 class Functor0 {
    148  public:
    149   explicit Functor0(const FunctorT& functor)
    150       : functor_(functor) {}
    151   R operator()() const {
    152     return functor_(); }
    153  private:
    154   FunctorT functor_;
    155 };
    156 
    157 
    158 #define FP_T(x) R (ObjectT::*x)()
    159 
    160 template <class ObjectT, class R>
    161 MethodFunctor0<ObjectT, FP_T(NONAME), R>
    162 Bind(FP_T(method), ObjectT* object) {
    163   return MethodFunctor0<ObjectT, FP_T(NONAME), R>(
    164       method, object);
    165 }
    166 
    167 #undef FP_T
    168 #define FP_T(x) R (ObjectT::*x)() const
    169 
    170 template <class ObjectT, class R>
    171 MethodFunctor0<const ObjectT, FP_T(NONAME), R>
    172 Bind(FP_T(method), const ObjectT* object) {
    173   return MethodFunctor0<const ObjectT, FP_T(NONAME), R>(
    174       method, object);
    175 }
    176 
    177 #undef FP_T
    178 #define FP_T(x) R (ObjectT::*x)()
    179 
    180 template <class ObjectT, class R>
    181 MethodFunctor0<ObjectT, FP_T(NONAME), R>
    182 Bind(FP_T(method), const scoped_refptr<ObjectT>& object) {
    183   return MethodFunctor0<ObjectT, FP_T(NONAME), R>(
    184       method, object.get());
    185 }
    186 
    187 #undef FP_T
    188 #define FP_T(x) R (*x)()
    189 
    190 template <class R>
    191 Functor0<FP_T(NONAME), R>
    192 Bind(FP_T(function)) {
    193   return Functor0<FP_T(NONAME), R>(
    194       function);
    195 }
    196 
    197 #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 
   1538 }  // namespace rtc
   1539 
   1540 #undef NONAME
   1541 
   1542 #endif  // WEBRTC_BASE_BIND_H_
   1543