~ubuntu-branches/ubuntu/wily/davix/wily

« back to all changes in this revision

Viewing changes to deps/boost_intern/src/thread/test/sync/futures/promise/set_rvalue_pass.cpp

  • Committer: Package Import Robot
  • Author(s): Mattias Ellert
  • Date: 2015-07-31 13:17:55 UTC
  • mfrom: (5.1.3 sid)
  • Revision ID: package-import@ubuntu.com-20150731131755-mizprbmn7ogv33te
Tags: 0.4.1-1
* Update to version 0.4.1
* Implement Multi-Arch support

Show diffs side-by-side

added added

removed removed

Lines of Context:
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) 2011 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
 
// class promise<R>
18
 
 
19
 
// void promise::set_value(R&& r);
20
 
 
21
 
#define BOOST_THREAD_VERSION 3
22
 
 
23
 
#include <boost/thread/future.hpp>
24
 
#include <boost/detail/lightweight_test.hpp>
25
 
#include <boost/static_assert.hpp>
26
 
 
27
 
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
28
 
 
29
 
struct A
30
 
{
31
 
  A() :
32
 
    value(0)
33
 
  {
34
 
  }
35
 
  A(int i) :
36
 
    value(i)
37
 
  {
38
 
  }
39
 
  BOOST_THREAD_DELETE_COPY_CTOR(A)
40
 
  A(A&& rhs)
41
 
  {
42
 
    if(rhs.value==0)
43
 
    throw 9;
44
 
    else
45
 
    {
46
 
      value=rhs.value;
47
 
      rhs.value=0;
48
 
    }
49
 
  }
50
 
  int value;
51
 
};
52
 
 
53
 
#endif  // BOOST_NO_CXX11_RVALUE_REFERENCES
54
 
int main()
55
 
{
56
 
 
57
 
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
58
 
 
59
 
  {
60
 
    typedef A T;
61
 
    T i;
62
 
    boost::promise<T> p;
63
 
    boost::future<T> f = p.get_future();
64
 
    try
65
 
    {
66
 
      p.set_value(boost::move(i));
67
 
      BOOST_TEST(false);
68
 
    }
69
 
    catch (int j)
70
 
    {
71
 
      BOOST_TEST(j == 9);
72
 
    }
73
 
    catch (...)
74
 
    {
75
 
      BOOST_TEST(false);
76
 
    }
77
 
  }
78
 
  {
79
 
    typedef A T;
80
 
    T i(3);
81
 
    boost::promise<T> p;
82
 
    boost::future<T> f = p.get_future();
83
 
    p.set_value(boost::move(i));
84
 
    BOOST_TEST(f.get().value == 3);
85
 
    try
86
 
    {
87
 
      T j(3);
88
 
      p.set_value(boost::move(j));
89
 
      BOOST_TEST(false);
90
 
    }
91
 
    catch (const boost::future_error& e)
92
 
    {
93
 
      BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::promise_already_satisfied));
94
 
    }
95
 
    catch (...)
96
 
    {
97
 
      BOOST_TEST(false);
98
 
    }
99
 
 
100
 
  }
101
 
  {
102
 
    typedef A T;
103
 
    T i(3);
104
 
    boost::promise<T> p;
105
 
    boost::future<T> f = p.get_future();
106
 
    p.set_value(boost::move(i));
107
 
    BOOST_TEST(i.value == 0);
108
 
    boost::promise<T> p2(boost::move(p));
109
 
    BOOST_TEST(f.get().value == 3);
110
 
 
111
 
  }
112
 
  {
113
 
    typedef A T;
114
 
    T i(3);
115
 
    boost::promise<T> p;
116
 
    boost::future<T> f = p.get_future();
117
 
    p.set_value(boost::move(i));
118
 
    BOOST_TEST(i.value == 0);
119
 
    boost::promise<T> p2(boost::move(p));
120
 
    boost::future<T> f2(boost::move(f));
121
 
    BOOST_TEST(f2.get().value == 3);
122
 
 
123
 
  }
124
 
  {
125
 
    typedef A T;
126
 
    T i(3);
127
 
    boost::promise<T> p;
128
 
    p.set_value(boost::move(i));
129
 
    BOOST_TEST(i.value == 0);
130
 
    boost::promise<T> p2(boost::move(p));
131
 
    boost::future<T> f = p2.get_future();
132
 
    BOOST_TEST(f.get().value == 3);
133
 
 
134
 
  }
135
 
 
136
 
  {
137
 
    typedef boost::future<int> T;
138
 
    boost::promise<int> pi;
139
 
    T fi=pi.get_future();
140
 
    pi.set_value(3);
141
 
 
142
 
    boost::promise<T> p;
143
 
    boost::future<T> f = p.get_future();
144
 
    p.set_value(boost::move(fi));
145
 
    boost::future<T> f2(boost::move(f));
146
 
    BOOST_TEST(f2.get().get() == 3);
147
 
  }
148
 
 
149
 
#endif  // BOOST_NO_CXX11_RVALUE_REFERENCES
150
 
  return boost::report_errors();
151
 
}
152