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
16movable function(movable m)
17{
18 return movable(boost::move(t&: m));
19}
20
21movable functionr(BOOST_RV_REF(movable) m)
22{
23 return movable(boost::move(t&: m));
24}
25
26movable function2(movable m)
27{
28 return boost::move(t&: m);
29}
30
31BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m)
32{
33 return boost::move(t&: m);
34}
35
36movable move_return_function2 ()
37{
38 return movable();
39}
40
41movable move_return_function ()
42{
43 movable m;
44 return (boost::move(t&: m));
45}
46
47
48//Catch by value
49void function_value(movable)
50{}
51
52//Catch by reference
53void function_ref(const movable &)
54{}
55
56//Catch by reference
57void function_ref(BOOST_RV_REF(movable))
58{}
59
60movable create_movable()
61{ return movable(); }
62
63template<class Type>
64struct factory
65{
66 Type operator()() const
67 {
68 Type t;
69 return BOOST_MOVE_RET(Type, t);
70 }
71};
72
73template<class Type>
74struct factory<Type &>
75{
76 static Type t;
77 Type &operator()() const
78 {
79 return BOOST_MOVE_RET(Type&, t);
80 }
81};
82
83template<class Type>
84Type factory<Type&>::t;
85
86template <class R, class F>
87R factory_wrapper(F f)
88{
89 // lock();
90 R r = f();
91 // unlock();
92 return BOOST_MOVE_RET(R, r);
93}
94
95int 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

source code of boost/libs/move/test/move.cpp