• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // Copyright (C) 2014 Vicente J. Botet Escriba
11 //
12 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
13 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
14 
15 // <boost/thread/future.hpp>
16 
17 // future<tuple<T>> when_any(T&&);
18 
19 #include <boost/config.hpp>
20 
21 #if ! defined  BOOST_NO_CXX11_DECLTYPE
22 #define BOOST_RESULT_OF_USE_DECLTYPE
23 #endif
24 
25 
26 #define BOOST_THREAD_VERSION 4
27 
28 #include <boost/thread/future.hpp>
29 #include <boost/detail/lightweight_test.hpp>
30 
31 #ifdef BOOST_MSVC
32 #pragma warning(disable: 4127) // conditional expression is constant
33 #endif
34 
p1()35 int p1()
36 {
37   return 123;
38 }
39 
main()40 int main()
41 {
42 #if defined BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY
43   if (0) // todo not yet implemented
44   { // invalid future copy-constructible
45     boost::future<int> f1;
46     BOOST_TEST(! f1.valid());
47     boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
48     BOOST_TEST(! f1.valid());
49     BOOST_TEST(all.valid());
50     boost::csbl::tuple<boost::future<int> > res = all.get();
51     BOOST_TEST(boost::csbl::get<0>(res).valid());
52     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
53     // has exception
54     //BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
55   }
56   { // is_ready future copy-constructible
57     boost::future<int> f1 = boost::make_ready_future(123);
58     BOOST_TEST(f1.valid());
59     BOOST_TEST(f1.is_ready());
60     boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
61     BOOST_TEST(! f1.valid());
62     BOOST_TEST(all.valid());
63     if (0) // todo FAILS not yet implemented
64     BOOST_TEST(all.is_ready());
65     boost::csbl::tuple<boost::future<int> > res = all.get();
66     BOOST_TEST(boost::csbl::get<0>(res).valid());
67     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
68     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
69   }
70   { // is_ready shared_future copy-constructible
71     boost::shared_future<int> f1 = boost::make_ready_future(123).share();
72     BOOST_TEST(f1.valid());
73     BOOST_TEST(f1.is_ready());
74     boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
75     BOOST_TEST(f1.valid());
76     BOOST_TEST(all.valid());
77     if (0) // todo FAILS not yet implemented
78     BOOST_TEST(all.is_ready());
79     boost::csbl::tuple<boost::shared_future<int> > res = all.get();
80     BOOST_TEST(boost::csbl::get<0>(res).valid());
81     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
82     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
83   }
84   { // packaged_task future copy-constructible
85     boost::packaged_task<int()> pt1(&p1);
86     boost::future<int> f1 = pt1.get_future();
87     BOOST_TEST(f1.valid());
88     boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
89     BOOST_TEST(! f1.valid());
90     BOOST_TEST(all.valid());
91     pt1();
92     boost::csbl::tuple<boost::future<int> > res = all.get();
93     BOOST_TEST(boost::csbl::get<0>(res).valid());
94     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
95     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
96   }
97   { // packaged_task shared_future copy-constructible
98     boost::packaged_task<int()> pt1(&p1);
99     boost::shared_future<int> f1 = pt1.get_future().share();
100     BOOST_TEST(f1.valid());
101     boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
102     BOOST_TEST(f1.valid());
103     BOOST_TEST(all.valid());
104     pt1();
105     boost::csbl::tuple<boost::shared_future<int> > res = all.get();
106     BOOST_TEST(boost::csbl::get<0>(res).valid());
107     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
108     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
109   }
110   { // async future copy-constructible
111     boost::future<int> f1 = boost::async(boost::launch::async, &p1);
112     BOOST_TEST(f1.valid());
113     boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
114     BOOST_TEST(! f1.valid());
115     BOOST_TEST(all.valid());
116     boost::csbl::tuple<boost::future<int> > res = all.get();
117     BOOST_TEST(boost::csbl::get<0>(res).valid());
118     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
119     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
120   }
121   { // async shared_future copy-constructible
122     boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
123     BOOST_TEST(f1.valid());
124     boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
125     BOOST_TEST(f1.valid());
126     BOOST_TEST(all.valid());
127     boost::csbl::tuple<boost::shared_future<int> > res = all.get();
128     BOOST_TEST(boost::csbl::get<0>(res).valid());
129     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
130     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
131   }
132 #if defined BOOST_THREAD_PROVIDES_VARIADIC_THREAD
133   // fixme darwin-4.8.0_11 terminate called without an active exception
134   { // deferred future copy-constructible
135     boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
136     boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
137     BOOST_TEST(! f1.valid());
138     BOOST_TEST(all.valid());
139     boost::csbl::tuple<boost::future<int> > res = all.get();
140     BOOST_TEST(boost::csbl::get<0>(res).valid());
141     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
142     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
143   }
144   // fixme darwin-4.8.0_11 terminate called without an active exception
145   { // deferred shared_future copy-constructible
146     boost::shared_future<int> f1 = boost::async(boost::launch::deferred, &p1).share();
147     boost::future<boost::csbl::tuple<boost::shared_future<int> > > all = boost::when_any(f1);
148     BOOST_TEST(f1.valid());
149     BOOST_TEST(all.valid());
150     boost::csbl::tuple<boost::shared_future<int> > res = all.get();
151     BOOST_TEST(boost::csbl::get<0>(res).valid());
152     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
153     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
154   }
155 #endif
156 #endif
157   return boost::report_errors();
158 }
159 
160