11 #ifndef NONSTD_OPTIONAL_LITE_HPP 12 #define NONSTD_OPTIONAL_LITE_HPP 14 #define optional_lite_VERSION "3.1.0" 19 #ifndef optional_CPLUSPLUS 21 # define optional_CPLUSPLUS (_MSC_VER
== 1900
? 201103L
: _MSVC_LANG
) 23 # define optional_CPLUSPLUS __cplusplus 39 #if defined( __has_include
) 40 # define optional_HAS_INCLUDE( arg ) __has_include( arg ) 42 # define optional_HAS_INCLUDE( arg ) 0
54 using std::bad_optional_access;
60 using std::in_place_type;
61 using std::in_place_index;
62 using std::in_place_t;
63 using std::in_place_type_t;
64 using std::in_place_index_t;
66 using std::operator==;
67 using std::operator!=;
69 using std::operator<=;
71 using std::operator>=;
72 using std::make_optional;
84 #ifndef optional_CONFIG_MAX_ALIGN_HACK 85 # define optional_CONFIG_MAX_ALIGN_HACK 0
88 #ifndef optional_CONFIG_ALIGN_AS 92 #ifndef optional_CONFIG_ALIGN_AS_FALLBACK 93 # define optional_CONFIG_ALIGN_AS_FALLBACK double 99 # pragma clang diagnostic push 100 # pragma clang diagnostic ignored "-Wundef" 101 #elif defined __GNUC__ 102 # pragma GCC diagnostic push 103 # pragma GCC diagnostic ignored "-Wundef" 107 #define optional_BETWEEN( v, lo, hi ) ( lo <= v && v < hi ) 109 #if defined(_MSC_VER
) && !defined(__clang__
) 110 # define optional_COMPILER_MSVC_VERSION (_MSC_VER / 10
- 10
* ( 5
+ (_MSC_VER < 1900
)) ) 112 # define optional_COMPILER_MSVC_VERSION 0
115 #define optional_COMPILER_VERSION( major, minor, patch ) ( 10
* (10
* major + minor ) + patch ) 118 # define optional_COMPILER_GNUC_VERSION optional_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) 120 # define optional_COMPILER_GNUC_VERSION 0
123 #if defined __clang__
124 # define optional_COMPILER_CLANG_VERSION optional_COMPILER_VERSION(__clang_major__
, __clang_minor__
, __clang_patchlevel__
) 126 # define optional_COMPILER_CLANG_VERSION 0
130 # pragma warning( push ) 131 # pragma warning( disable: 4345
) 135 # pragma warning( push ) 136 # pragma warning( disable: 4814
) 141 #define optional_HAVE(FEATURE) ( optional_HAVE_##FEATURE ) 146 # define optional_HAVE_AUTO 1
147 # define optional_HAVE_NULLPTR 1
148 # define optional_HAVE_STATIC_ASSERT 1
152 # define optional_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG 1
153 # define optional_HAVE_INITIALIZER_LIST 1
157 # define optional_HAVE_ALIAS_TEMPLATE 1
158 # define optional_HAVE_CONSTEXPR_11 1
159 # define optional_HAVE_ENUM_CLASS 1
160 # define optional_HAVE_EXPLICIT_CONVERSION 1
161 # define optional_HAVE_IS_DEFAULT 1
162 # define optional_HAVE_IS_DELETE 1
163 # define optional_HAVE_NOEXCEPT 1
164 # define optional_HAVE_REF_QUALIFIER 1
170 # define optional_HAVE_CONSTEXPR_14 1
176 # define optional_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE 1
182 # define optional_HAVE_TR1_TYPE_TRAITS 1
183 # define optional_HAVE_TR1_ADD_POINTER 1
187 # define optional_HAVE_TYPE_TRAITS 1
188 # define optional_HAVE_STD_ADD_POINTER 1
192 # define optional_HAVE_ARRAY 1
196 # define optional_HAVE_CONDITIONAL 1
200 # define optional_HAVE_CONTAINER_DATA_METHOD 1
204 # define optional_HAVE_REMOVE_CV 1
208 # define optional_HAVE_SIZED_TYPES 1
214 # undef optional_CPP11_OR_GREATER 215 # define optional_CPP11_OR_GREATER 1
221 # define optional_constexpr constexpr 223 # define optional_constexpr 227 # define optional_constexpr14 constexpr 229 # define optional_constexpr14 233 # define optional_noexcept noexcept 235 # define optional_noexcept 239 # define optional_nullptr nullptr 241 # define optional_nullptr NULL 245 # define optional_ref_qual & 246 # define optional_refref_qual && 248 # define optional_ref_qual 249 # define optional_refref_qual 255 # include <functional> 259 # include <initializer_list> 263 # include <type_traits> 264 #elif optional_HAVE( TR1_TYPE_TRAITS ) 265 # include <tr1/type_traits> 285 #ifndef nonstd_lite_HAVE_IN_PLACE_TYPES 294 template< std::size_t I >
307 template< std::size_t I >
319 template< std::size_t I >
327 #define nonstd_lite_in_place_type_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T> ) 328 #define nonstd_lite_in_place_index_t(T) nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag<I> ) 330 #define nonstd_lite_HAVE_IN_PLACE_TYPES 1
344 template<
typename T >
353 template<
typename Head,
typename Tail >
364 #define optional_UNIQUE( name ) optional_UNIQUE2( name, __LINE__ ) 365 #define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line ) 366 #define optional_UNIQUE3( name, line ) name ## line 368 #define optional_ALIGN_TYPE( type ) 369 type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st ) 371 template<
typename T >
392 #ifdef HAVE_LONG_LONG 407 #undef optional_UNIQUE 408 #undef optional_UNIQUE2 409 #undef optional_UNIQUE3 411 #undef optional_ALIGN_TYPE 413 #elif defined( optional_CONFIG_ALIGN_AS ) 417 #define optional_ALIGN_AS( unused ) 418 optional_CONFIG_ALIGN_AS 424 #define optional_ALIGN_AS( to_align ) 425 typename type_of_size< alignment_types, alignment_of< to_align >::value >::type 427 template <
typename T>
430 template <
typename T>
438 template <
unsigned A,
unsigned S>
441 enum { value = A < S ? A : S };
444 template<
typename T >
451 template<
typename List, size_t N >
454 typedef typename conditional<
466 template<
typename T>
469 #define optional_ALIGN_TYPE( type ) 470 typelist< type , typelist< struct_t< type > 496 > > > > > > > > > > > > > >
497 > > > > > > > > > > > > > >
501 #undef optional_ALIGN_TYPE 507 template<
typename T >
539 template<
class... Args >
540 void emplace( Args&&... args )
545 template<
class U,
class... Args >
546 void emplace( std::initializer_list<U> il, Args&&... args )
595 aligned_storage_t data;
597 #elif optional_CONFIG_MAX_ALIGN_HACK 610 # undef optional_ALIGN_AS 624 template <
typename U>
627 return reinterpret_cast<
U*>(
ptr() );
630 template <
typename U>
633 return reinterpret_cast<
U const *>(
ptr() );
665 template<
typename T>
693 : has_value_( rhs.has_value() )
695 if ( rhs.has_value() )
696 contained.construct_value( std::move( rhs.contained.value() ) );
709 , contained( std::move( value ) )
712 template<
class... Args >
715 , contained( T( std::forward<Args>(args)...) )
718 template<
class U,
class... Args >
721 , contained( T( il, std::forward<Args>(args)...) )
770 template<
class...
Args >
779 template<
class U,
class...
Args >
926 template<
typename V >
935 template<
typename V >
953 template<
typename T,
typename U >
956 return bool(x) !=
bool(y) ?
false : !
bool( x ) ?
true : *x == *y;
959 template<
typename T,
typename U >
965 template<
typename T,
typename U >
968 return (!y) ?
false : (!x) ?
true : *x < *y;
971 template<
typename T,
typename U >
977 template<
typename T,
typename U >
983 template<
typename T,
typename U >
991 template<
typename T >
997 template<
typename T >
1003 template<
typename T >
1009 template<
typename T >
1015 template<
typename T >
1021 template<
typename T >
1027 template<
typename T >
1033 template<
typename T >
1039 template<
typename T >
1045 template<
typename T >
1051 template<
typename T >
1057 template<
typename T >
1065 template<
typename T,
typename U >
1068 return bool(x) ? *x == v :
false;
1071 template<
typename T,
typename U >
1074 return bool(x) ? v == *x :
false;
1077 template<
typename T,
typename U >
1080 return bool(x) ? *x != v :
true;
1083 template<
typename T,
typename U >
1086 return bool(x) ? v != *x :
true;
1089 template<
typename T,
typename U >
1092 return bool(x) ? *x < v :
true;
1095 template<
typename T,
typename U >
1098 return bool(x) ? v < *x :
false;
1101 template<
typename T,
typename U >
1104 return bool(x) ? *x <= v :
true;
1107 template<
typename T,
typename U >
1110 return bool(x) ? v <= *x :
false;
1113 template<
typename T,
typename U >
1116 return bool(x) ? *x > v :
false;
1119 template<
typename T,
typename U >
1122 return bool(x) ? v > *x :
true;
1125 template<
typename T,
typename U >
1128 return bool(x) ? *x >= v :
false;
1131 template<
typename T,
typename U >
1134 return bool(x) ? v >= *x :
true;
1139 template<
typename T >
1142 noexcept(
noexcept(
x.
swap(
y) ) )
1156 template<
class T,
class...
Args >
1162 template<
class T,
class U,
class...
Args >
1170 template<
typename T >
1191 struct hash< nonstd::optional<T> >
1196 return bool( v ) ? hash<T>()( *v ) : 0;
1205 # pragma clang diagnostic pop 1206 #elif defined __GNUC__ 1207 # pragma GCC diagnostic pop optional_constexpr bool operator==(U const &v, optional< T > const &x)
optional_constexpr bool operator<(U const &v, optional< T > const &x)
optional_constexpr bool operator<=(U const &v, optional< T > const &x)
#define optional_COMPILER_GNUC_VERSION
in_place_t in_place_index(detail::in_place_index_tag< I >=detail::in_place_index_tag< I >())
conditional< N==sizeof(typename List::head), typename List::head, typename type_of_size< typename List::tail, N >::type >::type type
#define optional_ALIGN_TYPE(type)
#define optional_HAS_INCLUDE(arg)
value_type const * value_ptr() const
optional_constexpr bool operator!=(nullopt_t, optional< T > const &x) optional_noexcept
optional_constexpr bool operator==(optional< T > const &x, optional< U > const &y)
optional_constexpr bool operator==(optional< T > const &x, U const &v)
void swap(optional< T > &x, optional< T > &y)
#define optional_BETWEEN(v, lo, hi)
optional_constexpr bool operator!=(optional< T > const &x, nullopt_t) optional_noexcept
typedef optional_ALIGN_AS(value_type) align_as_type
optional_constexpr bool operator>(optional< T > const &x, U const &v)
optional< T > make_optional(T const &v)
#define optional_refref_qual
optional_constexpr nullopt_t(init)
optional_constexpr bool operator<=(optional< T > const &x, U const &v)
void const * ptr() const optional_noexcept
optional & operator=(nullopt_t) optional_noexcept
optional_constexpr optional(value_type const &value)
void initialize(V const &value)
void construct_value(value_type const &v)
optional(optional const &rhs)
optional_constexpr bool operator<=(nullopt_t, optional< T > const &) optional_noexcept
void(optional::* safe_bool)() const
#define optional_CONFIG_ALIGN_AS_FALLBACK
optional_constexpr bool operator<=(optional< T > const &x, nullopt_t) optional_noexcept
#define optional_noexcept
optional_constexpr bool operator<=(optional< T > const &x, optional< U > const &y)
detail::storage_t< value_type > contained
#define optional_constexpr
#define optional_CPP14_OR_GREATER
optional_CONFIG_ALIGN_AS_FALLBACK type
optional_constexpr bool operator==(optional< T > const &x, nullopt_t) optional_noexcept
optional_constexpr bool operator>(optional< T > const &x, nullopt_t) optional_noexcept
storage_t(value_type const &v)
#define optional_HAVE_STD_OPTIONAL
#define nonstd_lite_in_place_type_t(T)
#define optional_HAVE(FEATURE)
#define optional_CPP11_OR_GREATER
value_type & value() optional_ref_qual
optional_constexpr bool operator<(nullopt_t, optional< T > const &x) optional_noexcept
optional_constexpr bool operator>(optional< T > const &x, optional< U > const &y)
optional_constexpr bool operator<(optional< T > const &x, optional< U > const &y)
#define optional_constexpr14
optional_constexpr bool operator>(nullopt_t, optional< T > const &) optional_noexcept
optional_constexpr bool operator!=(optional< T > const &x, optional< U > const &y)
#define optional_CPLUSPLUS
optional_constexpr bool operator<(optional< T > const &, nullopt_t) optional_noexcept
optional_constexpr bool operator<(optional< T > const &x, U const &v)
value_type const & value() const optional_ref_qual
void * ptr() optional_noexcept
optional_constexpr bool operator>=(U const &v, optional< T > const &x)
optional_constexpr optional(nullopt_t) optional_noexcept
optional_constexpr optional() optional_noexcept
#define optional_COMPILER_VERSION(major, minor, patch)
#define optional_ref_qual
optional_constexpr bool operator>=(optional< T > const &, nullopt_t) optional_noexcept
optional_constexpr bool operator>=(optional< T > const &x, U const &v)
in_place_t in_place_type(detail::in_place_type_tag< T >=detail::in_place_type_tag< T >())
optional & operator=(optional const &rhs)
optional_constexpr bool operator>=(nullopt_t, optional< T > const &x) optional_noexcept
#define optional_CONFIG_MAX_ALIGN_HACK
#define optional_CPP17_OR_GREATER
in_place_t in_place(detail::in_place_index_tag< I >=detail::in_place_index_tag< I >())
#define optional_COMPILER_MSVC_VERSION
optional_constexpr bool operator>=(optional< T > const &x, optional< U > const &y)
optional_constexpr bool operator!=(optional< T > const &x, U const &v)
optional_constexpr bool operator>(U const &v, optional< T > const &x)
optional_constexpr bool operator!=(U const &v, optional< T > const &x)
optional_constexpr bool operator==(nullopt_t, optional< T > const &x) optional_noexcept
in_place_t in_place(detail::in_place_type_tag< T >=detail::in_place_type_tag< T >())