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 // [email protected] 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 { BOOST_NOEXCEPT_IFNothrowBoth28 NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {}; operator =NothrowBoth29 void operator=(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {}; 30 }; 31 struct NothrowCtor { BOOST_NOEXCEPT_IFNothrowCtor32 NothrowCtor(NothrowCtor&&) BOOST_NOEXCEPT_IF(true) {}; operator =NothrowCtor33 void operator=(NothrowCtor&&) BOOST_NOEXCEPT_IF(false) {}; 34 }; 35 struct NothrowAssign { BOOST_NOEXCEPT_IFNothrowAssign36 NothrowAssign(NothrowAssign&&) BOOST_NOEXCEPT_IF(false) {}; operator =NothrowAssign37 void operator=(NothrowAssign&&) BOOST_NOEXCEPT_IF(true) {}; 38 }; 39 struct NothrowNone { BOOST_NOEXCEPT_IFNothrowNone40 NothrowNone(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {}; operator =NothrowNone41 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 test_noexcept_optional_with_operator()80void 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 main()111int main() 112 { 113 return 0; 114 } 115 116 117