1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// This file was GENERATED by command:
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     pump.py bind.h.pump
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// DO NOT EDIT BY HAND!!!
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// To generate bind.h from bind.h.pump, execute:
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// /home/build/google3/third_party/gtest/scripts/pump.py bind.h.pump
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Bind() is an overloaded function that converts method calls into function
19d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// objects (aka functors). The method object is captured as a scoped_refptr<> if
20d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// possible, and as a raw pointer otherwise. Any arguments to the method are
21d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// captured by value. The return value of Bind is a stateful, nullary function
22d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// object. Care should be taken about the lifetime of objects captured by
23d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// Bind(); the returned functor knows nothing about the lifetime of a non
24d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// ref-counted method object or any arguments passed by pointer, and calling the
25d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// functor with a destroyed object will surely do bad things.
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Example usage:
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//   struct Foo {
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     int Test1() { return 42; }
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     int Test2() const { return 52; }
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     int Test3(int x) { return x*x; }
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     float Test4(int x, float y) { return x + y; }
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//   };
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//   int main() {
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     Foo foo;
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     cout << rtc::Bind(&Foo::Test1, &foo)() << endl;
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     cout << rtc::Bind(&Foo::Test2, &foo)() << endl;
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     cout << rtc::Bind(&Foo::Test3, &foo, 3)() << endl;
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//     cout << rtc::Bind(&Foo::Test4, &foo, 7, 8.5f)() << endl;
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//   }
42d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//
43d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// Example usage of ref counted objects:
44d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//   struct Bar {
45d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     int AddRef();
46d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     int Release();
47d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//
48d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     void Test() {}
49d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     void BindThis() {
50d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//       // The functor passed to AsyncInvoke() will keep this object alive.
51d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//       invoker.AsyncInvoke(rtc::Bind(&Bar::Test, this));
52d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     }
53d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//   };
54d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//
55d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//   int main() {
56d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     rtc::scoped_refptr<Bar> bar = new rtc::RefCountedObject<Bar>();
57d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     auto functor = rtc::Bind(&Bar::Test, bar);
58d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     bar = nullptr;
59d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     // The functor stores an internal scoped_refptr<Bar>, so this is safe.
60d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//     functor();
61d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//   }
62d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert//
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_BIND_H_
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_BIND_H_
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
67d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#include "webrtc/base/scoped_ref_ptr.h"
685d9b92b53daf4db78fd090be4e210e07f786120dnoahric#include "webrtc/base/template_util.h"
69d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define NONAME
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace detail {
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// This is needed because the template parameters in Bind can't be resolved
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// if they're used both as parameters of the function pointer type and as
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// parameters to Bind itself: the function pointer parameters are exact
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// matches to the function prototype, but the parameters to bind have
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// references stripped. This trick allows the compiler to dictate the Bind
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// parameter types rather than deduce them.
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class T> struct identity { typedef T type; };
81d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
82d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// IsRefCounted<T>::value will be true for types that can be used in
83d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// rtc::scoped_refptr<T>, i.e. types that implements nullary functions AddRef()
84d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// and Release(), regardless of their return types. AddRef() and Release() can
85d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// be defined in T or any superclass of T.
86d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <typename T>
87d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvertclass IsRefCounted {
88d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // This is a complex implementation detail done with SFINAE.
89d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
90d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // Define types such that sizeof(Yes) != sizeof(No).
91d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  struct Yes { char dummy[1]; };
92d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  struct No { char dummy[2]; };
93d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // Define two overloaded template functions with return types of different
94d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // size. This way, we can use sizeof() on the return type to determine which
95d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // function the compiler would have chosen. One function will be preferred
96d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // over the other if it is possible to create it without compiler errors,
97d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // otherwise the compiler will simply remove it, and default to the less
98d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // preferred function.
99d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  template <typename R>
100d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  static Yes test(R* r, decltype(r->AddRef(), r->Release(), 42));
101d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  template <typename C> static No test(...);
102d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
103d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvertpublic:
104d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  // Trick the compiler to tell if it's possible to call AddRef() and Release().
105d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  static const bool value = sizeof(test<T>((T*)nullptr, 42)) == sizeof(Yes);
106d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert};
107d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
108d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// TernaryTypeOperator is a helper class to select a type based on a static bool
109d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// value.
110d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <bool condition, typename IfTrueT, typename IfFalseT>
111d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvertstruct TernaryTypeOperator {};
112d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
113d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <typename IfTrueT, typename IfFalseT>
114d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvertstruct TernaryTypeOperator<true, IfTrueT, IfFalseT> {
115d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typedef IfTrueT type;
116d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert};
117d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
118d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <typename IfTrueT, typename IfFalseT>
119d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvertstruct TernaryTypeOperator<false, IfTrueT, IfFalseT> {
120d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typedef IfFalseT type;
121d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert};
122d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
123d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// PointerType<T>::type will be scoped_refptr<T> for ref counted types, and T*
124d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert// otherwise.
125d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class T>
126d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvertstruct PointerType {
127d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typedef typename TernaryTypeOperator<IsRefCounted<T>::value,
128d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert                                       scoped_refptr<T>,
129d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert                                       T*>::type type;
130d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert};
131d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace detail
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class MethodT, class R>
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass MethodFunctor0 {
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodFunctor0(MethodT method, ObjectT* object)
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : method_(method), object_(object) {}
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (object_->*method_)(); }
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodT method_;
143d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class FunctorT, class R>
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Functor0 {
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  explicit Functor0(const FunctorT& functor)
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : functor_(functor) {}
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return functor_(); }
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  FunctorT functor_;
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)()
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R>
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor0<ObjectT, FP_T(NONAME), R>
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), ObjectT* object) {
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor0<ObjectT, FP_T(NONAME), R>(
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object);
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)() const
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R>
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor0<const ObjectT, FP_T(NONAME), R>
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), const ObjectT* object) {
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor0<const ObjectT, FP_T(NONAME), R>(
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object);
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
178d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)()
179d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
180d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R>
181d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor0<ObjectT, FP_T(NONAME), R>
182d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object) {
183d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor0<ObjectT, FP_T(NONAME), R>(
184d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get());
185d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
186d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
187d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (*x)()
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R>
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgFunctor0<FP_T(NONAME), R>
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(function)) {
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return Functor0<FP_T(NONAME), R>(
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      function);
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class MethodT, class R,
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1>
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass MethodFunctor1 {
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodFunctor1(MethodT method, ObjectT* object,
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P1 p1)
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : method_(method), object_(object),
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1) {}
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (object_->*method_)(p1_); }
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodT method_;
211d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
2125d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class FunctorT, class R,
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1>
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Functor1 {
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Functor1(const FunctorT& functor, P1 p1)
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : functor_(functor),
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1) {}
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return functor_(p1_); }
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  FunctorT functor_;
2265d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1)
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1>
234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor1<ObjectT, FP_T(NONAME), R, P1>
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), ObjectT* object,
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1) {
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor1<ObjectT, FP_T(NONAME), R, P1>(
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1);
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1) const
243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1>
246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor1<const ObjectT, FP_T(NONAME), R, P1>
247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), const ObjectT* object,
248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1) {
249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor1<const ObjectT, FP_T(NONAME), R, P1>(
250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1);
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
254d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)(P1)
255d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
256d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R,
257d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P1>
258d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor1<ObjectT, FP_T(NONAME), R, P1>
259d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object,
260d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P1>::type p1) {
261d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor1<ObjectT, FP_T(NONAME), R, P1>(
262d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get(), p1);
263d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
264d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
265d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (*x)(P1)
267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R,
269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1>
270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgFunctor1<FP_T(NONAME), R, P1>
271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(function),
272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1) {
273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return Functor1<FP_T(NONAME), R, P1>(
274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      function, p1);
275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
277f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
278f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
279f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class MethodT, class R,
280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2>
282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass MethodFunctor2 {
283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodFunctor2(MethodT method, ObjectT* object,
285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P1 p1,
286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P2 p2)
287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : method_(method), object_(object),
288f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2) {}
290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (object_->*method_)(p1_, p2_); }
292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodT method_;
294d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
2955d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
2965d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class FunctorT, class R,
300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
301f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2>
302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Functor2 {
303f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
304f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Functor2(const FunctorT& functor, P1 p1, P2 p2)
305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : functor_(functor),
306f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2) {}
308f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
309f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return functor_(p1_, p2_); }
310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  FunctorT functor_;
3125d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
3135d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2)
318f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
319f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
320f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
321f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2>
322f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2>
323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), ObjectT* object,
324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2) {
326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2>(
327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2);
328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2) const
332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
333f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
334f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
335f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2>
336f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor2<const ObjectT, FP_T(NONAME), R, P1, P2>
337f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), const ObjectT* object,
338f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2) {
340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor2<const ObjectT, FP_T(NONAME), R, P1, P2>(
341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2);
342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
345d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)(P1, P2)
346d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
347d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R,
348d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P1,
349d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P2>
350d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2>
351d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object,
352d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P1>::type p1,
353d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P2>::type p2) {
354d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor2<ObjectT, FP_T(NONAME), R, P1, P2>(
355d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get(), p1, p2);
356d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
357d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
358d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (*x)(P1, P2)
360f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
361f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R,
362f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
363f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2>
364f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgFunctor2<FP_T(NONAME), R, P1, P2>
365f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(function),
366f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
367f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2) {
368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return Functor2<FP_T(NONAME), R, P1, P2>(
369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      function, p1, p2);
370f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
371f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
372f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
373f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
374f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class MethodT, class R,
375f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
376f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
377f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3>
378f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass MethodFunctor3 {
379f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
380f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodFunctor3(MethodT method, ObjectT* object,
381f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P1 p1,
382f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P2 p2,
383f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P3 p3)
384f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : method_(method), object_(object),
385f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2),
387f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p3_(p3) {}
388f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
389f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (object_->*method_)(p1_, p2_, p3_); }
390f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
391f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodT method_;
392d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
3935d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
3945d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
3955d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
396f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
397f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
398f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class FunctorT, class R,
399f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
400f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
401f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3>
402f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Functor3 {
403f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
404f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Functor3(const FunctorT& functor, P1 p1, P2 p2, P3 p3)
405f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : functor_(functor),
406f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
407f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2),
408f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p3_(p3) {}
409f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
410f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return functor_(p1_, p2_, p3_); }
411f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
412f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  FunctorT functor_;
4135d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
4145d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
4155d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
416f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
417f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
418f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
419f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2, P3)
420f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
421f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
422f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
423f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
424f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3>
425f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3>
426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), ObjectT* object,
427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3) {
430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3>(
431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2, p3);
432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2, P3) const
436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3>
441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor3<const ObjectT, FP_T(NONAME), R, P1, P2, P3>
442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), const ObjectT* object,
443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3) {
446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor3<const ObjectT, FP_T(NONAME), R, P1, P2, P3>(
447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2, p3);
448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
451d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)(P1, P2, P3)
452d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
453d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R,
454d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P1,
455d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P2,
456d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P3>
457d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3>
458d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object,
459d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P1>::type p1,
460d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P2>::type p2,
461d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P3>::type p3) {
462d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor3<ObjectT, FP_T(NONAME), R, P1, P2, P3>(
463d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get(), p1, p2, p3);
464d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
465d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
466d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
467f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (*x)(P1, P2, P3)
468f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
469f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R,
470f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
471f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
472f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3>
473f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgFunctor3<FP_T(NONAME), R, P1, P2, P3>
474f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(function),
475f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
476f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
477f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3) {
478f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return Functor3<FP_T(NONAME), R, P1, P2, P3>(
479f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      function, p1, p2, p3);
480f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
481f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
482f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
483f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
484f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class MethodT, class R,
485f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
486f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
487f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
488f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4>
489f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass MethodFunctor4 {
490f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
491f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodFunctor4(MethodT method, ObjectT* object,
492f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P1 p1,
493f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P2 p2,
494f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P3 p3,
495f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P4 p4)
496f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : method_(method), object_(object),
497f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
498f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2),
499f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p3_(p3),
500f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p4_(p4) {}
501f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
502f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (object_->*method_)(p1_, p2_, p3_, p4_); }
503f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
504f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodT method_;
505d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
5065d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
5075d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
5085d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
5095d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
510f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
511f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
512f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class FunctorT, class R,
513f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
514f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
515f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
516f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4>
517f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Functor4 {
518f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
519f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Functor4(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4)
520f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : functor_(functor),
521f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
522f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2),
523f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p3_(p3),
524f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p4_(p4) {}
525f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
526f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return functor_(p1_, p2_, p3_, p4_); }
527f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
528f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  FunctorT functor_;
5295d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
5305d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
5315d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
5325d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
533f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
534f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
535f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
536f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4)
537f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
538f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
539f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
540f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
541f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
542f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4>
543f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>
544f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), ObjectT* object,
545f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
546f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
547f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3,
548f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P4>::type p4) {
549f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>(
550f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2, p3, p4);
551f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
552f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
553f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
554f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4) const
555f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
556f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
557f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
558f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
559f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
560f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4>
561f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor4<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>
562f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), const ObjectT* object,
563f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
564f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
565f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3,
566f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P4>::type p4) {
567f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor4<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>(
568f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2, p3, p4);
569f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
570f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
571f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
572d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4)
573d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
574d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R,
575d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P1,
576d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P2,
577d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P3,
578d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P4>
579d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>
580d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object,
581d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P1>::type p1,
582d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P2>::type p2,
583d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P3>::type p3,
584d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P4>::type p4) {
585d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor4<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4>(
586d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get(), p1, p2, p3, p4);
587d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
588d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
589d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
590f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (*x)(P1, P2, P3, P4)
591f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
592f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R,
593f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
594f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
595f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
596f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4>
597f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgFunctor4<FP_T(NONAME), R, P1, P2, P3, P4>
598f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(function),
599f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
600f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
601f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3,
602f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P4>::type p4) {
603f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return Functor4<FP_T(NONAME), R, P1, P2, P3, P4>(
604f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      function, p1, p2, p3, p4);
605f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
606f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
607f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
608f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
609f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class MethodT, class R,
610f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
611f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
612f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
613f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4,
614f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P5>
615f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass MethodFunctor5 {
616f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
617f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodFunctor5(MethodT method, ObjectT* object,
618f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P1 p1,
619f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P2 p2,
620f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P3 p3,
621f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P4 p4,
622f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                 P5 p5)
623f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : method_(method), object_(object),
624f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
625f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2),
626f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p3_(p3),
627f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p4_(p4),
628f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p5_(p5) {}
629f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
630f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (object_->*method_)(p1_, p2_, p3_, p4_, p5_); }
631f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
632f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MethodT method_;
633d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
6345d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
6355d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
6365d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
6375d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
6385d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
639f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
640f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
641f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class FunctorT, class R,
642f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
643f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
644f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
645f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4,
646f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P5>
647f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Functor5 {
648f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
649f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Functor5(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
650f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      : functor_(functor),
651f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p1_(p1),
652f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p2_(p2),
653f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p3_(p3),
654f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p4_(p4),
655f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      p5_(p5) {}
656f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  R operator()() const {
657f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return functor_(p1_, p2_, p3_, p4_, p5_); }
658f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
659f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  FunctorT functor_;
6605d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
6615d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
6625d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
6635d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
6645d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
665f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
666f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
667f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
668f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5)
669f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
670f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
671f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
672f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
673f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
674f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4,
675f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P5>
676f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>
677f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), ObjectT* object,
678f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
679f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
680f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3,
681f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P4>::type p4,
682f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P5>::type p5) {
683f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>(
684f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2, p3, p4, p5);
685f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
686f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
687f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
688f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5) const
689f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
690f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class ObjectT, class R,
691f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
692f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
693f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
694f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4,
695f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P5>
696f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgMethodFunctor5<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>
697f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(method), const ObjectT* object,
698f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
699f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
700f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3,
701f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P4>::type p4,
702f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P5>::type p5) {
703f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return MethodFunctor5<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>(
704f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      method, object, p1, p2, p3, p4, p5);
705f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
706f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
707f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
708d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5)
709d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
710d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R,
711d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P1,
712d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P2,
713d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P3,
714d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P4,
715d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P5>
716d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>
717d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object,
718d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P1>::type p1,
719d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P2>::type p2,
720d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P3>::type p3,
721d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P4>::type p4,
722d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P5>::type p5) {
723d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor5<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5>(
724d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get(), p1, p2, p3, p4, p5);
725d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
726d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
727d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
728f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FP_T(x) R (*x)(P1, P2, P3, P4, P5)
729f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
730f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R,
731f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P1,
732f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P2,
733f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P3,
734f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P4,
735f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          class P5>
736f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgFunctor5<FP_T(NONAME), R, P1, P2, P3, P4, P5>
737f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgBind(FP_T(function),
738f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P1>::type p1,
739f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P2>::type p2,
740f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P3>::type p3,
741f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P4>::type p4,
742f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org     typename detail::identity<P5>::type p5) {
743f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return Functor5<FP_T(NONAME), R, P1, P2, P3, P4, P5>(
744f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      function, p1, p2, p3, p4, p5);
745f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
746f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
747f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef FP_T
748c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg
749c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenbergtemplate <class ObjectT, class MethodT, class R,
7505d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P1,
7515d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P2,
7525d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P3,
7535d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P4,
7545d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P5,
7555d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P6>
7565d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusicclass MethodFunctor6 {
7575d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic public:
758c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg  MethodFunctor6(MethodT method, ObjectT* object,
7595d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic                 P1 p1,
7605d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic                 P2 p2,
7615d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic                 P3 p3,
7625d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic                 P4 p4,
7635d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic                 P5 p5,
7645d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic                 P6 p6)
765c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      : method_(method), object_(object),
766c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p1_(p1),
767c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p2_(p2),
768c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p3_(p3),
769c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p4_(p4),
770c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p5_(p5),
771c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p6_(p6) {}
7725d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic  R operator()() const {
773c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg    return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_); }
7745d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic private:
7755d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic  MethodT method_;
776d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  typename detail::PointerType<ObjectT>::type object_;
7775d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
7785d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
7795d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
7805d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
7815d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
7825d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
7835d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic};
7845d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
785c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenbergtemplate <class FunctorT, class R,
7865d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P1,
7875d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P2,
7885d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P3,
7895d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P4,
7905d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P5,
7915d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P6>
7925d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusicclass Functor6 {
7935d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic public:
7945d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic  Functor6(const FunctorT& functor, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
7955d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic      : functor_(functor),
796c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p1_(p1),
797c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p2_(p2),
798c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p3_(p3),
799c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p4_(p4),
800c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p5_(p5),
801c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      p6_(p6) {}
802c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg  R operator()() const {
803c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg    return functor_(p1_, p2_, p3_, p4_, p5_, p6_); }
8045d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic private:
8055d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic  FunctorT functor_;
8065d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
8075d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
8085d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
8095d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
8105d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
8115d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
8125d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic};
8135d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
814c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg
8155d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6)
8165d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
817c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenbergtemplate <class ObjectT, class R,
8185d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P1,
8195d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P2,
8205d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P3,
8215d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P4,
8225d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P5,
8235d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P6>
824c937139176027b75a3d0c3fbc9343c257b6244adFredrik SolenbergMethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>
825c937139176027b75a3d0c3fbc9343c257b6244adFredrik SolenbergBind(FP_T(method), ObjectT* object,
826c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P1>::type p1,
827c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P2>::type p2,
828c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P3>::type p3,
829c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P4>::type p4,
830c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P5>::type p5,
831c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P6>::type p6) {
8325d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic  return MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(
8335d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic      method, object, p1, p2, p3, p4, p5, p6);
8345d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic}
8355d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
8365d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic#undef FP_T
8375d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6) const
8385d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
839c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenbergtemplate <class ObjectT, class R,
8405d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P1,
8415d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P2,
8425d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P3,
8435d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P4,
8445d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P5,
8455d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic          class P6>
846c937139176027b75a3d0c3fbc9343c257b6244adFredrik SolenbergMethodFunctor6<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>
847c937139176027b75a3d0c3fbc9343c257b6244adFredrik SolenbergBind(FP_T(method), const ObjectT* object,
848c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P1>::type p1,
849c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P2>::type p2,
850c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P3>::type p3,
851c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P4>::type p4,
852c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P5>::type p5,
853c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P6>::type p6) {
8545d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic  return MethodFunctor6<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(
8555d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic      method, object, p1, p2, p3, p4, p5, p6);
8565d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic}
8575d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
8585d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic#undef FP_T
859d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6)
860d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
861d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedverttemplate <class ObjectT, class R,
862d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P1,
863d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P2,
864d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P3,
865d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P4,
866d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P5,
867d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert          class P6>
868d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertMethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>
869d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus JedvertBind(FP_T(method), const scoped_refptr<ObjectT>& object,
870d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P1>::type p1,
871d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P2>::type p2,
872d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P3>::type p3,
873d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P4>::type p4,
874d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P5>::type p5,
875d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert     typename detail::identity<P6>::type p6) {
876d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert  return MethodFunctor6<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(
877d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert      method, object.get(), p1, p2, p3, p4, p5, p6);
878d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert}
879d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert
880d3de9c548d1121e7c4787a4b81fd66be714abc04Magnus Jedvert#undef FP_T
8815d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6)
8825d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
883c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenbergtemplate <class R,
884c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg          class P1,
885c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg          class P2,
886c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg          class P3,
887c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg          class P4,
888c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg          class P5,
889c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg          class P6>
890c937139176027b75a3d0c3fbc9343c257b6244adFredrik SolenbergFunctor6<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>
891c937139176027b75a3d0c3fbc9343c257b6244adFredrik SolenbergBind(FP_T(function),
892c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P1>::type p1,
893c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P2>::type p2,
894c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P3>::type p3,
895c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P4>::type p4,
896c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P5>::type p5,
897c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg     typename detail::identity<P6>::type p6) {
898c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg  return Functor6<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6>(
899c937139176027b75a3d0c3fbc9343c257b6244adFredrik Solenberg      function, p1, p2, p3, p4, p5, p6);
9005d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic}
9015d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic
9025d6e58e76e7750a86eed2da8f0c2b62b58d8356bJelena Marusic#undef FP_T
903f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
9045d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
9055d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class MethodT,
9065d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
9075d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
9085d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
9095d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
9105d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
9115d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
9125d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
9135d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7>
9145d9b92b53daf4db78fd090be4e210e07f786120dnoahricclass MethodFunctor7 {
9155d9b92b53daf4db78fd090be4e210e07f786120dnoahric public:
9165d9b92b53daf4db78fd090be4e210e07f786120dnoahric  MethodFunctor7(MethodT method,
9175d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 ObjectT* object,
9185d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P1 p1,
9195d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P2 p2,
9205d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P3 p3,
9215d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P4 p4,
9225d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P5 p5,
9235d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P6 p6,
9245d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P7 p7)
9255d9b92b53daf4db78fd090be4e210e07f786120dnoahric      : method_(method),
9265d9b92b53daf4db78fd090be4e210e07f786120dnoahric        object_(object),
9275d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p1_(p1),
9285d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p2_(p2),
9295d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p3_(p3),
9305d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p4_(p4),
9315d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p5_(p5),
9325d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p6_(p6),
9335d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p7_(p7) {}
9345d9b92b53daf4db78fd090be4e210e07f786120dnoahric  R operator()() const {
9355d9b92b53daf4db78fd090be4e210e07f786120dnoahric    return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_);
9365d9b92b53daf4db78fd090be4e210e07f786120dnoahric  }
9375d9b92b53daf4db78fd090be4e210e07f786120dnoahric
9385d9b92b53daf4db78fd090be4e210e07f786120dnoahric private:
9395d9b92b53daf4db78fd090be4e210e07f786120dnoahric  MethodT method_;
9405d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename detail::PointerType<ObjectT>::type object_;
9415d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
9425d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
9435d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
9445d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
9455d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
9465d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
9475d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P7>::type p7_;
9485d9b92b53daf4db78fd090be4e210e07f786120dnoahric};
9495d9b92b53daf4db78fd090be4e210e07f786120dnoahric
9505d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class FunctorT,
9515d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
9525d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
9535d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
9545d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
9555d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
9565d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
9575d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
9585d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7>
9595d9b92b53daf4db78fd090be4e210e07f786120dnoahricclass Functor7 {
9605d9b92b53daf4db78fd090be4e210e07f786120dnoahric public:
9615d9b92b53daf4db78fd090be4e210e07f786120dnoahric  Functor7(const FunctorT& functor,
9625d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P1 p1,
9635d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P2 p2,
9645d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P3 p3,
9655d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P4 p4,
9665d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P5 p5,
9675d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P6 p6,
9685d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P7 p7)
9695d9b92b53daf4db78fd090be4e210e07f786120dnoahric      : functor_(functor),
9705d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p1_(p1),
9715d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p2_(p2),
9725d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p3_(p3),
9735d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p4_(p4),
9745d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p5_(p5),
9755d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p6_(p6),
9765d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p7_(p7) {}
9775d9b92b53daf4db78fd090be4e210e07f786120dnoahric  R operator()() const { return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_); }
9785d9b92b53daf4db78fd090be4e210e07f786120dnoahric
9795d9b92b53daf4db78fd090be4e210e07f786120dnoahric private:
9805d9b92b53daf4db78fd090be4e210e07f786120dnoahric  FunctorT functor_;
9815d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
9825d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
9835d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
9845d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
9855d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
9865d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
9875d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P7>::type p7_;
9885d9b92b53daf4db78fd090be4e210e07f786120dnoahric};
9895d9b92b53daf4db78fd090be4e210e07f786120dnoahric
9905d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7)
9915d9b92b53daf4db78fd090be4e210e07f786120dnoahric
9925d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
9935d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
9945d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
9955d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
9965d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
9975d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
9985d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
9995d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
10005d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7>
10015d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
10025d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(method),
10035d9b92b53daf4db78fd090be4e210e07f786120dnoahric    ObjectT* object,
10045d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
10055d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
10065d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
10075d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
10085d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
10095d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
10105d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7) {
10115d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>(
10125d9b92b53daf4db78fd090be4e210e07f786120dnoahric      method, object, p1, p2, p3, p4, p5, p6, p7);
10135d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
10145d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10155d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
10165d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7) const
10175d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10185d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
10195d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
10205d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
10215d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
10225d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
10235d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
10245d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
10255d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
10265d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7>
10275d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor7<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
10285d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(method),
10295d9b92b53daf4db78fd090be4e210e07f786120dnoahric    const ObjectT* object,
10305d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
10315d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
10325d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
10335d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
10345d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
10355d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
10365d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7) {
10375d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor7<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6,
10385d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P7>(method, object, p1, p2, p3, p4, p5, p6, p7);
10395d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
10405d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10415d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
10425d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7)
10435d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10445d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
10455d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
10465d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
10475d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
10485d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
10495d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
10505d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
10515d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
10525d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7>
10535d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
10545d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(method),
10555d9b92b53daf4db78fd090be4e210e07f786120dnoahric    const scoped_refptr<ObjectT>& object,
10565d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
10575d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
10585d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
10595d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
10605d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
10615d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
10625d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7) {
10635d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>(
10645d9b92b53daf4db78fd090be4e210e07f786120dnoahric      method, object.get(), p1, p2, p3, p4, p5, p6, p7);
10655d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
10665d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10675d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
10685d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7)
10695d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10705d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class R,
10715d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
10725d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
10735d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
10745d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
10755d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
10765d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
10775d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7>
10785d9b92b53daf4db78fd090be4e210e07f786120dnoahricFunctor7<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
10795d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(function),
10805d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
10815d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
10825d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
10835d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
10845d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
10855d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
10865d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7) {
10875d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return Functor7<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>(
10885d9b92b53daf4db78fd090be4e210e07f786120dnoahric      function, p1, p2, p3, p4, p5, p6, p7);
10895d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
10905d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10915d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
10925d9b92b53daf4db78fd090be4e210e07f786120dnoahric
10935d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
10945d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class MethodT,
10955d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
10965d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
10975d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
10985d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
10995d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
11005d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
11015d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
11025d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
11035d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8>
11045d9b92b53daf4db78fd090be4e210e07f786120dnoahricclass MethodFunctor8 {
11055d9b92b53daf4db78fd090be4e210e07f786120dnoahric public:
11065d9b92b53daf4db78fd090be4e210e07f786120dnoahric  MethodFunctor8(MethodT method,
11075d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 ObjectT* object,
11085d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P1 p1,
11095d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P2 p2,
11105d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P3 p3,
11115d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P4 p4,
11125d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P5 p5,
11135d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P6 p6,
11145d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P7 p7,
11155d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P8 p8)
11165d9b92b53daf4db78fd090be4e210e07f786120dnoahric      : method_(method),
11175d9b92b53daf4db78fd090be4e210e07f786120dnoahric        object_(object),
11185d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p1_(p1),
11195d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p2_(p2),
11205d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p3_(p3),
11215d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p4_(p4),
11225d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p5_(p5),
11235d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p6_(p6),
11245d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p7_(p7),
11255d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p8_(p8) {}
11265d9b92b53daf4db78fd090be4e210e07f786120dnoahric  R operator()() const {
11275d9b92b53daf4db78fd090be4e210e07f786120dnoahric    return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
11285d9b92b53daf4db78fd090be4e210e07f786120dnoahric  }
11295d9b92b53daf4db78fd090be4e210e07f786120dnoahric
11305d9b92b53daf4db78fd090be4e210e07f786120dnoahric private:
11315d9b92b53daf4db78fd090be4e210e07f786120dnoahric  MethodT method_;
11325d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename detail::PointerType<ObjectT>::type object_;
11335d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
11345d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
11355d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
11365d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
11375d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
11385d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
11395d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P7>::type p7_;
11405d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P8>::type p8_;
11415d9b92b53daf4db78fd090be4e210e07f786120dnoahric};
11425d9b92b53daf4db78fd090be4e210e07f786120dnoahric
11435d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class FunctorT,
11445d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
11455d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
11465d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
11475d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
11485d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
11495d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
11505d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
11515d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
11525d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8>
11535d9b92b53daf4db78fd090be4e210e07f786120dnoahricclass Functor8 {
11545d9b92b53daf4db78fd090be4e210e07f786120dnoahric public:
11555d9b92b53daf4db78fd090be4e210e07f786120dnoahric  Functor8(const FunctorT& functor,
11565d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P1 p1,
11575d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P2 p2,
11585d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P3 p3,
11595d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P4 p4,
11605d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P5 p5,
11615d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P6 p6,
11625d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P7 p7,
11635d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P8 p8)
11645d9b92b53daf4db78fd090be4e210e07f786120dnoahric      : functor_(functor),
11655d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p1_(p1),
11665d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p2_(p2),
11675d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p3_(p3),
11685d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p4_(p4),
11695d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p5_(p5),
11705d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p6_(p6),
11715d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p7_(p7),
11725d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p8_(p8) {}
11735d9b92b53daf4db78fd090be4e210e07f786120dnoahric  R operator()() const {
11745d9b92b53daf4db78fd090be4e210e07f786120dnoahric    return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
11755d9b92b53daf4db78fd090be4e210e07f786120dnoahric  }
11765d9b92b53daf4db78fd090be4e210e07f786120dnoahric
11775d9b92b53daf4db78fd090be4e210e07f786120dnoahric private:
11785d9b92b53daf4db78fd090be4e210e07f786120dnoahric  FunctorT functor_;
11795d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
11805d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
11815d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
11825d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
11835d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
11845d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
11855d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P7>::type p7_;
11865d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P8>::type p8_;
11875d9b92b53daf4db78fd090be4e210e07f786120dnoahric};
11885d9b92b53daf4db78fd090be4e210e07f786120dnoahric
11895d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8)
11905d9b92b53daf4db78fd090be4e210e07f786120dnoahric
11915d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
11925d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
11935d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
11945d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
11955d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
11965d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
11975d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
11985d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
11995d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
12005d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8>
12015d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind(
12025d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(method),
12035d9b92b53daf4db78fd090be4e210e07f786120dnoahric    ObjectT* object,
12045d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
12055d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
12065d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
12075d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
12085d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
12095d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
12105d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7,
12115d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P8>::type p8) {
12125d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
12135d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P8>(method, object, p1, p2, p3, p4, p5, p6, p7, p8);
12145d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
12155d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12165d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
12175d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8) const
12185d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12195d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
12205d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
12215d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
12225d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
12235d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
12245d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
12255d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
12265d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
12275d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
12285d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8>
12295d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor8<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8>
12305d9b92b53daf4db78fd090be4e210e07f786120dnoahricBind(FP_T(method),
12315d9b92b53daf4db78fd090be4e210e07f786120dnoahric     const ObjectT* object,
12325d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P1>::type p1,
12335d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P2>::type p2,
12345d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P3>::type p3,
12355d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P4>::type p4,
12365d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P5>::type p5,
12375d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P6>::type p6,
12385d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P7>::type p7,
12395d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P8>::type p8) {
12405d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor8<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6,
12415d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P7, P8>(method, object, p1, p2, p3, p4, p5, p6, p7, p8);
12425d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
12435d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12445d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
12455d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8)
12465d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12475d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
12485d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
12495d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
12505d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
12515d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
12525d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
12535d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
12545d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
12555d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
12565d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8>
12575d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind(
12585d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(method),
12595d9b92b53daf4db78fd090be4e210e07f786120dnoahric    const scoped_refptr<ObjectT>& object,
12605d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
12615d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
12625d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
12635d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
12645d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
12655d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
12665d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7,
12675d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P8>::type p8) {
12685d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
12695d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P8>(method, object.get(), p1, p2, p3, p4, p5, p6, p7,
12705d9b92b53daf4db78fd090be4e210e07f786120dnoahric                            p8);
12715d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
12725d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12735d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
12745d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7, P8)
12755d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12765d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class R,
12775d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
12785d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
12795d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
12805d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
12815d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
12825d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
12835d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
12845d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8>
12855d9b92b53daf4db78fd090be4e210e07f786120dnoahricFunctor8<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind(
12865d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(function),
12875d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
12885d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
12895d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
12905d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
12915d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
12925d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
12935d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7,
12945d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P8>::type p8) {
12955d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return Functor8<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8>(
12965d9b92b53daf4db78fd090be4e210e07f786120dnoahric      function, p1, p2, p3, p4, p5, p6, p7, p8);
12975d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
12985d9b92b53daf4db78fd090be4e210e07f786120dnoahric
12995d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
13005d9b92b53daf4db78fd090be4e210e07f786120dnoahric
13015d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
13025d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class MethodT,
13035d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
13045d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
13055d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
13065d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
13075d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
13085d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
13095d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
13105d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
13115d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8,
13125d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P9>
13135d9b92b53daf4db78fd090be4e210e07f786120dnoahricclass MethodFunctor9 {
13145d9b92b53daf4db78fd090be4e210e07f786120dnoahric public:
13155d9b92b53daf4db78fd090be4e210e07f786120dnoahric  MethodFunctor9(MethodT method,
13165d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 ObjectT* object,
13175d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P1 p1,
13185d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P2 p2,
13195d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P3 p3,
13205d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P4 p4,
13215d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P5 p5,
13225d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P6 p6,
13235d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P7 p7,
13245d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P8 p8,
13255d9b92b53daf4db78fd090be4e210e07f786120dnoahric                 P9 p9)
13265d9b92b53daf4db78fd090be4e210e07f786120dnoahric      : method_(method),
13275d9b92b53daf4db78fd090be4e210e07f786120dnoahric        object_(object),
13285d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p1_(p1),
13295d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p2_(p2),
13305d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p3_(p3),
13315d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p4_(p4),
13325d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p5_(p5),
13335d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p6_(p6),
13345d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p7_(p7),
13355d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p8_(p8),
13365d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p9_(p9) {}
13375d9b92b53daf4db78fd090be4e210e07f786120dnoahric  R operator()() const {
13385d9b92b53daf4db78fd090be4e210e07f786120dnoahric    return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_);
13395d9b92b53daf4db78fd090be4e210e07f786120dnoahric  }
13405d9b92b53daf4db78fd090be4e210e07f786120dnoahric
13415d9b92b53daf4db78fd090be4e210e07f786120dnoahric private:
13425d9b92b53daf4db78fd090be4e210e07f786120dnoahric  MethodT method_;
13435d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename detail::PointerType<ObjectT>::type object_;
13445d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
13455d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
13465d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
13475d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
13485d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
13495d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
13505d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P7>::type p7_;
13515d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P8>::type p8_;
13525d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P9>::type p9_;
13535d9b92b53daf4db78fd090be4e210e07f786120dnoahric};
13545d9b92b53daf4db78fd090be4e210e07f786120dnoahric
13555d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class FunctorT,
13565d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
13575d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
13585d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
13595d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
13605d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
13615d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
13625d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
13635d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
13645d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8,
13655d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P9>
13665d9b92b53daf4db78fd090be4e210e07f786120dnoahricclass Functor9 {
13675d9b92b53daf4db78fd090be4e210e07f786120dnoahric public:
13685d9b92b53daf4db78fd090be4e210e07f786120dnoahric  Functor9(const FunctorT& functor,
13695d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P1 p1,
13705d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P2 p2,
13715d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P3 p3,
13725d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P4 p4,
13735d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P5 p5,
13745d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P6 p6,
13755d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P7 p7,
13765d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P8 p8,
13775d9b92b53daf4db78fd090be4e210e07f786120dnoahric           P9 p9)
13785d9b92b53daf4db78fd090be4e210e07f786120dnoahric      : functor_(functor),
13795d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p1_(p1),
13805d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p2_(p2),
13815d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p3_(p3),
13825d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p4_(p4),
13835d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p5_(p5),
13845d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p6_(p6),
13855d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p7_(p7),
13865d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p8_(p8),
13875d9b92b53daf4db78fd090be4e210e07f786120dnoahric        p9_(p9) {}
13885d9b92b53daf4db78fd090be4e210e07f786120dnoahric  R operator()() const {
13895d9b92b53daf4db78fd090be4e210e07f786120dnoahric    return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_);
13905d9b92b53daf4db78fd090be4e210e07f786120dnoahric  }
13915d9b92b53daf4db78fd090be4e210e07f786120dnoahric
13925d9b92b53daf4db78fd090be4e210e07f786120dnoahric private:
13935d9b92b53daf4db78fd090be4e210e07f786120dnoahric  FunctorT functor_;
13945d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P1>::type p1_;
13955d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P2>::type p2_;
13965d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P3>::type p3_;
13975d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P4>::type p4_;
13985d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P5>::type p5_;
13995d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P6>::type p6_;
14005d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P7>::type p7_;
14015d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P8>::type p8_;
14025d9b92b53daf4db78fd090be4e210e07f786120dnoahric  typename rtc::remove_reference<P9>::type p9_;
14035d9b92b53daf4db78fd090be4e210e07f786120dnoahric};
14045d9b92b53daf4db78fd090be4e210e07f786120dnoahric
14055d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9)
14065d9b92b53daf4db78fd090be4e210e07f786120dnoahric
14075d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
14085d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
14095d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
14105d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
14115d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
14125d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
14135d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
14145d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
14155d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
14165d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8,
14175d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P9>
14185d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>
14195d9b92b53daf4db78fd090be4e210e07f786120dnoahricBind(FP_T(method),
14205d9b92b53daf4db78fd090be4e210e07f786120dnoahric     ObjectT* object,
14215d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P1>::type p1,
14225d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P2>::type p2,
14235d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P3>::type p3,
14245d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P4>::type p4,
14255d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P5>::type p5,
14265d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P6>::type p6,
14275d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P7>::type p7,
14285d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P8>::type p8,
14295d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P9>::type p9) {
14305d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
14315d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P8, P9>(method, object, p1, p2, p3, p4, p5, p6, p7, p8,
14325d9b92b53daf4db78fd090be4e210e07f786120dnoahric                                p9);
14335d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
14345d9b92b53daf4db78fd090be4e210e07f786120dnoahric
14355d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
14365d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9) const
14375d9b92b53daf4db78fd090be4e210e07f786120dnoahric
14385d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
14395d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
14405d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
14415d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
14425d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
14435d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
14445d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
14455d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
14465d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
14475d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8,
14485d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P9>
14495d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor9<const ObjectT,
14505d9b92b53daf4db78fd090be4e210e07f786120dnoahric               FP_T(NONAME),
14515d9b92b53daf4db78fd090be4e210e07f786120dnoahric               R,
14525d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P1,
14535d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P2,
14545d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P3,
14555d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P4,
14565d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P5,
14575d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P6,
14585d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P7,
14595d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P8,
14605d9b92b53daf4db78fd090be4e210e07f786120dnoahric               P9>
14615d9b92b53daf4db78fd090be4e210e07f786120dnoahricBind(FP_T(method),
14625d9b92b53daf4db78fd090be4e210e07f786120dnoahric     const ObjectT* object,
14635d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P1>::type p1,
14645d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P2>::type p2,
14655d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P3>::type p3,
14665d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P4>::type p4,
14675d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P5>::type p5,
14685d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P6>::type p6,
14695d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P7>::type p7,
14705d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P8>::type p8,
14715d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P9>::type p9) {
14725d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor9<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6,
14735d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P7, P8, P9>(method, object, p1, p2, p3, p4, p5, p6, p7,
14745d9b92b53daf4db78fd090be4e210e07f786120dnoahric                                    p8, p9);
14755d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
14765d9b92b53daf4db78fd090be4e210e07f786120dnoahric
14775d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
14785d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9)
14795d9b92b53daf4db78fd090be4e210e07f786120dnoahric
14805d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class ObjectT,
14815d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class R,
14825d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
14835d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
14845d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
14855d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
14865d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
14875d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
14885d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
14895d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8,
14905d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P9>
14915d9b92b53daf4db78fd090be4e210e07f786120dnoahricMethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>
14925d9b92b53daf4db78fd090be4e210e07f786120dnoahricBind(FP_T(method),
14935d9b92b53daf4db78fd090be4e210e07f786120dnoahric     const scoped_refptr<ObjectT>& object,
14945d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P1>::type p1,
14955d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P2>::type p2,
14965d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P3>::type p3,
14975d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P4>::type p4,
14985d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P5>::type p5,
14995d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P6>::type p6,
15005d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P7>::type p7,
15015d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P8>::type p8,
15025d9b92b53daf4db78fd090be4e210e07f786120dnoahric     typename detail::identity<P9>::type p9) {
15035d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
15045d9b92b53daf4db78fd090be4e210e07f786120dnoahric                        P8, P9>(method, object.get(), p1, p2, p3, p4, p5, p6,
15055d9b92b53daf4db78fd090be4e210e07f786120dnoahric                                p7, p8, p9);
15065d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
15075d9b92b53daf4db78fd090be4e210e07f786120dnoahric
15085d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
15095d9b92b53daf4db78fd090be4e210e07f786120dnoahric#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9)
15105d9b92b53daf4db78fd090be4e210e07f786120dnoahric
15115d9b92b53daf4db78fd090be4e210e07f786120dnoahrictemplate <class R,
15125d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P1,
15135d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P2,
15145d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P3,
15155d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P4,
15165d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P5,
15175d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P6,
15185d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P7,
15195d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P8,
15205d9b92b53daf4db78fd090be4e210e07f786120dnoahric          class P9>
15215d9b92b53daf4db78fd090be4e210e07f786120dnoahricFunctor9<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9> Bind(
15225d9b92b53daf4db78fd090be4e210e07f786120dnoahric    FP_T(function),
15235d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P1>::type p1,
15245d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P2>::type p2,
15255d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P3>::type p3,
15265d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P4>::type p4,
15275d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P5>::type p5,
15285d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P6>::type p6,
15295d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P7>::type p7,
15305d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P8>::type p8,
15315d9b92b53daf4db78fd090be4e210e07f786120dnoahric    typename detail::identity<P9>::type p9) {
15325d9b92b53daf4db78fd090be4e210e07f786120dnoahric  return Functor9<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>(
15335d9b92b53daf4db78fd090be4e210e07f786120dnoahric      function, p1, p2, p3, p4, p5, p6, p7, p8, p9);
15345d9b92b53daf4db78fd090be4e210e07f786120dnoahric}
15355d9b92b53daf4db78fd090be4e210e07f786120dnoahric
15365d9b92b53daf4db78fd090be4e210e07f786120dnoahric#undef FP_T
15375d9b92b53daf4db78fd090be4e210e07f786120dnoahric
1538f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
1539f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1540f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#undef NONAME
1541f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1542f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif  // WEBRTC_BASE_BIND_H_
1543