Home | History | Annotate | Download | only in futures.unique_future
      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 // R future::get();
     15 // R& future<R&>::get();
     16 // void future<void>::get();
     17 
     18 #include <future>
     19 #include <cassert>
     20 
     21 void func1(std::promise<int> p)
     22 {
     23     std::this_thread::sleep_for(std::chrono::milliseconds(500));
     24     p.set_value(3);
     25 }
     26 
     27 void func2(std::promise<int> p)
     28 {
     29     std::this_thread::sleep_for(std::chrono::milliseconds(500));
     30     p.set_exception(std::make_exception_ptr(3));
     31 }
     32 
     33 int j = 0;
     34 
     35 void func3(std::promise<int&> p)
     36 {
     37     std::this_thread::sleep_for(std::chrono::milliseconds(500));
     38     j = 5;
     39     p.set_value(j);
     40 }
     41 
     42 void func4(std::promise<int&> p)
     43 {
     44     std::this_thread::sleep_for(std::chrono::milliseconds(500));
     45     p.set_exception(std::make_exception_ptr(3.5));
     46 }
     47 
     48 void func5(std::promise<void> p)
     49 {
     50     std::this_thread::sleep_for(std::chrono::milliseconds(500));
     51     p.set_value();
     52 }
     53 
     54 void func6(std::promise<void> p)
     55 {
     56     std::this_thread::sleep_for(std::chrono::milliseconds(500));
     57     p.set_exception(std::make_exception_ptr('c'));
     58 }
     59 
     60 int main()
     61 {
     62     {
     63         typedef int T;
     64         {
     65             std::promise<T> p;
     66             std::future<T> f = p.get_future();
     67             std::thread(func1, std::move(p)).detach();
     68             assert(f.valid());
     69             assert(f.get() == 3);
     70             assert(!f.valid());
     71         }
     72         {
     73             std::promise<T> p;
     74             std::future<T> f = p.get_future();
     75             std::thread(func2, std::move(p)).detach();
     76             try
     77             {
     78                 assert(f.valid());
     79                 assert(f.get() == 3);
     80                 assert(false);
     81             }
     82             catch (int i)
     83             {
     84                 assert(i == 3);
     85             }
     86             assert(!f.valid());
     87         }
     88     }
     89     {
     90         typedef int& T;
     91         {
     92             std::promise<T> p;
     93             std::future<T> f = p.get_future();
     94             std::thread(func3, std::move(p)).detach();
     95             assert(f.valid());
     96             assert(f.get() == 5);
     97             assert(!f.valid());
     98         }
     99         {
    100             std::promise<T> p;
    101             std::future<T> f = p.get_future();
    102             std::thread(func4, std::move(p)).detach();
    103             try
    104             {
    105                 assert(f.valid());
    106                 assert(f.get() == 3);
    107                 assert(false);
    108             }
    109             catch (double i)
    110             {
    111                 assert(i == 3.5);
    112             }
    113             assert(!f.valid());
    114         }
    115     }
    116     {
    117         typedef void T;
    118         {
    119             std::promise<T> p;
    120             std::future<T> f = p.get_future();
    121             std::thread(func5, std::move(p)).detach();
    122             assert(f.valid());
    123             f.get();
    124             assert(!f.valid());
    125         }
    126         {
    127             std::promise<T> p;
    128             std::future<T> f = p.get_future();
    129             std::thread(func6, std::move(p)).detach();
    130             try
    131             {
    132                 assert(f.valid());
    133                 f.get();
    134                 assert(false);
    135             }
    136             catch (char i)
    137             {
    138                 assert(i == 'c');
    139             }
    140             assert(!f.valid());
    141         }
    142     }
    143 }
    144