// Copyright (C) 2007-8 Anthony Williams // // 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) #define BOOST_THREAD_VERSION 2 #define BOOST_TEST_MODULE Boost.Threads: move function test suite #include #include #include #include void do_nothing() {} BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction) { boost::thread src(&do_nothing); boost::thread::id src_id=src.get_id(); boost::thread dest(boost::move(src)); boost::thread::id dest_id=dest.get_id(); BOOST_CHECK(src_id==dest_id); BOOST_CHECK(src.get_id()==boost::thread::id()); dest.join(); } BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_assignment) { boost::thread src(&do_nothing); boost::thread::id src_id=src.get_id(); boost::thread dest; dest=boost::move(src); boost::thread::id dest_id=dest.get_id(); BOOST_CHECK(src_id==dest_id); BOOST_CHECK(src.get_id()==boost::thread::id()); dest.join(); } boost::thread start_thread() { return boost::thread(&do_nothing); } BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction) { boost::thread x(start_thread()); BOOST_CHECK(x.get_id()!=boost::thread::id()); x.join(); } BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move) { //boost::thread x(boost::move(start_thread())); boost::thread x=start_thread(); BOOST_CHECK(x.get_id()!=boost::thread::id()); x.join(); } BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction) { boost::mutex m; boost::unique_lock l(m); BOOST_CHECK(l.owns_lock()); BOOST_CHECK(l.mutex()==&m); boost::unique_lock l2(boost::move(l)); BOOST_CHECK(!l.owns_lock()); BOOST_CHECK(!l.mutex()); BOOST_CHECK(l2.owns_lock()); BOOST_CHECK(l2.mutex()==&m); } boost::unique_lock get_lock(boost::mutex& m) { return boost::unique_lock(m); } BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction) { boost::mutex m; boost::unique_lock l(get_lock(m)); BOOST_CHECK(l.owns_lock()); BOOST_CHECK(l.mutex()==&m); } namespace user_test_ns { template T move(T& t) { return t.move(); } bool move_called=false; struct nc: public boost::shared_ptr { #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES nc() {} nc(nc&&) { move_called=true; } #endif nc move() { move_called=true; return nc(); } }; } namespace boost { BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc) } BOOST_AUTO_TEST_CASE(test_move_for_user_defined_type_unaffected) { user_test_ns::nc src; #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES user_test_ns::nc dest=boost::move(src); #else user_test_ns::nc dest=move(src); #endif BOOST_CHECK(user_test_ns::move_called); }