diff options
author | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-14 21:48:54 +0000 |
---|---|---|
committer | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-14 21:48:54 +0000 |
commit | 115288648041898b6d50f7d2e17391e2d1972a76 (patch) | |
tree | eee67d927a7ebb40e87848924a8f26c5c5cb99ca /base/bind.h | |
parent | e91ac22d99252095839ca7c82c092972bd56445e (diff) | |
download | chromium_src-115288648041898b6d50f7d2e17391e2d1972a76.zip chromium_src-115288648041898b6d50f7d2e17391e2d1972a76.tar.gz chromium_src-115288648041898b6d50f7d2e17391e2d1972a76.tar.bz2 |
Revert 114494 - Remove BindStateHolder and have Bind() return a Callback<> object directly.
This removes some complexity and also fixes a bug where if you call Bind() with the result of Bind(), the resulting Callback would only be valid during the first call. Ouch.
BUG=none
TEST=new unittests
Review URL: http://codereview.chromium.org/8738001
TBR=ajwong@chromium.org
Review URL: http://codereview.chromium.org/8914022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@114495 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/bind.h')
-rw-r--r-- | base/bind.h | 171 |
1 files changed, 77 insertions, 94 deletions
diff --git a/base/bind.h b/base/bind.h index 22a3b4b..aa2cc6b 100644 --- a/base/bind.h +++ b/base/bind.h @@ -44,12 +44,11 @@ namespace base { template <typename Functor> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, - void()> - ::UnboundRunType> + void()> > Bind(Functor functor) { // Typedefs for how to store and run the functor. typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType; @@ -61,20 +60,18 @@ Bind(Functor functor) { typedef internal::FunctionTraits<typename RunnableType::RunType> BoundFunctorTraits; - typedef internal::BindState<RunnableType, RunType, void()> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor))); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, void()>( + internal::MakeRunnable(functor))); } template <typename Functor, typename P1> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType)> - ::UnboundRunType> + void(typename internal::CallbackParamTraits<P1>::StorageType)> > Bind(Functor functor, const P1& p1) { // Typedefs for how to store and run the functor. typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType; @@ -106,22 +103,20 @@ Bind(Functor functor, const P1& p1) { COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value || !is_array<P1>::value, first_bound_argument_to_method_cannot_be_array); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType)> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1)); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType)>( + internal::MakeRunnable(functor), p1)); } template <typename Functor, typename P1, typename P2> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType)> - ::UnboundRunType> + typename internal::CallbackParamTraits<P2>::StorageType)> > Bind(Functor functor, const P1& p1, const P2& p2) { // Typedefs for how to store and run the functor. typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType; @@ -156,24 +151,22 @@ Bind(Functor functor, const P1& p1, const P2& p2) { first_bound_argument_to_method_cannot_be_array); COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value, p2_is_refcounted_type_and_needs_scoped_refptr); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType)> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1, p2)); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType, + typename internal::CallbackParamTraits<P2>::StorageType)>( + internal::MakeRunnable(functor), p1, p2)); } template <typename Functor, typename P1, typename P2, typename P3> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, void(typename internal::CallbackParamTraits<P1>::StorageType, typename internal::CallbackParamTraits<P2>::StorageType, - typename internal::CallbackParamTraits<P3>::StorageType)> - ::UnboundRunType> + typename internal::CallbackParamTraits<P3>::StorageType)> > Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3) { // Typedefs for how to store and run the functor. typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType; @@ -211,26 +204,24 @@ Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3) { p2_is_refcounted_type_and_needs_scoped_refptr); COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value, p3_is_refcounted_type_and_needs_scoped_refptr); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType, - typename internal::CallbackParamTraits<P3>::StorageType)> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1, p2, p3)); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType, + typename internal::CallbackParamTraits<P2>::StorageType, + typename internal::CallbackParamTraits<P3>::StorageType)>( + internal::MakeRunnable(functor), p1, p2, p3)); } template <typename Functor, typename P1, typename P2, typename P3, typename P4> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, void(typename internal::CallbackParamTraits<P1>::StorageType, typename internal::CallbackParamTraits<P2>::StorageType, typename internal::CallbackParamTraits<P3>::StorageType, - typename internal::CallbackParamTraits<P4>::StorageType)> - ::UnboundRunType> + typename internal::CallbackParamTraits<P4>::StorageType)> > Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4) { // Typedefs for how to store and run the functor. typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType; @@ -271,29 +262,27 @@ Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4) { p3_is_refcounted_type_and_needs_scoped_refptr); COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value, p4_is_refcounted_type_and_needs_scoped_refptr); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType, - typename internal::CallbackParamTraits<P3>::StorageType, - typename internal::CallbackParamTraits<P4>::StorageType)> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4)); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType, + typename internal::CallbackParamTraits<P2>::StorageType, + typename internal::CallbackParamTraits<P3>::StorageType, + typename internal::CallbackParamTraits<P4>::StorageType)>( + internal::MakeRunnable(functor), p1, p2, p3, p4)); } template <typename Functor, typename P1, typename P2, typename P3, typename P4, typename P5> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, void(typename internal::CallbackParamTraits<P1>::StorageType, typename internal::CallbackParamTraits<P2>::StorageType, typename internal::CallbackParamTraits<P3>::StorageType, typename internal::CallbackParamTraits<P4>::StorageType, - typename internal::CallbackParamTraits<P5>::StorageType)> - ::UnboundRunType> + typename internal::CallbackParamTraits<P5>::StorageType)> > Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) { // Typedefs for how to store and run the functor. @@ -338,22 +327,21 @@ Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, p4_is_refcounted_type_and_needs_scoped_refptr); COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value, p5_is_refcounted_type_and_needs_scoped_refptr); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType, - typename internal::CallbackParamTraits<P3>::StorageType, - typename internal::CallbackParamTraits<P4>::StorageType, - typename internal::CallbackParamTraits<P5>::StorageType)> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5)); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType, + typename internal::CallbackParamTraits<P2>::StorageType, + typename internal::CallbackParamTraits<P3>::StorageType, + typename internal::CallbackParamTraits<P4>::StorageType, + typename internal::CallbackParamTraits<P5>::StorageType)>( + internal::MakeRunnable(functor), p1, p2, p3, p4, p5)); } template <typename Functor, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, void(typename internal::CallbackParamTraits<P1>::StorageType, @@ -361,8 +349,7 @@ base::Callback< typename internal::CallbackParamTraits<P3>::StorageType, typename internal::CallbackParamTraits<P4>::StorageType, typename internal::CallbackParamTraits<P5>::StorageType, - typename internal::CallbackParamTraits<P6>::StorageType)> - ::UnboundRunType> + typename internal::CallbackParamTraits<P6>::StorageType)> > Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) { // Typedefs for how to store and run the functor. @@ -410,23 +397,22 @@ Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, p5_is_refcounted_type_and_needs_scoped_refptr); COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P6>::value, p6_is_refcounted_type_and_needs_scoped_refptr); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType, - typename internal::CallbackParamTraits<P3>::StorageType, - typename internal::CallbackParamTraits<P4>::StorageType, - typename internal::CallbackParamTraits<P5>::StorageType, - typename internal::CallbackParamTraits<P6>::StorageType)> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6)); + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType, + typename internal::CallbackParamTraits<P2>::StorageType, + typename internal::CallbackParamTraits<P3>::StorageType, + typename internal::CallbackParamTraits<P4>::StorageType, + typename internal::CallbackParamTraits<P5>::StorageType, + typename internal::CallbackParamTraits<P6>::StorageType)>( + internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6)); } template <typename Functor, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7> -base::Callback< - typename internal::BindState< +internal::BindStateHolder< + internal::BindState< typename internal::FunctorTraits<Functor>::RunnableType, typename internal::FunctorTraits<Functor>::RunType, void(typename internal::CallbackParamTraits<P1>::StorageType, @@ -435,8 +421,7 @@ base::Callback< typename internal::CallbackParamTraits<P4>::StorageType, typename internal::CallbackParamTraits<P5>::StorageType, typename internal::CallbackParamTraits<P6>::StorageType, - typename internal::CallbackParamTraits<P7>::StorageType)> - ::UnboundRunType> + typename internal::CallbackParamTraits<P7>::StorageType)> > Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7) { // Typedefs for how to store and run the functor. @@ -487,19 +472,17 @@ Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, p6_is_refcounted_type_and_needs_scoped_refptr); COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P7>::value, p7_is_refcounted_type_and_needs_scoped_refptr); - typedef internal::BindState<RunnableType, RunType, - void(typename internal::CallbackParamTraits<P1>::StorageType, - typename internal::CallbackParamTraits<P2>::StorageType, - typename internal::CallbackParamTraits<P3>::StorageType, - typename internal::CallbackParamTraits<P4>::StorageType, - typename internal::CallbackParamTraits<P5>::StorageType, - typename internal::CallbackParamTraits<P6>::StorageType, - typename internal::CallbackParamTraits<P7>::StorageType)> BindState; - - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6, - p7)); + + return internal::MakeBindStateHolder( + new internal::BindState<RunnableType, RunType, + void(typename internal::CallbackParamTraits<P1>::StorageType, + typename internal::CallbackParamTraits<P2>::StorageType, + typename internal::CallbackParamTraits<P3>::StorageType, + typename internal::CallbackParamTraits<P4>::StorageType, + typename internal::CallbackParamTraits<P5>::StorageType, + typename internal::CallbackParamTraits<P6>::StorageType, + typename internal::CallbackParamTraits<P7>::StorageType)>( + internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6, p7)); } } // namespace base |