Index: ../example/make_future.cpp =================================================================== --- ../example/make_future.cpp (revision 83403) +++ ../example/make_future.cpp (working copy) @@ -10,6 +10,15 @@ int p1() { return 5; } +void p() { } + +#if defined BOOST_THREAD_USES_MOVE +boost::future void_compute() +{ + return BOOST_THREAD_MAKE_RV_REF(boost::make_future()); +} +#endif + boost::future compute(int x) { if (x == 0) return boost::make_future(0); @@ -30,11 +39,21 @@ int main() { +#if defined BOOST_THREAD_USES_MOVE { + boost::future f = void_compute(); + f.get(); + } +#endif + { boost::future f = compute(2); std::cout << f.get() << std::endl; } { + boost::future f = compute(0); + std::cout << f.get() << std::endl; + } + { boost::shared_future f = shared_compute(2); std::cout << f.get() << std::endl; } Index: ../../../boost/thread/future.hpp =================================================================== --- ../../../boost/thread/future.hpp (revision 83403) +++ ../../../boost/thread/future.hpp (working copy) @@ -1677,7 +1677,7 @@ boost::throw_exception(future_already_retrieved()); } future_obtained=true; - return BOOST_THREAD_FUTURE(future_); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE(future_)); } void set_value(typename detail::future_traits::source_reference_type r) @@ -1844,7 +1844,7 @@ boost::throw_exception(future_already_retrieved()); } future_obtained=true; - return BOOST_THREAD_FUTURE(future_); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE(future_)); } void set_value(R& r) @@ -1990,6 +1990,9 @@ } future_obtained=true; return BOOST_THREAD_FUTURE(future_); + //return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE(future_)); + //BOOST_THREAD_FUTURE res; + //return boost::move(res); } void set_value() @@ -2939,7 +2942,7 @@ { future_obtained=true; //return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE(task)); - return BOOST_THREAD_FUTURE(task); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE(task)); } else { @@ -3139,12 +3142,12 @@ if (int(policy) & int(launch::async)) { #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) - return boost::detail::make_future_async_object( + return BOOST_THREAD_MAKE_RV_REF(boost::detail::make_future_async_object( BF( thread_detail::decay_copy(boost::forward(f)) , thread_detail::decay_copy(boost::forward(args))... ) - ); + )); #else packaged_task_type pt( boost::forward(f) ); @@ -3160,12 +3163,12 @@ else if (int(policy) & int(launch::deferred)) { #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) - return boost::detail::make_future_deferred_object( + return BOOST_THREAD_MAKE_RV_REF(boost::detail::make_future_deferred_object( BF( thread_detail::decay_copy(boost::forward(f)) , thread_detail::decay_copy(boost::forward(args))... ) - ); + )); #else BOOST_THREAD_FUTURE ret; return ::boost::move(ret); @@ -3194,14 +3197,14 @@ BOOST_THREAD_FUTURE async(R(*f)(BOOST_THREAD_FWD_REF(ArgTypes)...), BOOST_THREAD_FWD_REF(ArgTypes)... args) { - return async(launch(launch::any), f, boost::forward(args)...); + return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), f, boost::forward(args)...)); } #else template BOOST_THREAD_FUTURE async(R(*f)()) { - return async(launch(launch::any), f); + return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), f)); } #endif #endif @@ -3213,14 +3216,14 @@ )>::type> async(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(ArgTypes)... args) { - return async(launch(launch::any), boost::forward(f), boost::forward(args)...); + return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), boost::forward(f), boost::forward(args)...)); } #else template BOOST_THREAD_FUTURE::type> async(BOOST_THREAD_RV_REF(F) f) { - return async(launch(launch::any), boost::forward(f)); + return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), boost::forward(f))); } #endif @@ -3237,13 +3240,14 @@ return BOOST_THREAD_MAKE_RV_REF(p.get_future()); } - +#if defined BOOST_THREAD_USES_MOVE inline BOOST_THREAD_FUTURE make_future() { promise p; - return p.get_future(); - + p.set_value(); + return BOOST_THREAD_MAKE_RV_REF(p.get_future()); } +#endif //////////////////////////////// // make_shared_future @@ -3397,10 +3401,10 @@ new detail::future_continuation, future_type, F>(*this, boost::forward(func), policy); if (ptr==0) { - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } this->future_->set_continuation_ptr(ptr, lock); - return ptr->next.get_future(); + return BOOST_THREAD_MAKE_RV_REF(ptr->next.get_future()); } else { @@ -3421,16 +3425,20 @@ { boost::unique_lock lock(this->future_->mutex); detail::future_continuation, future_type, F > *ptr = - new detail::future_continuation, future_type, F>(*this, boost::forward(func)); + new + //BOOST_THREAD_MAKE_RV_REF(( + detail::future_continuation, future_type, F>(*this, boost::forward(func)) + //)) + ; if (ptr==0) { - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } this->future_->set_continuation_ptr(ptr, lock); return ptr->next.get_future(); } else { // fixme what to do when the future has no associated state? - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } } @@ -3447,16 +3455,20 @@ { boost::unique_lock lock(this->future_->mutex); detail::future_continuation, future_type, RF(*)(BOOST_THREAD_FUTURE&) > *ptr = - new detail::future_continuation, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func); + new + //BOOST_THREAD_MAKE_RV_REF(( + detail::future_continuation, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func) + // )) + ; if (ptr==0) { - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } this->future_->set_continuation_ptr(ptr, lock); return ptr->next.get_future(); } else { // fixme what to do when the future has no associated state? - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } } @@ -3472,16 +3484,20 @@ { boost::unique_lock lock(this->future_->mutex); detail::future_continuation, future_type, RF(*)(BOOST_THREAD_FUTURE&) > *ptr = - new detail::future_continuation, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func, policy); + new + //BOOST_THREAD_MAKE_RV_REF(( + detail::future_continuation, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func, policy) + // )) + ; if (ptr==0) { - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } this->future_->set_continuation_ptr(ptr, lock); return ptr->next.get_future(); } else { // fixme what to do when the future has no associated state? - return BOOST_THREAD_FUTURE(); + return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE()); } }