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