Ticket #8212: 8212.patch
File 8212.patch, 8.8 KB (added by , 10 years ago) |
---|
-
../example/make_future.cpp
10 10 11 11 int p1() { return 5; } 12 12 13 void p() { } 14 15 #if defined BOOST_THREAD_USES_MOVE 16 boost::future<void> void_compute() 17 { 18 return BOOST_THREAD_MAKE_RV_REF(boost::make_future()); 19 } 20 #endif 21 13 22 boost::future<int> compute(int x) 14 23 { 15 24 if (x == 0) return boost::make_future(0); … … 30 39 31 40 int main() 32 41 { 42 #if defined BOOST_THREAD_USES_MOVE 33 43 { 44 boost::future<void> f = void_compute(); 45 f.get(); 46 } 47 #endif 48 { 34 49 boost::future<int> f = compute(2); 35 50 std::cout << f.get() << std::endl; 36 51 } 37 52 { 53 boost::future<int> f = compute(0); 54 std::cout << f.get() << std::endl; 55 } 56 { 38 57 boost::shared_future<int> f = shared_compute(2); 39 58 std::cout << f.get() << std::endl; 40 59 } -
../../../boost/thread/future.hpp
1677 1677 boost::throw_exception(future_already_retrieved()); 1678 1678 } 1679 1679 future_obtained=true; 1680 return BOOST_THREAD_ FUTURE<R>(future_);1680 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<R>(future_)); 1681 1681 } 1682 1682 1683 1683 void set_value(typename detail::future_traits<R>::source_reference_type r) … … 1844 1844 boost::throw_exception(future_already_retrieved()); 1845 1845 } 1846 1846 future_obtained=true; 1847 return BOOST_THREAD_ FUTURE<R&>(future_);1847 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<R&>(future_)); 1848 1848 } 1849 1849 1850 1850 void set_value(R& r) … … 1990 1990 } 1991 1991 future_obtained=true; 1992 1992 return BOOST_THREAD_FUTURE<void>(future_); 1993 //return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<void>(future_)); 1994 //BOOST_THREAD_FUTURE<void> res; 1995 //return boost::move(res); 1993 1996 } 1994 1997 1995 1998 void set_value() … … 2939 2942 { 2940 2943 future_obtained=true; 2941 2944 //return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<R>(task)); 2942 return BOOST_THREAD_ FUTURE<R>(task);2945 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<R>(task)); 2943 2946 } 2944 2947 else 2945 2948 { … … 3139 3142 if (int(policy) & int(launch::async)) 3140 3143 { 3141 3144 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) 3142 return boost::detail::make_future_async_object<Rp>(3145 return BOOST_THREAD_MAKE_RV_REF(boost::detail::make_future_async_object<Rp>( 3143 3146 BF( 3144 3147 thread_detail::decay_copy(boost::forward<F>(f)) 3145 3148 , thread_detail::decay_copy(boost::forward<ArgTypes>(args))... 3146 3149 ) 3147 ) ;3150 )); 3148 3151 #else 3149 3152 packaged_task_type pt( boost::forward<F>(f) ); 3150 3153 … … 3160 3163 else if (int(policy) & int(launch::deferred)) 3161 3164 { 3162 3165 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) 3163 return boost::detail::make_future_deferred_object<Rp>(3166 return BOOST_THREAD_MAKE_RV_REF(boost::detail::make_future_deferred_object<Rp>( 3164 3167 BF( 3165 3168 thread_detail::decay_copy(boost::forward<F>(f)) 3166 3169 , thread_detail::decay_copy(boost::forward<ArgTypes>(args))... 3167 3170 ) 3168 ) ;3171 )); 3169 3172 #else 3170 3173 BOOST_THREAD_FUTURE<R> ret; 3171 3174 return ::boost::move(ret); … … 3194 3197 BOOST_THREAD_FUTURE<R> 3195 3198 async(R(*f)(BOOST_THREAD_FWD_REF(ArgTypes)...), BOOST_THREAD_FWD_REF(ArgTypes)... args) 3196 3199 { 3197 return async(launch(launch::any), f, boost::forward<ArgTypes>(args)...);3200 return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), f, boost::forward<ArgTypes>(args)...)); 3198 3201 } 3199 3202 #else 3200 3203 template <class R> 3201 3204 BOOST_THREAD_FUTURE<R> 3202 3205 async(R(*f)()) 3203 3206 { 3204 return async(launch(launch::any), f);3207 return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), f)); 3205 3208 } 3206 3209 #endif 3207 3210 #endif … … 3213 3216 )>::type> 3214 3217 async(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(ArgTypes)... args) 3215 3218 { 3216 return async(launch(launch::any), boost::forward<F>(f), boost::forward<ArgTypes>(args)...);3219 return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), boost::forward<F>(f), boost::forward<ArgTypes>(args)...)); 3217 3220 } 3218 3221 #else 3219 3222 template <class F> 3220 3223 BOOST_THREAD_FUTURE<typename boost::result_of<F()>::type> 3221 3224 async(BOOST_THREAD_RV_REF(F) f) 3222 3225 { 3223 return async(launch(launch::any), boost::forward<F>(f));3226 return BOOST_THREAD_MAKE_RV_REF(async(launch(launch::any), boost::forward<F>(f))); 3224 3227 } 3225 3228 #endif 3226 3229 … … 3237 3240 return BOOST_THREAD_MAKE_RV_REF(p.get_future()); 3238 3241 } 3239 3242 3240 3243 #if defined BOOST_THREAD_USES_MOVE 3241 3244 inline BOOST_THREAD_FUTURE<void> make_future() 3242 3245 { 3243 3246 promise<void> p; 3244 return p.get_future();3245 3247 p.set_value(); 3248 return BOOST_THREAD_MAKE_RV_REF(p.get_future()); 3246 3249 } 3250 #endif 3247 3251 3248 3252 //////////////////////////////// 3249 3253 // make_shared_future … … 3397 3401 new detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, F>(*this, boost::forward<F>(func), policy); 3398 3402 if (ptr==0) 3399 3403 { 3400 return BOOST_THREAD_ FUTURE<future_type>();3404 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3401 3405 } 3402 3406 this->future_->set_continuation_ptr(ptr, lock); 3403 return ptr->next.get_future();3407 return BOOST_THREAD_MAKE_RV_REF(ptr->next.get_future()); 3404 3408 } 3405 3409 else 3406 3410 { … … 3421 3425 { 3422 3426 boost::unique_lock<boost::mutex> lock(this->future_->mutex); 3423 3427 detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, F > *ptr = 3424 new detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, F>(*this, boost::forward<F>(func)); 3428 new 3429 //BOOST_THREAD_MAKE_RV_REF(( 3430 detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, F>(*this, boost::forward<F>(func)) 3431 //)) 3432 ; 3425 3433 if (ptr==0) 3426 3434 { 3427 return BOOST_THREAD_ FUTURE<future_type>();3435 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3428 3436 } 3429 3437 this->future_->set_continuation_ptr(ptr, lock); 3430 3438 return ptr->next.get_future(); 3431 3439 } else { 3432 3440 // fixme what to do when the future has no associated state? 3433 return BOOST_THREAD_ FUTURE<future_type>();3441 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3434 3442 } 3435 3443 3436 3444 } … … 3447 3455 { 3448 3456 boost::unique_lock<boost::mutex> lock(this->future_->mutex); 3449 3457 detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, RF(*)(BOOST_THREAD_FUTURE&) > *ptr = 3450 new detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func); 3458 new 3459 //BOOST_THREAD_MAKE_RV_REF(( 3460 detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func) 3461 // )) 3462 ; 3451 3463 if (ptr==0) 3452 3464 { 3453 return BOOST_THREAD_ FUTURE<future_type>();3465 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3454 3466 } 3455 3467 this->future_->set_continuation_ptr(ptr, lock); 3456 3468 return ptr->next.get_future(); 3457 3469 } else { 3458 3470 // fixme what to do when the future has no associated state? 3459 return BOOST_THREAD_ FUTURE<future_type>();3471 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3460 3472 } 3461 3473 3462 3474 } … … 3472 3484 { 3473 3485 boost::unique_lock<boost::mutex> lock(this->future_->mutex); 3474 3486 detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, RF(*)(BOOST_THREAD_FUTURE&) > *ptr = 3475 new detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func, policy); 3487 new 3488 //BOOST_THREAD_MAKE_RV_REF(( 3489 detail::future_continuation<BOOST_THREAD_FUTURE<R>, future_type, RF(*)(BOOST_THREAD_FUTURE&)>(*this, func, policy) 3490 // )) 3491 ; 3476 3492 if (ptr==0) 3477 3493 { 3478 return BOOST_THREAD_ FUTURE<future_type>();3494 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3479 3495 } 3480 3496 this->future_->set_continuation_ptr(ptr, lock); 3481 3497 return ptr->next.get_future(); 3482 3498 } else { 3483 3499 // fixme what to do when the future has no associated state? 3484 return BOOST_THREAD_ FUTURE<future_type>();3500 return BOOST_THREAD_MAKE_RV_REF(BOOST_THREAD_FUTURE<future_type>()); 3485 3501 } 3486 3502 3487 3503 }