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
14void do_nothing()
15{}
16
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(t&: 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
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(t&: 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
40boost::thread start_thread()
41{
42 return boost::thread(&do_nothing);
43}
44
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
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
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(t&: 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
74boost::unique_lock<boost::mutex> get_lock(boost::mutex& m)
75{
76 return boost::unique_lock<boost::mutex>(m);
77}
78
79
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
88namespace user_test_ns
89{
90 template<typename 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
102 nc() {}
103 nc(nc&&)
104 {
105 move_called=true;
106 }
107#endif
108 nc move()
109 {
110 move_called=true;
111 return nc();
112 }
113 };
114}
115
116namespace boost
117{
118 BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc)
119}
120
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(t&: 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

source code of boost/libs/thread/test/test_move_function.cpp