1 // Copyright (C) 2007-8 Anthony Williams 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #define BOOST_THREAD_VERSION 2 7 #define BOOST_TEST_MODULE Boost.Threads: move function test suite 8 9 #include <boost/thread/thread_only.hpp> 10 #include <boost/test/unit_test.hpp> 11 #include <boost/thread/mutex.hpp> 12 #include <boost/shared_ptr.hpp> 13 do_nothing()14void do_nothing() 15 {} 16 BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction)17BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction) 18 { 19 boost::thread src(&do_nothing); 20 boost::thread::id src_id=src.get_id(); 21 boost::thread dest(boost::move(src)); 22 boost::thread::id dest_id=dest.get_id(); 23 BOOST_CHECK(src_id==dest_id); 24 BOOST_CHECK(src.get_id()==boost::thread::id()); 25 dest.join(); 26 } 27 BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_assignment)28BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_assignment) 29 { 30 boost::thread src(&do_nothing); 31 boost::thread::id src_id=src.get_id(); 32 boost::thread dest; 33 dest=boost::move(src); 34 boost::thread::id dest_id=dest.get_id(); 35 BOOST_CHECK(src_id==dest_id); 36 BOOST_CHECK(src.get_id()==boost::thread::id()); 37 dest.join(); 38 } 39 start_thread()40boost::thread start_thread() 41 { 42 return boost::thread(&do_nothing); 43 } 44 BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction)45BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction) 46 { 47 boost::thread x(start_thread()); 48 BOOST_CHECK(x.get_id()!=boost::thread::id()); 49 x.join(); 50 } 51 BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move)52BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move) 53 { 54 //boost::thread x(boost::move(start_thread())); 55 boost::thread x=start_thread(); 56 BOOST_CHECK(x.get_id()!=boost::thread::id()); 57 x.join(); 58 } 59 BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction)60BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction) 61 { 62 boost::mutex m; 63 boost::unique_lock<boost::mutex> l(m); 64 BOOST_CHECK(l.owns_lock()); 65 BOOST_CHECK(l.mutex()==&m); 66 67 boost::unique_lock<boost::mutex> l2(boost::move(l)); 68 BOOST_CHECK(!l.owns_lock()); 69 BOOST_CHECK(!l.mutex()); 70 BOOST_CHECK(l2.owns_lock()); 71 BOOST_CHECK(l2.mutex()==&m); 72 } 73 get_lock(boost::mutex & m)74boost::unique_lock<boost::mutex> get_lock(boost::mutex& m) 75 { 76 return boost::unique_lock<boost::mutex>(m); 77 } 78 79 BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction)80BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction) 81 { 82 boost::mutex m; 83 boost::unique_lock<boost::mutex> l(get_lock(m)); 84 BOOST_CHECK(l.owns_lock()); 85 BOOST_CHECK(l.mutex()==&m); 86 } 87 88 namespace user_test_ns 89 { 90 template<typename T> move(T & t)91 T move(T& t) 92 { 93 return t.move(); 94 } 95 96 bool move_called=false; 97 98 struct nc: 99 public boost::shared_ptr<int> 100 { 101 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES ncuser_test_ns::nc102 nc() {} ncuser_test_ns::nc103 nc(nc&&) 104 { 105 move_called=true; 106 } 107 #endif moveuser_test_ns::nc108 nc move() 109 { 110 move_called=true; 111 return nc(); 112 } 113 }; 114 } 115 116 namespace boost 117 { 118 BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc) 119 } 120 BOOST_AUTO_TEST_CASE(test_move_for_user_defined_type_unaffected)121BOOST_AUTO_TEST_CASE(test_move_for_user_defined_type_unaffected) 122 { 123 user_test_ns::nc src; 124 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES 125 user_test_ns::nc dest=boost::move(src); 126 #else 127 user_test_ns::nc dest=move(src); 128 #endif 129 BOOST_CHECK(user_test_ns::move_called); 130 } 131 132 133 134 135