rtc::Bind: Capture scoped_refptr reference arguments by value

R=tommi@webrtc.org

Review URL: https://codereview.webrtc.org/1308563004 .

Cr-Commit-Position: refs/heads/master@{#9780}
diff --git a/webrtc/base/bind.h b/webrtc/base/bind.h
index 2d81140..923fda2 100644
--- a/webrtc/base/bind.h
+++ b/webrtc/base/bind.h
@@ -128,6 +128,18 @@
                                        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>
@@ -208,7 +220,7 @@
  private:
   MethodT method_;
   typename detail::PointerType<ObjectT>::type object_;
-  P1 p1_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
 };
 
 template <class FunctorT, class R,
@@ -222,7 +234,7 @@
     return functor_(p1_); }
  private:
   FunctorT functor_;
-  P1 p1_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
 };
 
 
@@ -291,8 +303,8 @@
  private:
   MethodT method_;
   typename detail::PointerType<ObjectT>::type object_;
-  P1 p1_;
-  P2 p2_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
+  typename detail::RemoveScopedPtrRef<P2>::type p2_;
 };
 
 template <class FunctorT, class R,
@@ -308,8 +320,8 @@
     return functor_(p1_, p2_); }
  private:
   FunctorT functor_;
-  P1 p1_;
-  P2 p2_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
+  typename detail::RemoveScopedPtrRef<P2>::type p2_;
 };
 
 
@@ -389,9 +401,9 @@
  private:
   MethodT method_;
   typename detail::PointerType<ObjectT>::type object_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
+  typename detail::RemoveScopedPtrRef<P2>::type p2_;
+  typename detail::RemoveScopedPtrRef<P3>::type p3_;
 };
 
 template <class FunctorT, class R,
@@ -409,9 +421,9 @@
     return functor_(p1_, p2_, p3_); }
  private:
   FunctorT functor_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
+  typename detail::RemoveScopedPtrRef<P2>::type p2_;
+  typename detail::RemoveScopedPtrRef<P3>::type p3_;
 };
 
 
@@ -502,10 +514,10 @@
  private:
   MethodT method_;
   typename detail::PointerType<ObjectT>::type object_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
+  typename detail::RemoveScopedPtrRef<P2>::type p2_;
+  typename detail::RemoveScopedPtrRef<P3>::type p3_;
+  typename detail::RemoveScopedPtrRef<P4>::type p4_;
 };
 
 template <class FunctorT, class R,
@@ -525,10 +537,10 @@
     return functor_(p1_, p2_, p3_, p4_); }
  private:
   FunctorT functor_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
+  typename detail::RemoveScopedPtrRef<P1>::type p1_;
+  typename detail::RemoveScopedPtrRef<P2>::type p2_;
+  typename detail::RemoveScopedPtrRef<P3>::type p3_;
+  typename detail::RemoveScopedPtrRef<P4>::type p4_;
 };
 
 
@@ -630,11 +642,11 @@
  private:
   MethodT method_;
   typename detail::PointerType<ObjectT>::type object_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
+  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_;
 };
 
 template <class FunctorT, class R,
@@ -656,11 +668,11 @@
     return functor_(p1_, p2_, p3_, p4_, p5_); }
  private:
   FunctorT functor_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
+  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_;
 };
 
 
@@ -773,12 +785,12 @@
  private:
   MethodT method_;
   typename detail::PointerType<ObjectT>::type object_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
-  P6 p6_;
+  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_;
 };
 
 template <class FunctorT, class R,
@@ -802,12 +814,12 @@
     return functor_(p1_, p2_, p3_, p4_, p5_, p6_); }
  private:
   FunctorT functor_;
-  P1 p1_;
-  P2 p2_;
-  P3 p3_;
-  P4 p4_;
-  P5 p5_;
-  P6 p6_;
+  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_;
 };