]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/move/test/move_if_noexcept.cpp
a03a821922c9b8049ba563ed32b55d208296d070
1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Antony Polukhin 2014.
4 // (C) Copyright Ion Gaztanaga 2014.
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // See http://www.boost.org/libs/move for documentation.
11 //////////////////////////////////////////////////////////////////////////////
12 #include <boost/move/detail/config_begin.hpp>
13 #include <boost/move/utility.hpp>
14 #include <boost/core/lightweight_test.hpp>
15 #include "../example/movable.hpp"
16 #include "../example/copymovable.hpp"
17 #include <boost/static_assert.hpp>
19 //////////////////////////////////////////////////////////////////////////////
20 //A copy_movable_noexcept class
21 class copy_movable_noexcept
23 BOOST_COPYABLE_AND_MOVABLE(copy_movable_noexcept
)
27 copy_movable_noexcept() : value_(1){}
29 //Move constructor and assignment
30 copy_movable_noexcept(BOOST_RV_REF(copy_movable_noexcept
) m
)
31 { value_
= m
.value_
; m
.value_
= 0; }
33 copy_movable_noexcept(const copy_movable_noexcept
&m
)
34 { value_
= m
.value_
; }
36 copy_movable_noexcept
& operator=(BOOST_RV_REF(copy_movable_noexcept
) m
)
37 { value_
= m
.value_
; m
.value_
= 0; return *this; }
39 copy_movable_noexcept
& operator=(BOOST_COPY_ASSIGN_REF(copy_movable_noexcept
) m
)
40 { value_
= m
.value_
; return *this; }
42 bool moved() const //Observer
43 { return value_
== 0; }
49 struct has_nothrow_move
<copy_movable_noexcept
>
51 static const bool value
= true;
56 //////////////////////////////////////////////////////////////////////////////
57 //A movable_throwable class
58 class movable_throwable
60 BOOST_MOVABLE_BUT_NOT_COPYABLE(movable_throwable
)
64 movable_throwable() : value_(1){}
66 //Move constructor and assignment
67 movable_throwable(BOOST_RV_REF(movable_throwable
) m
)
68 { value_
= m
.value_
; m
.value_
= 0; }
70 movable_throwable
& operator=(BOOST_RV_REF(movable_throwable
) m
)
71 { value_
= m
.value_
; m
.value_
= 0; return *this; }
73 bool moved() const //Observer
76 int value() const //Observer
81 //////////////////////////////////////////////////////////////////////////////
83 movable
function(movable m
)
85 return movable(boost::move_if_noexcept(m
));
88 copy_movable
function(copy_movable m
)
90 return copy_movable(boost::move_if_noexcept(m
));
93 copy_movable_noexcept
function(copy_movable_noexcept m
)
95 return copy_movable_noexcept(boost::move_if_noexcept(m
));
98 movable_throwable
function(movable_throwable m
)
100 return movable_throwable(boost::move_if_noexcept(m
));
103 movable
functionr(BOOST_RV_REF(movable
) m
)
105 return movable(boost::move_if_noexcept(m
));
108 movable
function2(movable m
)
110 return boost::move_if_noexcept(m
);
113 BOOST_RV_REF(movable
) function2r(BOOST_RV_REF(movable
) m
)
115 return boost::move_if_noexcept(m
);
118 movable
move_return_function2 ()
123 movable
move_return_function ()
126 return (boost::move_if_noexcept(m
));
129 #define BOOST_CHECK(x) if (!(x)) { return __LINE__; }
135 movable
m2(boost::move_if_noexcept(m
));
136 BOOST_CHECK(m
.moved());
137 movable
m3(function(movable(boost::move_if_noexcept(m2
))));
138 BOOST_CHECK(m2
.moved());
139 movable
m4(function(boost::move_if_noexcept(m3
)));
140 BOOST_CHECK(m3
.moved());
141 BOOST_CHECK(!m4
.moved());
145 movable
m2(boost::move_if_noexcept(m
));
146 BOOST_CHECK(m
.moved());
147 movable
m3(functionr(movable(boost::move_if_noexcept(m2
))));
148 BOOST_CHECK(m2
.moved());
149 movable
m4(functionr(boost::move_if_noexcept(m3
)));
150 BOOST_CHECK(m3
.moved());
151 BOOST_CHECK(!m4
.moved());
155 movable
m2(boost::move_if_noexcept(m
));
156 BOOST_CHECK(m
.moved());
157 movable
m3(function2(movable(boost::move_if_noexcept(m2
))));
158 BOOST_CHECK(m2
.moved());
159 movable
m4(function2(boost::move_if_noexcept(m3
)));
160 BOOST_CHECK(m3
.moved());
161 BOOST_CHECK(!m4
.moved());
165 movable
m2(boost::move_if_noexcept(m
));
166 BOOST_CHECK(m
.moved());
167 movable
m3(function2r(movable(boost::move_if_noexcept(m2
))));
168 BOOST_CHECK(m2
.moved());
169 movable
m4(function2r(boost::move_if_noexcept(m3
)));
170 BOOST_CHECK(m3
.moved());
171 BOOST_CHECK(!m4
.moved());
175 movable
m2(boost::move_if_noexcept(m
));
176 BOOST_CHECK(m
.moved());
177 BOOST_CHECK(!m2
.moved());
178 movable
m3(move_return_function());
179 BOOST_CHECK(!m3
.moved());
183 movable
m2(boost::move_if_noexcept(m
));
184 BOOST_CHECK(m
.moved());
185 BOOST_CHECK(!m2
.moved());
186 movable
m3(move_return_function2());
187 BOOST_CHECK(!m3
.moved());
190 // copy_movable may throw during move, so it must be copied
193 copy_movable
m2(boost::move_if_noexcept(m
));
194 BOOST_CHECK(!m
.moved());
195 copy_movable
m3(function(copy_movable(boost::move_if_noexcept(m2
))));
196 BOOST_CHECK(!m2
.moved());
197 copy_movable
m4(function(boost::move_if_noexcept(m3
)));
198 BOOST_CHECK(!m3
.moved());
199 BOOST_CHECK(!m4
.moved());
203 // copy_movable_noexcept can not throw during move
205 copy_movable_noexcept m
;
206 copy_movable_noexcept
m2(boost::move_if_noexcept(m
));
207 BOOST_CHECK(m
.moved());
208 copy_movable_noexcept
m3(function(copy_movable_noexcept(boost::move_if_noexcept(m2
))));
209 BOOST_CHECK(m2
.moved());
210 copy_movable_noexcept
m4(function(boost::move_if_noexcept(m3
)));
211 BOOST_CHECK(m3
.moved());
212 BOOST_CHECK(!m4
.moved());
215 // movable_throwable can not throw during move but it has no copy constructor
218 movable_throwable
m2(boost::move_if_noexcept(m
));
219 BOOST_CHECK(m
.moved());
220 movable_throwable
m3(function(movable_throwable(boost::move_if_noexcept(m2
))));
221 BOOST_CHECK(m2
.moved());
222 movable_throwable
m4(function(boost::move_if_noexcept(m3
)));
223 BOOST_CHECK(m3
.moved());
224 BOOST_CHECK(!m4
.moved());
227 return boost::report_errors();
230 #include <boost/move/detail/config_end.hpp>