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>