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()14 void do_nothing()
15 {}
16 
BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction)17 BOOST_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)28 BOOST_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()40 boost::thread start_thread()
41 {
42     return boost::thread(&do_nothing);
43 }
44 
BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction)45 BOOST_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)52 BOOST_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)60 BOOST_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)74 boost::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)80 BOOST_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)121 BOOST_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