1 //////////////////////////////////////////////////////////////////////////////
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)
9 // See http://www.boost.org/libs/move for documentation.
11 //////////////////////////////////////////////////////////////////////////////
12 #include <boost/move/utility_core.hpp>
13 #include <boost/core/ignore_unused.hpp>
14 #include "../example/movable.hpp"
15 #include "../example/copymovable.hpp"
16 #include <boost/static_assert.hpp>
18 movable
function(movable m
)
20 return movable(boost::move(m
));
23 movable
functionr(BOOST_RV_REF(movable
) m
)
25 return movable(boost::move(m
));
28 movable
function2(movable m
)
30 return boost::move(m
);
33 BOOST_RV_REF(movable
) function2r(BOOST_RV_REF(movable
) m
)
35 return boost::move(m
);
38 movable
move_return_function2 ()
43 movable
move_return_function ()
46 return (boost::move(m
));
51 void function_value(movable
)
55 void function_ref(const movable
&)
59 void function_ref(BOOST_RV_REF(movable
))
62 movable
create_movable()
68 Type
operator()() const
71 return BOOST_MOVE_RET(Type
, t
);
76 struct factory
<Type
&>
79 Type
&operator()() const
81 return BOOST_MOVE_RET(Type
&, t
);
86 Type factory
<Type
&>::t
;
88 template <class R
, class F
>
89 R
factory_wrapper(F f
)
94 return BOOST_MOVE_RET(R
, r
);
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));
110 movable
m2(boost::move(m
));
111 movable
m3(function(movable(boost::move(m2
))));
112 movable
m4(function(boost::move(m3
)));
113 ::boost::ignore_unused(m
);::boost::ignore_unused(m2
);::boost::ignore_unused(m3
);::boost::ignore_unused(m4
);
117 movable
m2(boost::move(m
));
118 movable
m3(functionr(movable(boost::move(m2
))));
119 movable
m4(functionr(boost::move(m3
)));
120 ::boost::ignore_unused(m
);::boost::ignore_unused(m2
);::boost::ignore_unused(m3
);::boost::ignore_unused(m4
);
124 movable
m2(boost::move(m
));
125 movable
m3(function2(movable(boost::move(m2
))));
126 movable
m4(function2(boost::move(m3
)));
127 ::boost::ignore_unused(m
);::boost::ignore_unused(m2
);::boost::ignore_unused(m3
);::boost::ignore_unused(m4
);
131 movable
m2(boost::move(m
));
132 movable
m3(function2r(movable(boost::move(m2
))));
133 movable
m4(function2r(boost::move(m3
)));
134 ::boost::ignore_unused(m
);::boost::ignore_unused(m2
);::boost::ignore_unused(m3
);::boost::ignore_unused(m4
);
138 movable
m2(boost::move(m
));
139 movable
m3(move_return_function());
140 ::boost::ignore_unused(m
);::boost::ignore_unused(m2
);::boost::ignore_unused(m3
);
144 movable
m2(boost::move(m
));
145 movable
m3(move_return_function2());
146 ::boost::ignore_unused(m
);::boost::ignore_unused(m2
);::boost::ignore_unused(m3
);
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 ::boost::ignore_unused(mr
);
155 ::boost::ignore_unused(mr2
);
156 ::boost::ignore_unused(m
);
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 ::boost::ignore_unused(cr
);
165 ::boost::ignore_unused(cr2
);
166 ::boost::ignore_unused(c
);
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 ::boost::ignore_unused(cr
);
176 ::boost::ignore_unused(cr2
);
177 ::boost::ignore_unused(c
);