Squashed 'third_party/boostorg/move/' content from commit d503fbe
Change-Id: I5f8ac37161a1044b02ffb1f59cf15622fc6acd17
git-subtree-dir: third_party/boostorg/move
git-subtree-split: d503fbe1c8334fa8885e67cb83c96aeaf3938555
diff --git a/test/move.cpp b/test/move.cpp
new file mode 100644
index 0000000..2d40ec8
--- /dev/null
+++ b/test/move.cpp
@@ -0,0 +1,183 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// (C) Copyright Ion Gaztanaga 2009-2014.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/utility_core.hpp>
+#include "../example/movable.hpp"
+#include "../example/copymovable.hpp"
+#include <boost/static_assert.hpp>
+
+movable function(movable m)
+{
+ return movable(boost::move(m));
+}
+
+movable functionr(BOOST_RV_REF(movable) m)
+{
+ return movable(boost::move(m));
+}
+
+movable function2(movable m)
+{
+ return boost::move(m);
+}
+
+BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m)
+{
+ return boost::move(m);
+}
+
+movable move_return_function2 ()
+{
+ return movable();
+}
+
+movable move_return_function ()
+{
+ movable m;
+ return (boost::move(m));
+}
+
+
+//Catch by value
+void function_value(movable)
+{}
+
+//Catch by reference
+void function_ref(const movable &)
+{}
+
+//Catch by reference
+void function_ref(BOOST_RV_REF(movable))
+{}
+
+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)
+ BOOST_STATIC_ASSERT((boost::has_nothrow_move<movable>::value == true));
+ BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable>::value == false));
+ BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable*>::value == false));
+ BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int>::value == false));
+ BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int&>::value == false));
+ BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int*>::value == false));
+ #endif
+
+ {
+ movable m;
+ 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;
+}
+
+#include <boost/move/detail/config_end.hpp>