1 // Copyright (C) 2007-8 Anthony Williams
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)
6 #define BOOST_THREAD_VERSION 2
7 #define BOOST_TEST_MODULE Boost.Threads: move function test suite
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>
17 BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction
)
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());
28 BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_assignment
)
30 boost::thread
src(do_nothing
);
31 boost::thread::id src_id
=src
.get_id();
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());
40 boost::thread
start_thread()
42 return boost::thread(do_nothing
);
45 BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction
)
47 boost::thread
x(start_thread());
48 BOOST_CHECK(x
.get_id()!=boost::thread::id());
52 BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move
)
54 //boost::thread x(boost::move(start_thread()));
55 boost::thread x
=start_thread();
56 BOOST_CHECK(x
.get_id()!=boost::thread::id());
60 BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction
)
63 boost::unique_lock
<boost::mutex
> l(m
);
64 BOOST_CHECK(l
.owns_lock());
65 BOOST_CHECK(l
.mutex()==&m
);
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
);
74 boost::unique_lock
<boost::mutex
> get_lock(boost::mutex
& m
)
76 return boost::unique_lock
<boost::mutex
>(m
);
80 BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction
)
83 boost::unique_lock
<boost::mutex
> l(get_lock(m
));
84 BOOST_CHECK(l
.owns_lock());
85 BOOST_CHECK(l
.mutex()==&m
);
88 namespace user_test_ns
96 bool move_called
=false;
99 public boost::shared_ptr
<int>
101 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
118 BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc
)
121 BOOST_AUTO_TEST_CASE(test_move_for_user_defined_type_unaffected
)
123 user_test_ns::nc src
;
124 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
125 user_test_ns::nc dest
=boost::move(src
);
127 user_test_ns::nc dest
=move(src
);
129 BOOST_CHECK(user_test_ns::move_called
);