Added BOOST_MOVE_RET

This commit is contained in:
Ion Gaztañaga
2014-02-15 23:04:15 +01:00
parent 51dc02e043
commit 062000ed68
7 changed files with 496 additions and 129 deletions
+71 -3
View File
@@ -11,6 +11,7 @@
#include <boost/move/detail/config_begin.hpp>
#include <boost/move/utility.hpp>
#include "../example/movable.hpp"
#include "../example/copymovable.hpp"
#include <boost/static_assert.hpp>
movable function(movable m)
@@ -57,11 +58,41 @@ void function_ref(const movable &)
void function_ref(BOOST_RV_REF(movable))
{}
struct copyable
{};
movable create_movable()
{ return movable(); }
template<class Type>
struct factory
{
Type operator()() const
{
Type t;
return BOOST_MOVE_RET(Type, t);
}
};
template<class Type>
struct factory<Type &>
{
static Type t;
Type &operator()() const
{
return BOOST_MOVE_RET(Type&, t);
}
};
template<class Type>
Type factory<Type&>::t;
template <class R, class F>
R factory_wrapper(F f)
{
// lock();
R r = f();
// unlock();
return BOOST_MOVE_RET(R, r);
}
int main()
{
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
@@ -78,35 +109,72 @@ int main()
movable m2(boost::move(m));
movable m3(function(movable(boost::move(m2))));
movable m4(function(boost::move(m3)));
(void)m;(void)m2;(void)m3;(void)m4;
}
{
movable m;
movable m2(boost::move(m));
movable m3(functionr(movable(boost::move(m2))));
movable m4(functionr(boost::move(m3)));
(void)m;(void)m2;(void)m3;(void)m4;
}
{
movable m;
movable m2(boost::move(m));
movable m3(function2(movable(boost::move(m2))));
movable m4(function2(boost::move(m3)));
(void)m;(void)m2;(void)m3;(void)m4;
}
{
movable m;
movable m2(boost::move(m));
movable m3(function2r(movable(boost::move(m2))));
movable m4(function2r(boost::move(m3)));
(void)m;(void)m2;(void)m3;(void)m4;
}
{
movable m;
movable m2(boost::move(m));
movable m3(move_return_function());
(void)m;(void)m2;(void)m3;
}
{
movable m;
movable m2(boost::move(m));
movable m3(move_return_function2());
(void)m;(void)m2;(void)m3;
}
{
//movable
movable m (factory_wrapper<movable>(factory<movable>()));
m = factory_wrapper<movable>(factory<movable>());
movable&mr(factory_wrapper<movable&>(factory<movable&>()));
movable&mr2 = factory_wrapper<movable&>(factory<movable&>());
(void)mr;
(void)mr2;
(void)m;
}
{
//copyable
copyable c (factory_wrapper<copyable>(factory<copyable>()));
c = factory_wrapper<copyable>(factory<copyable>());
copyable&cr(factory_wrapper<copyable&>(factory<copyable&>()));
copyable&cr2 = factory_wrapper<copyable&>(factory<copyable&>());
(void)cr;
(void)cr2;
(void)c;
}
{
//copy_movable
copy_movable c (factory_wrapper<copy_movable>(factory<copy_movable>()));
c = factory_wrapper<copy_movable>(factory<copy_movable>());
copy_movable&cr(factory_wrapper<copy_movable&>(factory<copy_movable&>()));
copy_movable&cr2 = factory_wrapper<copy_movable&>(factory<copy_movable&>());
(void)cr;
(void)cr2;
(void)c;
}
return 0;
}