112 changes: 51 additions & 61 deletions test/sync/futures/when_all/one_pass.cpp
Expand Up @@ -15,7 +15,7 @@
// <boost/thread/future.hpp>

// template <class T, class Ts>
// future<vector<T>> when_all(T&&);
// future<tuple<T>> when_all(T&&);

#include <boost/config.hpp>

Expand Down Expand Up @@ -50,88 +50,82 @@ int main()
{ // invalid future copy-constructible
boost::future<int> f1;
BOOST_TEST(! f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
// has exception
//BOOST_TEST(res[0].get() == 123);
//BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // is_ready future copy-constructible
boost::future<int> f1 = boost::make_ready_future(123);
BOOST_TEST(f1.valid());
BOOST_TEST(f1.is_ready());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
if (0) // todo FAILS not yet implemented
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // is_ready shared_future copy-constructible
boost::shared_future<int> f1 = boost::make_ready_future(123).share();
BOOST_TEST(f1.valid());
BOOST_TEST(f1.is_ready());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_all(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
if (0) // todo FAILS not yet implemented
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // packaged_task future copy-constructible
boost::packaged_task<int()> pt1(&p1);
boost::future<int> f1 = pt1.get_future();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
pt1();
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // packaged_task shared_future copy-constructible
boost::packaged_task<int()> pt1(&p1);
boost::shared_future<int> f1 = pt1.get_future().share();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_all(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
pt1();
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // packaged_task future copy-constructible
boost::packaged_task<int()> pt1(&thr);
boost::future<int> f1 = pt1.get_future();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
pt1();
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
try {
res[0].get();
boost::csbl::get<0>(res).get();
BOOST_TEST(false);
} catch (std::logic_error& ex) {
BOOST_TEST(ex.what() == std::string("123"));
Expand All @@ -142,51 +136,47 @@ int main()
{ // async future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // async shared_future copy-constructible
boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_all(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
#if ! defined BOOST_NO_CXX11_DECLTYPE_N3276
// fixme darwin-4.8.0_11 terminate called without an active exception
{ // deferred future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
// fixme darwin-4.8.0_11 terminate called without an active exception
{ // deferred shared_future copy-constructible
boost::shared_future<int> f1 = boost::async(boost::launch::deferred, &p1).share();
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_all(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
#endif
#endif
Expand Down
197 changes: 93 additions & 104 deletions test/sync/futures/when_all/variadic_homo_pass.cpp
Expand Up @@ -15,7 +15,7 @@
// <boost/thread/future.hpp>

// template <class T, class Ts>
// future<vector<T, Ts...>> when_all(T&&, Ts&& ...);
// future<tuple<T, Ts...>> when_all(T&&, Ts&& ...);

#include <boost/config.hpp>

Expand Down Expand Up @@ -56,19 +56,18 @@ int main()
boost::future<int> f2 = boost::make_ready_future(321);
BOOST_TEST(! f1.valid());
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
// has exception
//BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
//BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // is_ready future copy-constructible
boost::future<int> f1 = boost::make_ready_future(123);
Expand All @@ -77,20 +76,19 @@ int main()
BOOST_TEST(f1.is_ready());
BOOST_TEST(f2.valid());
BOOST_TEST(f2.is_ready());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
if (0) // todo FAILS not yet implemented
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // is_ready shared_future copy-constructible
boost::shared_future<int> f1 = boost::make_ready_future(123).share();
Expand All @@ -99,20 +97,19 @@ int main()
BOOST_TEST(f1.is_ready());
BOOST_TEST(f2.valid());
BOOST_TEST(f2.is_ready());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1, f2);
boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
BOOST_TEST(f1.valid());
BOOST_TEST(f2.valid());
BOOST_TEST(all.valid());
if (0) // todo FAILS not yet implemented
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // packaged_task future copy-constructible
boost::packaged_task<int()> pt1(&p1);
Expand All @@ -121,20 +118,19 @@ int main()
boost::packaged_task<int()> pt2(&p2);
boost::future<int> f2 = pt2.get_future();
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
pt1();
pt2();
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // packaged_task future copy-constructible
boost::packaged_task<int()> pt1(&thr);
Expand All @@ -143,27 +139,26 @@ int main()
boost::packaged_task<int()> pt2(&p2);
boost::future<int> f2 = pt2.get_future();
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
pt1();
pt2();
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
try {
res[0].get();
boost::csbl::get<0>(res).get();
BOOST_TEST(false);
} catch (std::logic_error& ex) {
BOOST_TEST(ex.what() == std::string("123"));
} catch (...) {
BOOST_TEST(false);
}
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // packaged_task shared_future copy-constructible
boost::packaged_task<int()> pt1(&p1);
Expand All @@ -172,7 +167,7 @@ int main()
boost::packaged_task<int()> pt2(&p2);
boost::shared_future<int> f2 = pt2.get_future().share();
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1, f2);
boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
BOOST_TEST(f1.valid());
BOOST_TEST(f2.valid());
BOOST_TEST(all.valid());
Expand All @@ -182,119 +177,113 @@ int main()
pt2();
boost::this_thread::sleep_for(boost::chrono::milliseconds(300));
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // async future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
BOOST_TEST(f1.valid());
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // async shared_future copy-constructible
boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
BOOST_TEST(f1.valid());
boost::shared_future<int> f2 = boost::async(boost::launch::async, &p2).share();
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1, f2);
boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
BOOST_TEST(f1.valid());
BOOST_TEST(f2.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
{ // async future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
BOOST_TEST(f1.valid());
boost::future<int> f2 = boost::make_ready_future(321);
BOOST_TEST(f2.valid());
BOOST_TEST(f2.is_ready());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
#if ! defined BOOST_NO_CXX11_DECLTYPE_N3276
// fixme darwin-4.8.0_11 terminate called without an active exception
{ // deferred future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
boost::future<int> f2 = boost::async(boost::launch::deferred, &p2);
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
// fixme darwin-4.8.0_11 terminate called without an active exception
{ // deferred shared_future copy-constructible
boost::shared_future<int> f1 = boost::async(boost::launch::deferred, &p1).share();
boost::shared_future<int> f2 = boost::async(boost::launch::deferred, &p2).share();
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_all(f1, f2);
boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
BOOST_TEST(f1.valid());
BOOST_TEST(f2.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 2);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
BOOST_TEST(res[1].valid());
BOOST_TEST(res[1].is_ready());
BOOST_TEST(res[1].get() == 321);
boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
BOOST_TEST(boost::csbl::get<1>(res).valid());
BOOST_TEST(boost::csbl::get<1>(res).is_ready());
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
}
#endif
{ // async futures copy-constructible then()
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
BOOST_TEST(f1.valid());
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
BOOST_TEST(f2.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
BOOST_TEST(! f1.valid());
BOOST_TEST(! f2.valid());
BOOST_TEST(all.valid());
boost::future<int> sum = all.then([](boost::future<boost::csbl::vector<boost::future<int> > > f)
boost::future<int> sum = all.then([](boost::future<boost::csbl::tuple<boost::future<int>, boost::future<int> > > f)
{
boost::csbl::vector<boost::future<int> > v = f.get();
return v[0].get() + v[1].get();
boost::csbl::tuple<boost::future<int>,boost::future<int> > v = f.get();
return boost::csbl::get<0>(v).get()+boost::csbl::get<1>(v).get();
});
BOOST_TEST(sum.valid());
BOOST_TEST(sum.get() == 444);
Expand Down
101 changes: 46 additions & 55 deletions test/sync/futures/when_any/one_pass.cpp
Expand Up @@ -14,7 +14,7 @@

// <boost/thread/future.hpp>

// future<vector<T>> when_any(T&&);
// future<tuple<T>> when_any(T&&);

#include <boost/config.hpp>

Expand Down Expand Up @@ -43,122 +43,113 @@ int main()
{ // invalid future copy-constructible
boost::future<int> f1;
BOOST_TEST(! f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
// has exception
//BOOST_TEST(res[0].get() == 123);
//BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // is_ready future copy-constructible
boost::future<int> f1 = boost::make_ready_future(123);
BOOST_TEST(f1.valid());
BOOST_TEST(f1.is_ready());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
if (0) // todo FAILS not yet implemented
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // is_ready shared_future copy-constructible
boost::shared_future<int> f1 = boost::make_ready_future(123).share();
BOOST_TEST(f1.valid());
BOOST_TEST(f1.is_ready());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_any(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
if (0) // todo FAILS not yet implemented
BOOST_TEST(all.is_ready());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // packaged_task future copy-constructible
boost::packaged_task<int()> pt1(&p1);
boost::future<int> f1 = pt1.get_future();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
pt1();
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // packaged_task shared_future copy-constructible
boost::packaged_task<int()> pt1(&p1);
boost::shared_future<int> f1 = pt1.get_future().share();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_any(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
pt1();
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // async future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
{ // async shared_future copy-constructible
boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
BOOST_TEST(f1.valid());
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_any(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
#if ! defined BOOST_NO_CXX11_DECLTYPE_N3276
// fixme darwin-4.8.0_11 terminate called without an active exception
{ // deferred future copy-constructible
boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(boost::move(f1));
boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
BOOST_TEST(! f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
// fixme darwin-4.8.0_11 terminate called without an active exception
{ // deferred shared_future copy-constructible
boost::shared_future<int> f1 = boost::async(boost::launch::deferred, &p1).share();
boost::future<boost::csbl::vector<boost::shared_future<int> > > all = boost::when_any(f1);
boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
BOOST_TEST(f1.valid());
BOOST_TEST(all.valid());
boost::csbl::vector<boost::shared_future<int> > res = all.get();
BOOST_TEST(res.size() == 1);
BOOST_TEST(res[0].valid());
BOOST_TEST(res[0].is_ready());
BOOST_TEST(res[0].get() == 123);
boost::csbl::tuple<boost::shared_future<int> > res = all.get();
BOOST_TEST(boost::csbl::get<0>(res).valid());
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
}
#endif
#endif
Expand Down