]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/thread/test/test_move_function.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / thread / test / test_move_function.cpp
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
14 void do_nothing()
15 {}
16
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
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
40 boost::thread start_thread()
41 {
42 return boost::thread(do_nothing);
43 }
44
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
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
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
74 boost::unique_lock<boost::mutex> get_lock(boost::mutex& m)
75 {
76 return boost::unique_lock<boost::mutex>(m);
77 }
78
79
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>
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
116 namespace boost
117 {
118 BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc)
119 }
120
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