//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Copyright (C) 2011 Vicente J. Botet Escriba // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // class promise // future get_future(); #define BOOST_THREAD_VERSION 3 #include #include #include namespace boost { template struct wrap { wrap(T const& v) : value(v){} T value; }; template exception_ptr make_exception_ptr(T v) { return copy_exception(wrap(v)); } } void func1(boost::promise p) { boost::this_thread::sleep_for(boost::chrono::milliseconds(500)); p.set_value(3); } void func2(boost::promise p) { boost::this_thread::sleep_for(boost::chrono::milliseconds(500)); p.set_exception(boost::make_exception_ptr(3)); } int j = 0; void func3(boost::promise p) { boost::this_thread::sleep_for(boost::chrono::milliseconds(500)); j = 5; p.set_value(j); } void func4(boost::promise p) { boost::this_thread::sleep_for(boost::chrono::milliseconds(500)); p.set_exception(boost::make_exception_ptr(3.5)); } void func5(boost::promise p) { boost::this_thread::sleep_for(boost::chrono::milliseconds(500)); p.set_value(); } void func6(boost::promise p) { boost::this_thread::sleep_for(boost::chrono::milliseconds(500)); p.set_exception(boost::make_exception_ptr('c')); } int main() { { typedef int T; { boost::promise p; boost::future f = p.get_future(); boost::thread(func1, boost::move(p)).detach(); BOOST_TEST(f.valid()); BOOST_TEST(f.get() == 3); BOOST_TEST(!f.valid()); } { boost::promise p; boost::future f = p.get_future(); boost::thread(func2, boost::move(p)).detach(); try { BOOST_TEST(f.valid()); BOOST_TEST(f.get() == 3); BOOST_TEST(false); } catch (int i) { BOOST_TEST(i == 3); } BOOST_TEST(!f.valid()); } } // { // typedef int& T; // { // boost::promise p; // boost::future f = p.get_future(); // boost::thread(func3, boost::move(p)).detach(); // BOOST_TEST(f.valid()); // BOOST_TEST(f.get() == 5); // BOOST_TEST(!f.valid()); // } // { // boost::promise p; // boost::future f = p.get_future(); // boost::thread(func4, boost::move(p)).detach(); // try // { // BOOST_TEST(f.valid()); // BOOST_TEST(f.get() == 3); // BOOST_TEST(false); // } // catch (double i) // { // BOOST_TEST(i == 3.5); // } // BOOST_TEST(!f.valid()); // } // } // { // typedef void T; // { // boost::promise p; // boost::future f = p.get_future(); // boost::thread(func5, boost::move(p)).detach(); // BOOST_TEST(f.valid()); // f.get(); // BOOST_TEST(!f.valid()); // } // { // boost::promise p; // boost::future f = p.get_future(); // boost::thread(func6, boost::move(p)).detach(); // try // { // BOOST_TEST(f.valid()); // f.get(); // BOOST_TEST(false); // } // catch (char i) // { // BOOST_TEST(i == 'c'); // } // BOOST_TEST(!f.valid()); // } // } return boost::report_errors(); }