]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 2016 Kohei Takahashi | |
3 | ||
4 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
5 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
6 | ==============================================================================*/ | |
7 | ||
8 | #include <boost/config.hpp> | |
9 | #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES | |
10 | ||
11 | #include <boost/detail/lightweight_test.hpp> | |
12 | #include <boost/fusion/adapted/struct/define_struct_inline.hpp> | |
13 | #include <utility> | |
14 | ||
15 | struct wrapper | |
16 | { | |
17 | int value; | |
18 | ||
19 | wrapper() : value(42) {} | |
20 | wrapper(wrapper&& other) : value(other.value) { other.value = 0; } | |
21 | wrapper(wrapper const& other) : value(other.value) {} | |
22 | ||
23 | wrapper& operator=(wrapper&& other) { value = other.value; other.value = 0; return *this; } | |
24 | wrapper& operator=(wrapper const& other) { value = other.value; return *this; } | |
25 | }; | |
26 | ||
27 | namespace ns | |
28 | { | |
29 | BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE((W), value, (W, w)) | |
30 | } | |
31 | ||
32 | int main() | |
33 | { | |
34 | using namespace boost::fusion; | |
35 | ||
36 | { | |
37 | ns::value<wrapper> x; | |
38 | ns::value<wrapper> y(x); // copy | |
39 | ||
40 | BOOST_TEST(x.w.value == 42); | |
41 | BOOST_TEST(y.w.value == 42); | |
42 | ||
43 | ++y.w.value; | |
44 | ||
45 | BOOST_TEST(x.w.value == 42); | |
46 | BOOST_TEST(y.w.value == 43); | |
47 | ||
48 | y = x; // copy assign | |
49 | ||
50 | BOOST_TEST(x.w.value == 42); | |
51 | BOOST_TEST(y.w.value == 42); | |
52 | } | |
53 | ||
54 | { | |
55 | ns::value<wrapper> x; | |
56 | ns::value<wrapper> y(std::move(x)); // move | |
57 | ||
58 | BOOST_TEST(x.w.value == 0); | |
59 | BOOST_TEST(y.w.value == 42); | |
60 | ||
61 | ++y.w.value; | |
62 | ||
63 | BOOST_TEST(x.w.value == 0); | |
64 | BOOST_TEST(y.w.value == 43); | |
65 | ||
66 | y = std::move(x); // move assign | |
67 | ||
68 | BOOST_TEST(x.w.value == 0); | |
69 | BOOST_TEST(y.w.value == 0); | |
70 | } | |
71 | ||
72 | return boost::report_errors(); | |
73 | } | |
74 | ||
75 | #else | |
76 | ||
77 | int main() | |
78 | { | |
79 | } | |
80 | ||
81 | #endif |