1 | ////////////////////////////////////////////////////////////////////////////// |
---|---|
2 | // |
3 | // (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009. |
4 | // (C) Copyright Ion Gaztanaga 2009-2014. |
5 | // Distributed under the Boost Software License, Version 1.0. |
6 | // (See accompanying file LICENSE_1_0.txt or copy at |
7 | // http://www.boost.org/LICENSE_1_0.txt) |
8 | // |
9 | // See http://www.boost.org/libs/move for documentation. |
10 | // |
11 | ////////////////////////////////////////////////////////////////////////////// |
12 | #include <boost/move/utility_core.hpp> |
13 | #include "../example/movable.hpp" |
14 | #include "../example/copymovable.hpp" |
15 | |
16 | movable function(movable m) |
17 | { |
18 | return movable(boost::move(t&: m)); |
19 | } |
20 | |
21 | movable functionr(BOOST_RV_REF(movable) m) |
22 | { |
23 | return movable(boost::move(t&: m)); |
24 | } |
25 | |
26 | movable function2(movable m) |
27 | { |
28 | return boost::move(t&: m); |
29 | } |
30 | |
31 | BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m) |
32 | { |
33 | return boost::move(t&: m); |
34 | } |
35 | |
36 | movable move_return_function2 () |
37 | { |
38 | return movable(); |
39 | } |
40 | |
41 | movable move_return_function () |
42 | { |
43 | movable m; |
44 | return (boost::move(t&: m)); |
45 | } |
46 | |
47 | |
48 | //Catch by value |
49 | void function_value(movable) |
50 | {} |
51 | |
52 | //Catch by reference |
53 | void function_ref(const movable &) |
54 | {} |
55 | |
56 | //Catch by reference |
57 | void function_ref(BOOST_RV_REF(movable)) |
58 | {} |
59 | |
60 | movable create_movable() |
61 | { return movable(); } |
62 | |
63 | template<class Type> |
64 | struct factory |
65 | { |
66 | Type operator()() const |
67 | { |
68 | Type t; |
69 | return BOOST_MOVE_RET(Type, t); |
70 | } |
71 | }; |
72 | |
73 | template<class Type> |
74 | struct factory<Type &> |
75 | { |
76 | static Type t; |
77 | Type &operator()() const |
78 | { |
79 | return BOOST_MOVE_RET(Type&, t); |
80 | } |
81 | }; |
82 | |
83 | template<class Type> |
84 | Type factory<Type&>::t; |
85 | |
86 | template <class R, class F> |
87 | R factory_wrapper(F f) |
88 | { |
89 | // lock(); |
90 | R r = f(); |
91 | // unlock(); |
92 | return BOOST_MOVE_RET(R, r); |
93 | } |
94 | |
95 | int main() |
96 | { |
97 | #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) |
98 | BOOST_MOVE_STATIC_ASSERT((boost::has_nothrow_move<movable>::value == true)); |
99 | BOOST_MOVE_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable>::value == false)); |
100 | BOOST_MOVE_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable*>::value == false)); |
101 | BOOST_MOVE_STATIC_ASSERT((boost::has_move_emulation_enabled<int>::value == false)); |
102 | BOOST_MOVE_STATIC_ASSERT((boost::has_move_emulation_enabled<int&>::value == false)); |
103 | BOOST_MOVE_STATIC_ASSERT((boost::has_move_emulation_enabled<int*>::value == false)); |
104 | #endif |
105 | |
106 | { |
107 | movable m; |
108 | movable m2(boost::move(t&: m)); |
109 | movable m3(function(m: movable(boost::move(t&: m2)))); |
110 | movable m4(function(m: boost::move(t&: m3))); |
111 | ::boost::movelib::ignore(m);::boost::movelib::ignore(m2);::boost::movelib::ignore(m3);::boost::movelib::ignore(m4); |
112 | } |
113 | { |
114 | movable m; |
115 | movable m2(boost::move(t&: m)); |
116 | movable m3(functionr(m: movable(boost::move(t&: m2)))); |
117 | movable m4(functionr(m: boost::move(t&: m3))); |
118 | ::boost::movelib::ignore(m);::boost::movelib::ignore(m2);::boost::movelib::ignore(m3);::boost::movelib::ignore(m4); |
119 | } |
120 | { |
121 | movable m; |
122 | movable m2(boost::move(t&: m)); |
123 | movable m3(function2(m: movable(boost::move(t&: m2)))); |
124 | movable m4(function2(m: boost::move(t&: m3))); |
125 | ::boost::movelib::ignore(m);::boost::movelib::ignore(m2);::boost::movelib::ignore(m3);::boost::movelib::ignore(m4); |
126 | } |
127 | { |
128 | movable m; |
129 | movable m2(boost::move(t&: m)); |
130 | movable m3(function2r(m: movable(boost::move(t&: m2)))); |
131 | movable m4(function2r(m: boost::move(t&: m3))); |
132 | ::boost::movelib::ignore(m);::boost::movelib::ignore(m2);::boost::movelib::ignore(m3);::boost::movelib::ignore(m4); |
133 | } |
134 | { |
135 | movable m; |
136 | movable m2(boost::move(t&: m)); |
137 | movable m3(move_return_function()); |
138 | ::boost::movelib::ignore(m);::boost::movelib::ignore(m2);::boost::movelib::ignore(m3); |
139 | } |
140 | { |
141 | movable m; |
142 | movable m2(boost::move(t&: m)); |
143 | movable m3(move_return_function2()); |
144 | ::boost::movelib::ignore(m);::boost::movelib::ignore(m2);::boost::movelib::ignore(m3); |
145 | } |
146 | { |
147 | //movable |
148 | movable m (factory_wrapper<movable>(f: factory<movable>())); |
149 | m = factory_wrapper<movable>(f: factory<movable>()); |
150 | movable&mr(factory_wrapper<movable&>(f: factory<movable&>())); |
151 | movable&mr2 = factory_wrapper<movable&>(f: factory<movable&>()); |
152 | ::boost::movelib::ignore(mr); |
153 | ::boost::movelib::ignore(mr2); |
154 | ::boost::movelib::ignore(m); |
155 | } |
156 | { |
157 | //copyable |
158 | copyable c (factory_wrapper<copyable>(f: factory<copyable>())); |
159 | c = factory_wrapper<copyable>(f: factory<copyable>()); |
160 | copyable&cr(factory_wrapper<copyable&>(f: factory<copyable&>())); |
161 | copyable&cr2 = factory_wrapper<copyable&>(f: factory<copyable&>()); |
162 | ::boost::movelib::ignore(cr); |
163 | ::boost::movelib::ignore(cr2); |
164 | ::boost::movelib::ignore(c); |
165 | } |
166 | |
167 | { |
168 | //copy_movable |
169 | copy_movable c (factory_wrapper<copy_movable>(f: factory<copy_movable>())); |
170 | c = factory_wrapper<copy_movable>(f: factory<copy_movable>()); |
171 | copy_movable&cr(factory_wrapper<copy_movable&>(f: factory<copy_movable&>())); |
172 | copy_movable&cr2 = factory_wrapper<copy_movable&>(f: factory<copy_movable&>()); |
173 | ::boost::movelib::ignore(cr); |
174 | ::boost::movelib::ignore(cr2); |
175 | ::boost::movelib::ignore(c); |
176 | } |
177 | |
178 | return 0; |
179 | } |
180 |