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// <future>
11
12// class future<R>
13
14// void wait() const;
15
16#include <future>
17#include <cassert>
18
19void func1(std::promise<int> p)
20{
21    std::this_thread::sleep_for(std::chrono::milliseconds(500));
22    p.set_value(3);
23}
24
25int j = 0;
26
27void func3(std::promise<int&> p)
28{
29    std::this_thread::sleep_for(std::chrono::milliseconds(500));
30    j = 5;
31    p.set_value(j);
32}
33
34void func5(std::promise<void> p)
35{
36    std::this_thread::sleep_for(std::chrono::milliseconds(500));
37    p.set_value();
38}
39
40int main()
41{
42    typedef std::chrono::high_resolution_clock Clock;
43    typedef std::chrono::duration<double, std::milli> ms;
44    {
45        typedef int T;
46        std::promise<T> p;
47        std::future<T> f = p.get_future();
48        std::thread(func1, std::move(p)).detach();
49        assert(f.valid());
50        f.wait();
51        assert(f.valid());
52        Clock::time_point t0 = Clock::now();
53        f.wait();
54        Clock::time_point t1 = Clock::now();
55        assert(f.valid());
56        assert(t1-t0 < ms(5));
57    }
58    {
59        typedef int& T;
60        std::promise<T> p;
61        std::future<T> f = p.get_future();
62        std::thread(func3, std::move(p)).detach();
63        assert(f.valid());
64        f.wait();
65        assert(f.valid());
66        Clock::time_point t0 = Clock::now();
67        f.wait();
68        Clock::time_point t1 = Clock::now();
69        assert(f.valid());
70        assert(t1-t0 < ms(5));
71    }
72    {
73        typedef void T;
74        std::promise<T> p;
75        std::future<T> f = p.get_future();
76        std::thread(func5, std::move(p)).detach();
77        assert(f.valid());
78        f.wait();
79        assert(f.valid());
80        Clock::time_point t0 = Clock::now();
81        f.wait();
82        Clock::time_point t1 = Clock::now();
83        assert(f.valid());
84        assert(t1-t0 < ms(5));
85    }
86}
87