Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(565)

Unified Diff: webrtc/base/bind.h

Issue 1291543006: Update Bind to match its comments and always capture by value. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: CR comments, undid android encoder/decoder change Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/base/bind.h
diff --git a/webrtc/base/bind.h b/webrtc/base/bind.h
index 923fda21b559f276a90a3504f7045de38f08289d..b50afc21acce94d8a4fc408d2dad5111adadc5b3 100644
--- a/webrtc/base/bind.h
+++ b/webrtc/base/bind.h
@@ -65,6 +65,7 @@
#define WEBRTC_BASE_BIND_H_
#include "webrtc/base/scoped_ref_ptr.h"
+#include "webrtc/base/template_util.h"
#define NONAME
@@ -128,18 +129,6 @@ struct PointerType {
T*>::type type;
};
-// RemoveScopedPtrRef will capture scoped_refptr by-value instead of
-// by-reference.
-template <class T> struct RemoveScopedPtrRef { typedef T type; };
-template <class T>
-struct RemoveScopedPtrRef<const scoped_refptr<T>&> {
- typedef scoped_refptr<T> type;
-};
-template <class T>
-struct RemoveScopedPtrRef<scoped_refptr<T>&> {
- typedef scoped_refptr<T> type;
-};
-
} // namespace detail
template <class ObjectT, class MethodT, class R>
@@ -220,7 +209,7 @@ class MethodFunctor1 {
private:
MethodT method_;
typename detail::PointerType<ObjectT>::type object_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
+ typename rtc::remove_reference<P1>::type p1_;
};
template <class FunctorT, class R,
@@ -234,7 +223,7 @@ class Functor1 {
return functor_(p1_); }
private:
FunctorT functor_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
+ typename rtc::remove_reference<P1>::type p1_;
};
@@ -303,8 +292,8 @@ class MethodFunctor2 {
private:
MethodT method_;
typename detail::PointerType<ObjectT>::type object_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
};
template <class FunctorT, class R,
@@ -320,8 +309,8 @@ class Functor2 {
return functor_(p1_, p2_); }
private:
FunctorT functor_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
};
@@ -401,9 +390,9 @@ class MethodFunctor3 {
private:
MethodT method_;
typename detail::PointerType<ObjectT>::type object_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
};
template <class FunctorT, class R,
@@ -421,9 +410,9 @@ class Functor3 {
return functor_(p1_, p2_, p3_); }
private:
FunctorT functor_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
};
@@ -514,10 +503,10 @@ class MethodFunctor4 {
private:
MethodT method_;
typename detail::PointerType<ObjectT>::type object_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
- typename detail::RemoveScopedPtrRef<P4>::type p4_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
};
template <class FunctorT, class R,
@@ -537,10 +526,10 @@ class Functor4 {
return functor_(p1_, p2_, p3_, p4_); }
private:
FunctorT functor_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
- typename detail::RemoveScopedPtrRef<P4>::type p4_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
};
@@ -642,11 +631,11 @@ class MethodFunctor5 {
private:
MethodT method_;
typename detail::PointerType<ObjectT>::type object_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
- typename detail::RemoveScopedPtrRef<P4>::type p4_;
- typename detail::RemoveScopedPtrRef<P5>::type p5_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
};
template <class FunctorT, class R,
@@ -668,11 +657,11 @@ class Functor5 {
return functor_(p1_, p2_, p3_, p4_, p5_); }
private:
FunctorT functor_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
- typename detail::RemoveScopedPtrRef<P4>::type p4_;
- typename detail::RemoveScopedPtrRef<P5>::type p5_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
};
@@ -785,12 +774,12 @@ class MethodFunctor6 {
private:
MethodT method_;
typename detail::PointerType<ObjectT>::type object_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
- typename detail::RemoveScopedPtrRef<P4>::type p4_;
- typename detail::RemoveScopedPtrRef<P5>::type p5_;
- typename detail::RemoveScopedPtrRef<P6>::type p6_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
};
template <class FunctorT, class R,
@@ -814,12 +803,12 @@ class Functor6 {
return functor_(p1_, p2_, p3_, p4_, p5_, p6_); }
private:
FunctorT functor_;
- typename detail::RemoveScopedPtrRef<P1>::type p1_;
- typename detail::RemoveScopedPtrRef<P2>::type p2_;
- typename detail::RemoveScopedPtrRef<P3>::type p3_;
- typename detail::RemoveScopedPtrRef<P4>::type p4_;
- typename detail::RemoveScopedPtrRef<P5>::type p5_;
- typename detail::RemoveScopedPtrRef<P6>::type p6_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
};
@@ -912,6 +901,640 @@ Bind(FP_T(function),
#undef FP_T
+template <class ObjectT,
+ class MethodT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7>
+class MethodFunctor7 {
+ public:
+ MethodFunctor7(MethodT method,
+ ObjectT* object,
+ P1 p1,
+ P2 p2,
+ P3 p3,
+ P4 p4,
+ P5 p5,
+ P6 p6,
+ P7 p7)
+ : method_(method),
+ object_(object),
+ p1_(p1),
+ p2_(p2),
+ p3_(p3),
+ p4_(p4),
+ p5_(p5),
+ p6_(p6),
+ p7_(p7) {}
+ R operator()() const {
+ return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_);
+ }
+
+ private:
+ MethodT method_;
+ typename detail::PointerType<ObjectT>::type object_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
+ typename rtc::remove_reference<P7>::type p7_;
+};
+
+template <class FunctorT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7>
+class Functor7 {
+ public:
+ Functor7(const FunctorT& functor,
+ P1 p1,
+ P2 p2,
+ P3 p3,
+ P4 p4,
+ P5 p5,
+ P6 p6,
+ P7 p7)
+ : functor_(functor),
+ p1_(p1),
+ p2_(p2),
+ p3_(p3),
+ p4_(p4),
+ p5_(p5),
+ p6_(p6),
+ p7_(p7) {}
+ R operator()() const { return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_); }
+
+ private:
+ FunctorT functor_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
+ typename rtc::remove_reference<P7>::type p7_;
+};
+
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7)
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7>
+MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
+ FP_T(method),
+ ObjectT* object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7) {
+ return MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>(
+ method, object, p1, p2, p3, p4, p5, p6, p7);
+}
+
+#undef FP_T
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7) const
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7>
+MethodFunctor7<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
+ FP_T(method),
+ const ObjectT* object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7) {
+ return MethodFunctor7<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6,
+ P7>(method, object, p1, p2, p3, p4, p5, p6, p7);
+}
+
+#undef FP_T
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7)
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7>
+MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
+ FP_T(method),
+ const scoped_refptr<ObjectT>& object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7) {
+ return MethodFunctor7<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>(
+ method, object.get(), p1, p2, p3, p4, p5, p6, p7);
+}
+
+#undef FP_T
+#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7)
+
+template <class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7>
+Functor7<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7> Bind(
+ FP_T(function),
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7) {
+ return Functor7<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7>(
+ function, p1, p2, p3, p4, p5, p6, p7);
+}
+
+#undef FP_T
+
+template <class ObjectT,
+ class MethodT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8>
+class MethodFunctor8 {
+ public:
+ MethodFunctor8(MethodT method,
+ ObjectT* object,
+ P1 p1,
+ P2 p2,
+ P3 p3,
+ P4 p4,
+ P5 p5,
+ P6 p6,
+ P7 p7,
+ P8 p8)
+ : method_(method),
+ object_(object),
+ p1_(p1),
+ p2_(p2),
+ p3_(p3),
+ p4_(p4),
+ p5_(p5),
+ p6_(p6),
+ p7_(p7),
+ p8_(p8) {}
+ R operator()() const {
+ return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
+ }
+
+ private:
+ MethodT method_;
+ typename detail::PointerType<ObjectT>::type object_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
+ typename rtc::remove_reference<P7>::type p7_;
+ typename rtc::remove_reference<P8>::type p8_;
+};
+
+template <class FunctorT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8>
+class Functor8 {
+ public:
+ Functor8(const FunctorT& functor,
+ P1 p1,
+ P2 p2,
+ P3 p3,
+ P4 p4,
+ P5 p5,
+ P6 p6,
+ P7 p7,
+ P8 p8)
+ : functor_(functor),
+ p1_(p1),
+ p2_(p2),
+ p3_(p3),
+ p4_(p4),
+ p5_(p5),
+ p6_(p6),
+ p7_(p7),
+ p8_(p8) {}
+ R operator()() const {
+ return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
+ }
+
+ private:
+ FunctorT functor_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
+ typename rtc::remove_reference<P7>::type p7_;
+ typename rtc::remove_reference<P8>::type p8_;
+};
+
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8)
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8>
+MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind(
+ FP_T(method),
+ ObjectT* object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8) {
+ return MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
+ P8>(method, object, p1, p2, p3, p4, p5, p6, p7, p8);
+}
+
+#undef FP_T
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8) const
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8>
+MethodFunctor8<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8>
+Bind(FP_T(method),
+ const ObjectT* object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8) {
+ return MethodFunctor8<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6,
+ P7, P8>(method, object, p1, p2, p3, p4, p5, p6, p7, p8);
+}
+
+#undef FP_T
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8)
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8>
+MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind(
+ FP_T(method),
+ const scoped_refptr<ObjectT>& object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8) {
+ return MethodFunctor8<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
+ P8>(method, object.get(), p1, p2, p3, p4, p5, p6, p7,
+ p8);
+}
+
+#undef FP_T
+#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7, P8)
+
+template <class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8>
+Functor8<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8> Bind(
+ FP_T(function),
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8) {
+ return Functor8<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8>(
+ function, p1, p2, p3, p4, p5, p6, p7, p8);
+}
+
+#undef FP_T
+
+template <class ObjectT,
+ class MethodT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8,
+ class P9>
+class MethodFunctor9 {
+ public:
+ MethodFunctor9(MethodT method,
+ ObjectT* object,
+ P1 p1,
+ P2 p2,
+ P3 p3,
+ P4 p4,
+ P5 p5,
+ P6 p6,
+ P7 p7,
+ P8 p8,
+ P9 p9)
+ : method_(method),
+ object_(object),
+ p1_(p1),
+ p2_(p2),
+ p3_(p3),
+ p4_(p4),
+ p5_(p5),
+ p6_(p6),
+ p7_(p7),
+ p8_(p8),
+ p9_(p9) {}
+ R operator()() const {
+ return (object_->*method_)(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_);
+ }
+
+ private:
+ MethodT method_;
+ typename detail::PointerType<ObjectT>::type object_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
+ typename rtc::remove_reference<P7>::type p7_;
+ typename rtc::remove_reference<P8>::type p8_;
+ typename rtc::remove_reference<P9>::type p9_;
+};
+
+template <class FunctorT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8,
+ class P9>
+class Functor9 {
+ public:
+ Functor9(const FunctorT& functor,
+ P1 p1,
+ P2 p2,
+ P3 p3,
+ P4 p4,
+ P5 p5,
+ P6 p6,
+ P7 p7,
+ P8 p8,
+ P9 p9)
+ : functor_(functor),
+ p1_(p1),
+ p2_(p2),
+ p3_(p3),
+ p4_(p4),
+ p5_(p5),
+ p6_(p6),
+ p7_(p7),
+ p8_(p8),
+ p9_(p9) {}
+ R operator()() const {
+ return functor_(p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_);
+ }
+
+ private:
+ FunctorT functor_;
+ typename rtc::remove_reference<P1>::type p1_;
+ typename rtc::remove_reference<P2>::type p2_;
+ typename rtc::remove_reference<P3>::type p3_;
+ typename rtc::remove_reference<P4>::type p4_;
+ typename rtc::remove_reference<P5>::type p5_;
+ typename rtc::remove_reference<P6>::type p6_;
+ typename rtc::remove_reference<P7>::type p7_;
+ typename rtc::remove_reference<P8>::type p8_;
+ typename rtc::remove_reference<P9>::type p9_;
+};
+
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9)
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8,
+ class P9>
+MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>
+Bind(FP_T(method),
+ ObjectT* object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8,
+ typename detail::identity<P9>::type p9) {
+ return MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
+ P8, P9>(method, object, p1, p2, p3, p4, p5, p6, p7, p8,
+ p9);
+}
+
+#undef FP_T
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9) const
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8,
+ class P9>
+MethodFunctor9<const ObjectT,
+ FP_T(NONAME),
+ R,
+ P1,
+ P2,
+ P3,
+ P4,
+ P5,
+ P6,
+ P7,
+ P8,
+ P9>
+Bind(FP_T(method),
+ const ObjectT* object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8,
+ typename detail::identity<P9>::type p9) {
+ return MethodFunctor9<const ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6,
+ P7, P8, P9>(method, object, p1, p2, p3, p4, p5, p6, p7,
+ p8, p9);
+}
+
+#undef FP_T
+#define FP_T(x) R (ObjectT::*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9)
+
+template <class ObjectT,
+ class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8,
+ class P9>
+MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>
+Bind(FP_T(method),
+ const scoped_refptr<ObjectT>& object,
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8,
+ typename detail::identity<P9>::type p9) {
+ return MethodFunctor9<ObjectT, FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7,
+ P8, P9>(method, object.get(), p1, p2, p3, p4, p5, p6,
+ p7, p8, p9);
+}
+
+#undef FP_T
+#define FP_T(x) R (*x)(P1, P2, P3, P4, P5, P6, P7, P8, P9)
+
+template <class R,
+ class P1,
+ class P2,
+ class P3,
+ class P4,
+ class P5,
+ class P6,
+ class P7,
+ class P8,
+ class P9>
+Functor9<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9> Bind(
+ FP_T(function),
+ typename detail::identity<P1>::type p1,
+ typename detail::identity<P2>::type p2,
+ typename detail::identity<P3>::type p3,
+ typename detail::identity<P4>::type p4,
+ typename detail::identity<P5>::type p5,
+ typename detail::identity<P6>::type p6,
+ typename detail::identity<P7>::type p7,
+ typename detail::identity<P8>::type p8,
+ typename detail::identity<P9>::type p9) {
+ return Functor9<FP_T(NONAME), R, P1, P2, P3, P4, P5, P6, P7, P8, P9>(
+ function, p1, p2, p3, p4, p5, p6, p7, p8, p9);
+}
+
+#undef FP_T
+
} // namespace rtc
#undef NONAME

Powered by Google App Engine
This is Rietveld 408576698