11 #ifndef NONSTD_OPTIONAL_LITE_HPP
12 #define NONSTD_OPTIONAL_LITE_HPP
14 #define optional_lite_MAJOR 3
15 #define optional_lite_MINOR 1
16 #define optional_lite_PATCH 1
18 #define optional_lite_VERSION optional_STRINGIFY(optional_lite_MAJOR) "." optional_STRINGIFY(optional_lite_MINOR) "." optional_STRINGIFY(optional_lite_PATCH)
20 #define optional_STRINGIFY( x ) optional_STRINGIFY_( x )
21 #define optional_STRINGIFY_( x ) #x
25 #define optional_OPTIONAL_DEFAULT 0
26 #define optional_OPTIONAL_NONSTD 1
27 #define optional_OPTIONAL_STD 2
29 #if !defined( optional_CONFIG_SELECT_OPTIONAL )
30 # define optional_CONFIG_SELECT_OPTIONAL ( optional_HAVE_STD_OPTIONAL ? optional_OPTIONAL_STD : optional_OPTIONAL_NONSTD )
35 #ifndef optional_CONFIG_NO_EXCEPTIONS
36 # if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)
37 # define optional_CONFIG_NO_EXCEPTIONS 0
39 # define optional_CONFIG_NO_EXCEPTIONS 1
46 #ifndef optional_CPLUSPLUS
47 # if defined(_MSVC_LANG ) && !defined(__clang__)
48 # define optional_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )
50 # define optional_CPLUSPLUS __cplusplus
54 #define optional_CPP98_OR_GREATER ( optional_CPLUSPLUS >= 199711L )
55 #define optional_CPP11_OR_GREATER ( optional_CPLUSPLUS >= 201103L )
56 #define optional_CPP11_OR_GREATER_ ( optional_CPLUSPLUS >= 201103L )
57 #define optional_CPP14_OR_GREATER ( optional_CPLUSPLUS >= 201402L )
58 #define optional_CPP17_OR_GREATER ( optional_CPLUSPLUS >= 201703L )
59 #define optional_CPP20_OR_GREATER ( optional_CPLUSPLUS >= 202000L )
63 #define optional_CPLUSPLUS_V ( optional_CPLUSPLUS / 100 - (optional_CPLUSPLUS > 200000 ? 2000 : 1994) )
67 #if optional_CPP17_OR_GREATER && defined(__has_include )
68 # if __has_include( <optional> )
69 # define optional_HAVE_STD_OPTIONAL 1
71 # define optional_HAVE_STD_OPTIONAL 0
74 # define optional_HAVE_STD_OPTIONAL 0
77 #define optional_USES_STD_OPTIONAL ( (optional_CONFIG_SELECT_OPTIONAL == optional_OPTIONAL_STD) || ((optional_CONFIG_SELECT_OPTIONAL == optional_OPTIONAL_DEFAULT) && optional_HAVE_STD_OPTIONAL) )
83 #ifndef nonstd_lite_HAVE_IN_PLACE_TYPES
84 #define nonstd_lite_HAVE_IN_PLACE_TYPES 1
88 #if optional_CPP17_OR_GREATER
97 using std::in_place_t;
98 using std::in_place_type_t;
99 using std::in_place_index_t;
101 #define nonstd_lite_in_place_t( T) std::in_place_t
102 #define nonstd_lite_in_place_type_t( T) std::in_place_type_t<T>
103 #define nonstd_lite_in_place_index_t(K) std::in_place_index_t<K>
105 #define nonstd_lite_in_place( T) std::in_place_t{}
106 #define nonstd_lite_in_place_type( T) std::in_place_type_t<T>{}
107 #define nonstd_lite_in_place_index(K) std::in_place_index_t<K>{}
111 #else // optional_CPP17_OR_GREATER
119 struct in_place_type_tag {};
121 template< std::
size_t K >
122 struct in_place_index_tag {};
126 struct in_place_t {};
129 inline in_place_t
in_place( detail::in_place_type_tag<T> = detail::in_place_type_tag<T>() )
134 template< std::
size_t K >
135 inline in_place_t
in_place( detail::in_place_index_tag<K> = detail::in_place_index_tag<K>() )
141 inline in_place_t
in_place_type( detail::in_place_type_tag<T> = detail::in_place_type_tag<T>() )
146 template< std::
size_t K >
147 inline in_place_t
in_place_index( detail::in_place_index_tag<K> = detail::in_place_index_tag<K>() )
154 #define nonstd_lite_in_place_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T> )
155 #define nonstd_lite_in_place_type_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T> )
156 #define nonstd_lite_in_place_index_t(K) nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag<K> )
158 #define nonstd_lite_in_place( T) nonstd::in_place_type<T>
159 #define nonstd_lite_in_place_type( T) nonstd::in_place_type<T>
160 #define nonstd_lite_in_place_index(K) nonstd::in_place_index<K>
164 #endif // optional_CPP17_OR_GREATER
165 #endif // nonstd_lite_HAVE_IN_PLACE_TYPES
171 #if optional_USES_STD_OPTIONAL
178 using std::bad_optional_access;
182 using std::nullopt_t;
184 using std::operator==;
185 using std::operator!=;
186 using std::operator<;
187 using std::operator<=;
188 using std::operator>;
189 using std::operator>=;
194 #else // optional_USES_STD_OPTIONAL
201 #ifndef optional_CONFIG_MAX_ALIGN_HACK
202 # define optional_CONFIG_MAX_ALIGN_HACK 0
205 #ifndef optional_CONFIG_ALIGN_AS
209 #ifndef optional_CONFIG_ALIGN_AS_FALLBACK
210 # define optional_CONFIG_ALIGN_AS_FALLBACK double
215 #if defined(__clang__)
216 # pragma clang diagnostic push
217 # pragma clang diagnostic ignored "-Wundef"
218 #elif defined(__GNUC__)
219 # pragma GCC diagnostic push
220 # pragma GCC diagnostic ignored "-Wundef"
221 #elif defined(_MSC_VER )
222 # pragma warning( push )
226 #define optional_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )
241 #if defined(_MSC_VER ) && !defined(__clang__)
242 # define optional_COMPILER_MSVC_VER (_MSC_VER )
243 # define optional_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )
245 # define optional_COMPILER_MSVC_VER 0
246 # define optional_COMPILER_MSVC_VERSION 0
249 #define optional_COMPILER_VERSION( major, minor, patch ) ( 10 * (10 * (major) + (minor) ) + (patch) )
251 #if defined(__GNUC__) && !defined(__clang__)
252 # define optional_COMPILER_GNUC_VERSION optional_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
254 # define optional_COMPILER_GNUC_VERSION 0
257 #if defined(__clang__)
258 # define optional_COMPILER_CLANG_VERSION optional_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
260 # define optional_COMPILER_CLANG_VERSION 0
263 #if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 140 )
264 # pragma warning( disable: 4345 ) // initialization behavior changed
267 #if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 150 )
268 # pragma warning( disable: 4814 ) // in C++14 'constexpr' will not imply 'const'
273 #define optional_HAVE(FEATURE) ( optional_HAVE_##FEATURE )
276 # define optional_HAS_CPP0X _HAS_CPP0X
278 # define optional_HAS_CPP0X 0
283 #if optional_COMPILER_MSVC_VER >= 1900
284 # undef optional_CPP11_OR_GREATER
285 # define optional_CPP11_OR_GREATER 1
288 #define optional_CPP11_90 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1500)
289 #define optional_CPP11_100 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1600)
290 #define optional_CPP11_110 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1700)
291 #define optional_CPP11_120 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1800)
292 #define optional_CPP11_140 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1900)
293 #define optional_CPP11_141 (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1910)
295 #define optional_CPP14_000 (optional_CPP14_OR_GREATER)
296 #define optional_CPP17_000 (optional_CPP17_OR_GREATER)
300 #define optional_HAVE_CONSTEXPR_11 optional_CPP11_140
301 #define optional_HAVE_IS_DEFAULT optional_CPP11_140
302 #define optional_HAVE_NOEXCEPT optional_CPP11_140
303 #define optional_HAVE_NULLPTR optional_CPP11_100
304 #define optional_HAVE_REF_QUALIFIER optional_CPP11_140
308 #define optional_HAVE_CONSTEXPR_14 optional_CPP14_000
312 #define optional_HAVE_NODISCARD optional_CPP17_000
316 #define optional_HAVE_CONDITIONAL optional_CPP11_120
317 #define optional_HAVE_REMOVE_CV optional_CPP11_120
318 #define optional_HAVE_TYPE_TRAITS optional_CPP11_90
320 #define optional_HAVE_TR1_TYPE_TRAITS (!! optional_COMPILER_GNUC_VERSION )
321 #define optional_HAVE_TR1_ADD_POINTER (!! optional_COMPILER_GNUC_VERSION )
325 #if optional_HAVE( CONSTEXPR_11 )
326 # define optional_constexpr constexpr
328 # define optional_constexpr
331 #if optional_HAVE( IS_DEFAULT )
332 # define optional_is_default = default;
334 # define optional_is_default {}
337 #if optional_HAVE( CONSTEXPR_14 )
338 # define optional_constexpr14 constexpr
340 # define optional_constexpr14
343 #if optional_HAVE( NODISCARD )
344 # define optional_nodiscard [[nodiscard]]
346 # define optional_nodiscard
349 #if optional_HAVE( NOEXCEPT )
350 # define optional_noexcept noexcept
352 # define optional_noexcept
355 #if optional_HAVE( NULLPTR )
356 # define optional_nullptr nullptr
358 # define optional_nullptr NULL
361 #if optional_HAVE( REF_QUALIFIER )
363 # define optional_ref_qual &
364 # define optional_refref_qual &&
366 # define optional_ref_qual
367 # define optional_refref_qual
372 #if optional_CONFIG_NO_EXCEPTIONS
375 # include <stdexcept>
378 #if optional_CPP11_OR_GREATER
379 # include <functional>
382 #if optional_HAVE( INITIALIZER_LIST )
383 # include <initializer_list>
386 #if optional_HAVE( TYPE_TRAITS )
387 # include <type_traits>
388 #elif optional_HAVE( TR1_TYPE_TRAITS )
389 # include <tr1/type_traits>
394 #if optional_CPP11_OR_GREATER
396 #define optional_REQUIRES_0(...) \
397 template< bool B = (__VA_ARGS__), typename std::enable_if<B, int>::type = 0 >
399 #define optional_REQUIRES_T(...) \
400 , typename = typename std::enable_if< (__VA_ARGS__), nonstd::optional_lite::detail::enabler >::type
402 #define optional_REQUIRES_R(R, ...) \
403 typename std::enable_if< (__VA_ARGS__), R>::type
405 #define optional_REQUIRES_A(...) \
406 , typename std::enable_if< (__VA_ARGS__), void*>::type = nullptr
414 namespace nonstd {
namespace optional_lite {
418 #if optional_CPP11_OR_GREATER
421 template<
typename T > T &
move( T & t ) {
return t; }
424 #if optional_HAVE( CONDITIONAL )
425 using std::conditional;
428 template<
typename T,
typename F >
struct conditional<false, T, F> {
typedef F
type; };
429 #endif // optional_HAVE_CONDITIONAL
433 #if optional_CPP11_OR_GREATER
439 #if optional_CPP17_OR_GREATER
441 using std::is_swappable;
442 using std::is_nothrow_swappable;
444 #elif optional_CPP11_OR_GREATER
452 template< typename T, typename = decltype( swap( std::declval<T&>(), std::declval<T&>() ) ) >
453 static std::true_type test(
int );
456 static std::false_type test(...);
459 struct is_nothrow_swappable
463 template<
typename T >
464 static constexpr
bool satisfies()
466 return noexcept(
swap( std::declval<T&>(), std::declval<T&>() ) );
469 template<
typename T >
470 static auto test(
int ) -> std::integral_constant<bool, satisfies<T>()>{}
473 static auto test(...) -> std::false_type;
480 template<
typename T >
481 struct is_swappable : decltype( detail::is_swappable::test<T>(0) ){};
483 template<
typename T >
484 struct is_nothrow_swappable : decltype( detail::is_nothrow_swappable::test<T>(0) ){};
486 #endif // optional_CPP17_OR_GREATER
494 template<
typename T >
497 typedef typename std::remove_cv< typename std::remove_reference<T>::type >::type type;
502 #endif // optional_CPP11_OR_GREATER
506 template<
typename T >
513 #if optional_CPP11_OR_GREATER
514 enum class enabler{};
521 template<
typename Head,
typename Tail >
528 #if optional_CONFIG_MAX_ALIGN_HACK
532 #define optional_UNIQUE( name ) optional_UNIQUE2( name, __LINE__ )
533 #define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line )
534 #define optional_UNIQUE3( name, line ) name ## line
536 #define optional_ALIGN_TYPE( type ) \
537 type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st )
539 template<
typename T >
560 #ifdef HAVE_LONG_LONG
566 Unknown ( * optional_UNIQUE(_) )( Unknown );
567 Unknown * Unknown::* optional_UNIQUE(_);
568 Unknown ( Unknown::* optional_UNIQUE(_) )( Unknown );
570 struct_t< Unknown ( * )( Unknown) > optional_UNIQUE(_);
571 struct_t< Unknown * Unknown::* > optional_UNIQUE(_);
572 struct_t< Unknown ( Unknown::* )(Unknown) > optional_UNIQUE(_);
575 #undef optional_UNIQUE
576 #undef optional_UNIQUE2
577 #undef optional_UNIQUE3
579 #undef optional_ALIGN_TYPE
581 #elif defined( optional_CONFIG_ALIGN_AS ) // optional_CONFIG_MAX_ALIGN_HACK
585 #define optional_ALIGN_AS( unused ) \
586 optional_CONFIG_ALIGN_AS
588 #else // optional_CONFIG_MAX_ALIGN_HACK
592 #define optional_ALIGN_AS( to_align ) \
593 typename type_of_size< alignment_types, alignment_of< to_align >::value >::type
595 template<
typename T >
598 template<
typename T >
606 template<
size_t A,
size_t S >
609 enum { value = A < S ? A : S };
612 template<
typename T >
619 template<
typename List,
size_t N >
623 N ==
sizeof(
typename List::head ),
634 template<
typename T>
637 #define optional_ALIGN_TYPE( type ) \
638 typelist< type , typelist< struct_t< type >
664 > > > > > > > > > > > > > >
665 > > > > > > > > > > > > > >
669 #undef optional_ALIGN_TYPE
671 #endif // optional_CONFIG_MAX_ALIGN_HACK
675 template<
typename T >
695 #if optional_CPP11_OR_GREATER
707 template< class... Args >
708 void emplace( Args&&... args )
713 template< class U, class... Args >
714 void emplace( std::initializer_list<U> il, Args&&... args )
728 return as<value_type>();
733 return as<value_type>();
746 #if optional_CPP11_OR_GREATER
760 #if optional_CPP11_OR_GREATER
762 using aligned_storage_t =
typename std::aligned_storage<
sizeof(
value_type),
alignof(
value_type) >::type;
763 aligned_storage_t
data;
765 #elif optional_CONFIG_MAX_ALIGN_HACK
767 typedef struct {
unsigned char data[
sizeof(
value_type) ]; } aligned_storage_t;
770 aligned_storage_t
data;
778 # undef optional_ALIGN_AS
780 #endif // optional_CONFIG_MAX_ALIGN_HACK
792 template <
typename U>
795 return reinterpret_cast<U*
>(
ptr() );
798 template <
typename U>
801 return reinterpret_cast<U
const *
>(
ptr() );
815 #if optional_HAVE( CONSTEXPR_11 )
824 #if ! optional_CONFIG_NO_EXCEPTIONS
826 class bad_optional_access :
public std::logic_error
829 explicit bad_optional_access()
830 : logic_error(
"bad optional access" ) {}
833 #endif //optional_CONFIG_NO_EXCEPTIONS
837 template<
typename T>
843 typedef void (
optional::*safe_bool)()
const;
852 : has_value_( false )
859 : has_value_(
false )
867 true || std::is_copy_constructible<T>::value
871 : has_value_( other.has_value() )
873 if ( other.has_value() )
875 contained.construct_value( other.contained.value() );
879 #if optional_CPP11_OR_GREATER
884 true || std::is_move_constructible<T>::value
887 ) noexcept( std::is_nothrow_move_constructible<T>::value )
888 : has_value_( other.has_value() )
890 if ( other.has_value() )
892 contained.construct_value(
std::move( other.contained.value() ) );
897 template<
typename U >
898 explicit optional( optional<U>
const & other
900 std::is_constructible<T, U const &>::value
901 && !std::is_constructible<T, optional<U> & >::
value
902 && !std::is_constructible<T, optional<U> && >::
value
903 && !std::is_constructible<T, optional<U>
const & >::
value
904 && !std::is_constructible<T, optional<U>
const && >::
value
905 && !std::is_convertible< optional<U> & , T>::
value
906 && !std::is_convertible< optional<U> && , T>::
value
907 && !std::is_convertible< optional<U>
const & , T>::
value
908 && !std::is_convertible< optional<U>
const &&, T>::
value
909 && !std::is_convertible< U const & , T>::value
912 : has_value_( other.has_value() )
914 if ( other.has_value() )
916 contained.construct_value( T{ other.contained.value() } );
919 #endif // optional_CPP11_OR_GREATER
922 template<
typename U >
927 std::is_constructible<T, U const &>::value
936 && std::is_convertible< U const & , T>::value
940 : has_value_( other.has_value() )
942 if ( other.has_value() )
944 contained.construct_value( other.contained.value() );
948 #if optional_CPP11_OR_GREATER
951 template<
typename U >
954 std::is_constructible<T, U &&>::value
963 && !std::is_convertible< U &&, T>::value
966 : has_value_( other.has_value() )
968 if ( other.has_value() )
970 contained.construct_value( T{
std::move( other.contained.value() ) } );
975 template<
typename U >
977 optional( optional<U> && other
979 std::is_constructible<T, U &&>::value
980 && !std::is_constructible<T, optional<U> & >::
value
981 && !std::is_constructible<T, optional<U> && >::
value
982 && !std::is_constructible<T, optional<U>
const & >::
value
983 && !std::is_constructible<T, optional<U>
const && >::
value
984 && !std::is_convertible< optional<U> & , T>::
value
985 && !std::is_convertible< optional<U> && , T>::
value
986 && !std::is_convertible< optional<U>
const & , T>::
value
987 && !std::is_convertible< optional<U>
const &&, T>::
value
988 && std::is_convertible< U &&, T>::value
991 : has_value_( other.has_value() )
993 if ( other.has_value() )
995 contained.construct_value(
std::move( other.contained.value() ) );
1000 template<
typename... Args
1001 optional_REQUIRES_T(
1002 std::is_constructible<T, Args&&...>::value
1006 : has_value_( true )
1007 , contained( T( std::forward<Args>(args)...) )
1011 template<
typename U,
typename... Args
1012 optional_REQUIRES_T(
1013 std::is_constructible<T, std::initializer_list<U>&, Args&&...>::
value
1017 : has_value_( true )
1018 , contained( T( il, std::forward<Args>(args)...) )
1022 template<
typename U = value_type >
1024 optional_REQUIRES_A(
1025 std::is_constructible<T, U&&>::value
1027 && !std::is_same<
typename std20::remove_cvref<U>::type, optional<T>>::
value
1028 && !std::is_convertible<U&&, T>::value
1031 : has_value_( true )
1032 , contained( T{ std::forward<U>(
value ) } )
1036 template<
typename U = value_type >
1039 optional_REQUIRES_A(
1040 std::is_constructible<T, U&&>::value
1042 && !std::is_same<
typename std20::remove_cvref<U>::type, optional<T>>::
value
1043 && std::is_convertible<U&&, T>::value
1046 : has_value_( true )
1047 , contained( std::forward<U>(
value ) )
1050 #else // optional_CPP11_OR_GREATER
1054 : has_value_( true )
1055 , contained(
value )
1058 #endif // optional_CPP11_OR_GREATER
1066 contained.destruct_value();
1080 #if optional_CPP11_OR_GREATER
1082 optional_REQUIRES_R(
1088 operator=(
optional const & other )
1090 std::is_nothrow_move_assignable<T>::
value
1091 && std::is_nothrow_move_constructible<T>::
value
1097 if ( (has_value() ==
true ) && (other.has_value() ==
false) ) { reset(); }
1098 else if ( (has_value() ==
false) && (other.has_value() ==
true ) ) { initialize( *other ); }
1099 else if ( (has_value() ==
true ) && (other.has_value() ==
true ) ) { contained.value() = *other; }
1103 #if optional_CPP11_OR_GREATER
1107 optional_REQUIRES_R(
1113 operator=(
optional && other ) noexcept
1115 if ( (has_value() ==
true ) && (other.has_value() ==
false) ) { reset(); }
1116 else if ( (has_value() ==
false) && (other.has_value() ==
true ) ) { initialize(
std::move( *other ) ); }
1117 else if ( (has_value() ==
true ) && (other.has_value() ==
true ) ) { contained.value() =
std::move( *other ); }
1122 template<
typename U = T >
1124 optional_REQUIRES_R(
1126 std::is_constructible<T , U>::value
1127 && std::is_assignable<T&, U>::value
1129 && !std::is_same<
typename std20::remove_cvref<U>::type, optional<T>>::
value
1130 && !(std::is_scalar<T>::value && std::is_same<T,
typename std::decay<U>::type>::
value)
1132 operator=( U &&
value )
1136 contained.value() = std::forward<U>(
value );
1140 initialize( T( std::forward<U>(
value ) ) );
1145 #else // optional_CPP11_OR_GREATER
1148 template<
typename U >
1151 if ( has_value() ) contained.
value() =
value;
1152 else initialize( T(
value ) );
1156 #endif // optional_CPP11_OR_GREATER
1159 template<
typename U >
1160 #if optional_CPP11_OR_GREATER
1162 optional_REQUIRES_R(
1164 std::is_constructible< T , U const &>::value
1165 && std::is_assignable< T&, U const &>::value
1181 #endif // optional_CPP11_OR_GREATER
1187 #if optional_CPP11_OR_GREATER
1190 template<
typename U >
1192 optional_REQUIRES_R(
1194 std::is_constructible< T , U>::value
1195 && std::is_assignable< T&, U>::value
1215 template<
typename... Args
1216 optional_REQUIRES_T(
1217 std::is_constructible<T, Args&&...>::value
1220 T& emplace( Args&&... args )
1223 contained.emplace( std::forward<Args>(args)... );
1225 return contained.value();
1229 template<
typename U,
typename... Args
1230 optional_REQUIRES_T(
1231 std::is_constructible<T, std::initializer_list<U>&, Args&&...>::
value
1234 T& emplace( std::initializer_list<U> il, Args&&... args )
1237 contained.emplace( il, std::forward<Args>(args)... );
1239 return contained.value();
1242 #endif // optional_CPP11_OR_GREATER
1247 #if optional_CPP11_OR_GREATER
1249 std::is_nothrow_move_constructible<T>::value
1250 && std17::is_nothrow_swappable<T>::value
1255 if ( (has_value() ==
true ) && (other.has_value() ==
true ) ) {
swap( **
this, *other ); }
1256 else if ( (has_value() ==
false) && (other.has_value() ==
true ) ) { initialize(
std11::move(*other) ); other.reset(); }
1257 else if ( (has_value() ==
true ) && (other.has_value() ==
false) ) { other.initialize(
std11::move(**
this) ); reset(); }
1264 return assert( has_value() ),
1265 contained.value_ptr();
1270 return assert( has_value() ),
1271 contained.value_ptr();
1276 return assert( has_value() ),
1282 return assert( has_value() ),
1286 #if optional_HAVE( REF_QUALIFIER ) && ( !optional_COMPILER_GNUC_VERSION || optional_COMPILER_GNUC_VERSION >= 490 )
1300 #if optional_CPP11_OR_GREATER
1308 return has_value() ? &optional::this_type_does_not_support_comparisons : 0;
1321 #if optional_CONFIG_NO_EXCEPTIONS
1322 assert( has_value() );
1324 if ( ! has_value() )
1326 throw bad_optional_access();
1329 return contained.value();
1334 #if optional_CONFIG_NO_EXCEPTIONS
1335 assert( has_value() );
1337 if ( ! has_value() )
1339 throw bad_optional_access();
1342 return contained.value();
1345 #if optional_HAVE( REF_QUALIFIER ) && ( !optional_COMPILER_GNUC_VERSION || optional_COMPILER_GNUC_VERSION >= 490 )
1360 #if optional_CPP11_OR_GREATER
1362 template<
typename U >
1365 return has_value() ? contained.value() :
static_cast<T
>(std::forward<U>( v ) );
1368 template<
typename U >
1371 return has_value() ?
std::move( contained.value() ) : static_cast<T>(std::forward<U>( v ) );
1376 template<
typename U >
1379 return has_value() ? contained.value() :
static_cast<value_type>( v );
1382 #endif // optional_CPP11_OR_GREATER
1390 contained.destruct_value();
1397 void this_type_does_not_support_comparisons()
const {}
1399 template<
typename V >
1400 void initialize( V
const &
value )
1402 assert( ! has_value() );
1403 contained.construct_value(
value );
1407 #if optional_CPP11_OR_GREATER
1408 template<
typename V >
1409 void initialize( V &&
value )
1411 assert( ! has_value() );
1420 detail::storage_t< value_type > contained;
1426 template<
typename T,
typename U >
1429 return bool(x) != bool(y) ? false : !bool( x ) ? true : *x == *y;
1432 template<
typename T,
typename U >
1438 template<
typename T,
typename U >
1441 return (!y) ? false : (!x) ?
true : *x < *y;
1444 template<
typename T,
typename U >
1450 template<
typename T,
typename U >
1456 template<
typename T,
typename U >
1464 template<
typename T >
1470 template<
typename T >
1476 template<
typename T >
1482 template<
typename T >
1488 template<
typename T >
1494 template<
typename T >
1500 template<
typename T >
1506 template<
typename T >
1512 template<
typename T >
1518 template<
typename T >
1524 template<
typename T >
1530 template<
typename T >
1538 template<
typename T,
typename U >
1541 return bool(x) ? *x == v :
false;
1544 template<
typename T,
typename U >
1547 return bool(x) ? v == *x :
false;
1550 template<
typename T,
typename U >
1553 return bool(x) ? *x != v :
true;
1556 template<
typename T,
typename U >
1559 return bool(x) ? v != *x :
true;
1562 template<
typename T,
typename U >
1565 return bool(x) ? *x < v :
true;
1568 template<
typename T,
typename U >
1571 return bool(x) ? v < *x :
false;
1574 template<
typename T,
typename U >
1577 return bool(x) ? *x <= v :
true;
1580 template<
typename T,
typename U >
1583 return bool(x) ? v <= *x :
false;
1586 template<
typename T,
typename U >
1589 return bool(x) ? *x > v :
false;
1592 template<
typename T,
typename U >
1595 return bool(x) ? v > *x :
true;
1598 template<
typename T,
typename U >
1601 return bool(x) ? *x >= v :
false;
1604 template<
typename T,
typename U >
1607 return bool(x) ? v >= *x :
true;
1612 template<
typename T
1613 #if optional_CPP11_OR_GREATER
1614 optional_REQUIRES_T(
1615 std::is_move_constructible<T>::value
1616 && std17::is_swappable<T>::value )
1620 #if optional_CPP11_OR_GREATER
1621 noexcept( noexcept( x.swap(y) ) )
1627 #if optional_CPP11_OR_GREATER
1629 template<
typename T >
1635 template<
typename T,
typename...Args >
1641 template<
typename T,
typename U,
typename... Args >
1649 template<
typename T >
1655 #endif // optional_CPP11_OR_GREATER
1659 using optional_lite::optional;
1660 using optional_lite::nullopt_t;
1662 using optional_lite::bad_optional_access;
1668 #if optional_CPP11_OR_GREATER
1675 struct hash<
nonstd::optional<T> >
1680 return bool( v ) ? std::hash<T>{}( *v ) : 0;
1686 #endif // optional_CPP11_OR_GREATER
1688 #if defined(__clang__)
1689 # pragma clang diagnostic pop
1690 #elif defined(__GNUC__)
1691 # pragma GCC diagnostic pop
1692 #elif defined(_MSC_VER )
1693 # pragma warning( pop )
1696 #endif // optional_USES_STD_OPTIONAL
1698 #endif // NONSTD_OPTIONAL_LITE_HPP