| ////////////////////////////////////////////////////////////////////////////// |
| // |
| // (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> |