diff options
Diffstat (limited to 'src/boost/libs/move/test/construct_forward.cpp')
-rw-r--r-- | src/boost/libs/move/test/construct_forward.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/boost/libs/move/test/construct_forward.cpp b/src/boost/libs/move/test/construct_forward.cpp new file mode 100644 index 00000000..87c9a809 --- /dev/null +++ b/src/boost/libs/move/test/construct_forward.cpp @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009-2012. +// 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 <boost/utility/enable_if.hpp> +#include "../example/movable.hpp" +#include "../example/copymovable.hpp" +#include <cstdio> + +class non_movable +{ + public: + non_movable() + {} +}; + +template<class MaybeRvalue> +void catch_test(BOOST_RV_REF(MaybeRvalue) x + #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES + ,typename ::boost::enable_if< ::boost::has_move_emulation_enabled<MaybeRvalue> >::type* = 0 + #endif //BOOST_NO_CXX11_RVALUE_REFERENCES + ) +{ (void)x;} + +template<class MaybeRvalue> +void catch_test(BOOST_COPY_ASSIGN_REF(MaybeRvalue) x + #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES + ,typename ::boost::enable_if< ::boost::has_move_emulation_enabled<MaybeRvalue> >::type* = 0 + #endif //BOOST_NO_CXX11_RVALUE_REFERENCES + ) + +{ (void)x;} + +template<class MaybeRvalue> +void catch_test(MaybeRvalue &x + #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES + ,typename ::boost::enable_if< ::boost::has_move_emulation_enabled<MaybeRvalue> >::type* = 0 + #endif //BOOST_NO_CXX11_RVALUE_REFERENCES + ) +{ (void)x;} + + #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES +template<class MaybeRvalue> +void catch_test(const MaybeRvalue& x + ,typename ::boost::disable_if< ::boost::has_move_emulation_enabled<MaybeRvalue> >::type* = 0 + ) +{ (void)x;} + #endif //BOOST_NO_CXX11_RVALUE_REFERENCES + +movable create_movable() +{ return movable(); } + +copy_movable create_copy_movable() +{ return copy_movable(); } + +non_movable create_non_movable() +{ return non_movable(); } + + +void catch_test() +{ + movable m; + const movable constm; + catch_test<movable>(boost::move(m)); + #ifdef BOOST_CATCH_CONST_RLVALUE + catch_test<movable>(create_movable()); + #endif + catch_test<movable>(m); + catch_test<movable>(constm); + copy_movable cm; + const copy_movable constcm; + catch_test<copy_movable>(boost::move(cm)); + catch_test<copy_movable>(create_copy_movable()); + catch_test<copy_movable>(cm); + catch_test<copy_movable>(constcm); + non_movable nm; + const non_movable constnm; + catch_test<non_movable>(boost::move(nm)); + catch_test<non_movable>(create_non_movable()); + catch_test<non_movable>(nm); + catch_test<non_movable>(constnm); +} + +template<class MaybeMovableOnly, class MaybeRvalue> +void function_construct(BOOST_FWD_REF(MaybeRvalue) x) +{ + //Moves in case Convertible is boost::rv<movable> copies otherwise + //For C++0x perfect forwarding + MaybeMovableOnly m(boost::forward<MaybeRvalue>(x)); +} + +void forward_test() +{ + movable m; + function_construct<movable>(boost::move(m)); +// non_movable nm; +// function_construct<non_movable>(boost::move(nm)); +// const non_movable cnm; +// function_construct<non_movable>(cnm); +} + +int main() +{ + catch_test(); + forward_test(); + return 0; +} + +#include <boost/move/detail/config_end.hpp> |