]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/optional/test/optional_test_noexcept_move.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / optional / test / optional_test_noexcept_move.cpp
1 // Copyright (C) 2014 Andrzej Krzemienski.
2 //
3 // Use, modification, and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/lib/optional for documentation.
8 //
9 // You are welcome to contact the author at:
10 // akrzemi1@gmail.com
11
12 #include "boost/static_assert.hpp"
13 #include "boost/optional/optional.hpp"
14
15 #ifdef BOOST_BORLANDC
16 #pragma hdrstop
17 #endif
18
19
20 using boost::optional;
21
22
23 #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
24 #ifndef BOOST_NO_CXX11_NOEXCEPT
25
26 // these 4 classes have different noexcept signatures in move operations
27 struct NothrowBoth {
28 NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
29 void operator=(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
30 };
31 struct NothrowCtor {
32 NothrowCtor(NothrowCtor&&) BOOST_NOEXCEPT_IF(true) {};
33 void operator=(NothrowCtor&&) BOOST_NOEXCEPT_IF(false) {};
34 };
35 struct NothrowAssign {
36 NothrowAssign(NothrowAssign&&) BOOST_NOEXCEPT_IF(false) {};
37 void operator=(NothrowAssign&&) BOOST_NOEXCEPT_IF(true) {};
38 };
39 struct NothrowNone {
40 NothrowNone(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
41 void operator=(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
42 };
43
44 #if 0 // these also test type_traits, which are wrong
45 void test_noexcept_as_defined() // this is a compile-time test
46 {
47 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowBoth>::value);
48 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowBoth>::value);
49
50 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowCtor>::value);
51 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowCtor>::value);
52
53 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowAssign>::value);
54 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowAssign>::value);
55
56 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowNone>::value);
57 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowNone>::value);
58 }
59
60 void test_noexcept_on_optional_with_type_traits() // this is a compile-time test
61 {
62 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowBoth> >::value);
63 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<optional<NothrowBoth> >::value);
64 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowBoth>()));
65
66 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowCtor> >::value);
67 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowCtor> >::value);
68 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowCtor>()));
69
70 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowAssign> >::value);
71 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowAssign> >::value);
72 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowAssign>()));
73
74 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowNone> >::value);
75 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowNone> >::value);
76 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowNone>()));
77 }
78 #endif
79
80 void test_noexcept_optional_with_operator() // compile-time test
81 {
82 typedef optional<NothrowBoth> ONx2;
83 typedef optional<NothrowCtor> ONxC;
84 typedef optional<NothrowAssign> ONxA;
85 typedef optional<NothrowNone> ONx0;
86 ONx2 onx2;
87 ONxC onxC;
88 ONxA onxA;
89 ONx0 onx0;
90
91 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2() ));
92 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2(boost::move(onx2)) ));
93 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( onx2 = ONx2() ));
94
95 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC() ));
96 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC(boost::move(onxC)) ));
97 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxC = ONxC() ));
98
99 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxA() ));
100 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONxA(boost::move(onxA)) ));
101 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxA = ONxA() ));
102
103 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx0() ));
104 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONx0(boost::move(onx0)) ));
105 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onx0 = ONx0() ));
106 }
107
108 #endif // !defned BOOST_NO_CXX11_NOEXCEPT
109 #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
110
111 int main()
112 {
113 return 0;
114 }
115
116