11 #ifndef NONSTD_ANY_LITE_HPP    12 #define NONSTD_ANY_LITE_HPP    14 #define any_lite_MAJOR  0    15 #define any_lite_MINOR  1    16 #define any_lite_PATCH  0    18 #define any_lite_VERSION  any_STRINGIFY(any_lite_MAJOR) "." any_STRINGIFY(any_lite_MINOR) "." any_STRINGIFY(any_lite_PATCH)    20 #define any_STRINGIFY(  x )  any_STRINGIFY_( x )    21 #define any_STRINGIFY_( x )  #x    25 #define any_ANY_DEFAULT  0    26 #define any_ANY_NONSTD   1    29 #if !defined( any_CONFIG_SELECT_ANY )    30 # define any_CONFIG_SELECT_ANY  ( any_HAVE_STD_ANY ? any_ANY_STD : any_ANY_NONSTD )    35 #ifndef any_CONFIG_NO_EXCEPTIONS    36 # if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)    37 #  define any_CONFIG_NO_EXCEPTIONS  0    39 #  define any_CONFIG_NO_EXCEPTIONS  1    47 # if defined(_MSVC_LANG ) && !defined(__clang__)    48 #  define any_CPLUSPLUS  (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )    50 #  define any_CPLUSPLUS  __cplusplus    54 #define any_CPP98_OR_GREATER  ( any_CPLUSPLUS >= 199711L )    55 #define any_CPP11_OR_GREATER  ( any_CPLUSPLUS >= 201103L )    56 #define any_CPP14_OR_GREATER  ( any_CPLUSPLUS >= 201402L )    57 #define any_CPP17_OR_GREATER  ( any_CPLUSPLUS >= 201703L )    58 #define any_CPP20_OR_GREATER  ( any_CPLUSPLUS >= 202000L )    62 #if any_CPP17_OR_GREATER && defined(__has_include )    63 # if __has_include( <any> )    64 #  define any_HAVE_STD_ANY  1    66 #  define any_HAVE_STD_ANY  0    69 # define  any_HAVE_STD_ANY  0    72 #define  any_USES_STD_ANY  ( (any_CONFIG_SELECT_ANY == any_ANY_STD) || ((any_CONFIG_SELECT_ANY == any_ANY_DEFAULT) && any_HAVE_STD_ANY) )    78 #ifndef nonstd_lite_HAVE_IN_PLACE_TYPES    79 #define nonstd_lite_HAVE_IN_PLACE_TYPES  1    83 #if any_CPP17_OR_GREATER    92 using std::in_place_t;
    93 using std::in_place_type_t;
    94 using std::in_place_index_t;
    96 #define nonstd_lite_in_place_t(      T)  std::in_place_t    97 #define nonstd_lite_in_place_type_t( T)  std::in_place_type_t<T>    98 #define nonstd_lite_in_place_index_t(K)  std::in_place_index_t<K>   100 #define nonstd_lite_in_place(      T)    std::in_place_t{}   101 #define nonstd_lite_in_place_type( T)    std::in_place_type_t<T>{}   102 #define nonstd_lite_in_place_index(K)    std::in_place_index_t<K>{}   106 #else // any_CPP17_OR_GREATER   116 template< std::
size_t K >
   129 template< std::
size_t K >
   141 template< std::
size_t K >
   149 #define nonstd_lite_in_place_t(      T)  nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T>  )   150 #define nonstd_lite_in_place_type_t( T)  nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T>  )   151 #define nonstd_lite_in_place_index_t(K)  nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag<K> )   153 #define nonstd_lite_in_place(      T)    nonstd::in_place_type<T>   154 #define nonstd_lite_in_place_type( T)    nonstd::in_place_type<T>   155 #define nonstd_lite_in_place_index(K)    nonstd::in_place_index<K>   159 #endif // any_CPP17_OR_GREATER   160 #endif // nonstd_lite_HAVE_IN_PLACE_TYPES   177     using std::bad_any_cast;
   180 #else // any_USES_STD_ANY   197 #if defined(_MSC_VER ) && !defined(__clang__)   198 # define any_COMPILER_MSVC_VER      (_MSC_VER )   199 # define any_COMPILER_MSVC_VERSION  (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )   201 # define any_COMPILER_MSVC_VER      0   202 # define any_COMPILER_MSVC_VERSION  0   205 #define any_COMPILER_VERSION( major, minor, patch )  ( 10 * ( 10 * (major) + (minor) ) + (patch) )   207 #if defined(__clang__)   208 # define any_COMPILER_CLANG_VERSION  any_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)   210 # define any_COMPILER_CLANG_VERSION  0   213 #if defined(__GNUC__) && !defined(__clang__)   214 # define any_COMPILER_GNUC_VERSION  any_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)   216 # define any_COMPILER_GNUC_VERSION  0   224 #define any_HAVE( feature )  ( any_HAVE_##feature )   227 # define any_HAS_CPP0X  _HAS_CPP0X   229 # define any_HAS_CPP0X  0   232 #define any_CPP11_90   (any_CPP11_OR_GREATER || any_COMPILER_MSVC_VER >= 1500)   233 #define any_CPP11_100  (any_CPP11_OR_GREATER || any_COMPILER_MSVC_VER >= 1600)   234 #define any_CPP11_120  (any_CPP11_OR_GREATER || any_COMPILER_MSVC_VER >= 1800)   235 #define any_CPP11_140  (any_CPP11_OR_GREATER || any_COMPILER_MSVC_VER >= 1900)   237 #define any_CPP14_000  (any_CPP14_OR_GREATER)   238 #define any_CPP17_000  (any_CPP17_OR_GREATER)   242 #define any_HAVE_CONSTEXPR_11           any_CPP11_140   243 #define any_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG \   245 #define any_HAVE_INITIALIZER_LIST       any_CPP11_120   246 #define any_HAVE_NOEXCEPT               any_CPP11_140   247 #define any_HAVE_NULLPTR                any_CPP11_100   248 #define any_HAVE_TYPE_TRAITS            any_CPP11_90   249 #define any_HAVE_STATIC_ASSERT          any_CPP11_100   250 #define any_HAVE_ADD_CONST              any_CPP11_90   251 #define any_HAVE_REMOVE_REFERENCE       any_CPP11_90   253 #define any_HAVE_TR1_ADD_CONST          (!! any_COMPILER_GNUC_VERSION )   254 #define any_HAVE_TR1_REMOVE_REFERENCE   (!! any_COMPILER_GNUC_VERSION )   255 #define any_HAVE_TR1_TYPE_TRAITS        (!! any_COMPILER_GNUC_VERSION )   259 #define any_HAVE_CONSTEXPR_14           any_CPP14_000   263 #define any_HAVE_NODISCARD              any_CPP17_000   267 #if any_HAVE_CONSTEXPR_11   268 # define any_constexpr constexpr   270 # define any_constexpr    273 #if any_HAVE_CONSTEXPR_14   274 # define any_constexpr14 constexpr   276 # define any_constexpr14    279 #if any_HAVE_NOEXCEPT   280 # define any_noexcept noexcept   282 # define any_noexcept    286 # define any_nullptr nullptr   288 # define any_nullptr NULL   291 #if any_HAVE_NODISCARD   292 # define any_nodiscard [[nodiscard]]   294 # define any_nodiscard    299 #if any_CONFIG_NO_EXCEPTIONS   305 #if ! any_HAVE_NULLPTR   309 #if any_HAVE_INITIALIZER_LIST   310 # include <initializer_list>   313 #if any_HAVE_TYPE_TRAITS   314 # include <type_traits>   315 #elif any_HAVE_TR1_TYPE_TRAITS   316 # include <tr1/type_traits>   321 #if any_CPP11_OR_GREATER   323 #define any_REQUIRES_0(...) \   324     template< bool B = (__VA_ARGS__), typename std::enable_if<B, int>::type = 0 >   326 #define any_REQUIRES_T(...) \   327     , typename = typename std::enable_if< (__VA_ARGS__), nonstd::any_lite::detail::enabler >::type   329 #define any_REQUIRES_R(R, ...) \   330     typename std::enable_if<__VA_ARGS__, R>::type   332 #define any_REQUIRES_A(...) \   333     , typename std::enable_if<__VA_ARGS__, void*>::type = nullptr   347 #if any_HAVE_ADD_CONST   349 using std::add_const;
   351 #elif any_HAVE_TR1_ADD_CONST   353 using std::tr1::add_const;
   359 #endif // any_HAVE_ADD_CONST   361 #if any_HAVE_REMOVE_REFERENCE   363 using std::remove_reference;
   365 #elif any_HAVE_TR1_REMOVE_REFERENCE   367 using std::tr1::remove_reference;
   374 #endif // any_HAVE_REMOVE_REFERENCE   386 #if ! any_CONFIG_NO_EXCEPTIONS   388 class bad_any_cast : 
public std::bad_cast
   391 #if any_CPP11_OR_GREATER   394     virtual const char* what() 
const throw()
   397       return "any-lite: bad any_cast";
   401 #endif // any_CONFIG_NO_EXCEPTIONS   411     : content( other.content ? other.content->clone() : 
any_nullptr )
   414 #if any_CPP11_OR_GREATER   423         class ValueType, 
class T = 
typename std::decay<ValueType>::type
   424         any_REQUIRES_T( ! std::is_same<T, any>::value )
   427     : content( 
new holder<T>( 
std::move( value ) ) )
   431         class T, 
class... Args
   432         any_REQUIRES_T( std::is_constructible<T, Args&&...>::value )
   435     : content( 
new holder<T>( T( std::forward<Args>(args)... ) ) )
   439         class T, 
class U, 
class... Args
   440         any_REQUIRES_T( std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value )
   443     : content( 
new holder<T>( T( il, std::forward<Args>(args)... ) ) )
   448     template< 
class ValueType >
   449     any( ValueType 
const & value )
   450     : content( new holder<ValueType>( value ) )
   453 #endif // any_CPP11_OR_GREATER   462         any( other ).
swap( *
this );
   466 #if any_CPP11_OR_GREATER   475         class ValueType, 
class T = 
typename std::decay<ValueType>::type
   476         any_REQUIRES_T( ! std::is_same<T, any>::value )
   478     any & operator=( ValueType && value )
   484     template< 
class T, 
class... Args >
   485     void emplace( Args && ... args )
   487         any( T( std::forward<Args>(args)... ) ).swap( *
this );
   491         class T, 
class U, 
class... Args
   492         any_REQUIRES_T( std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value )
   494     void emplace( std::initializer_list<U> il, Args&&... args )
   496         any( T( il, std::forward<Args>(args)... ) ).swap( *
this );
   501     template< 
class ValueType >
   504         any( value ).
swap( *
this );
   508 #endif // any_CPP11_OR_GREATER   527         return has_value() ? content->type() : 
typeid( void );
   534     template< 
class ValueType >
   537         return &( 
static_cast<holder<ValueType> *
>( content )->held );
   540     template< 
class ValueType >
   543         return &( 
static_cast<holder<ValueType> *
>( content )->held );
   550         virtual ~placeholder()
   554         virtual std::type_info 
const & type() 
const = 0;
   556         virtual placeholder * clone() 
const = 0;
   559     template< 
typename ValueType >
   560     class holder : 
public placeholder
   563         holder( ValueType 
const & value )
   567 #if any_CPP11_OR_GREATER   568         holder( ValueType && value )
   573         virtual std::type_info 
const & type()
 const   575             return typeid( ValueType );
   578         virtual placeholder * clone()
 const   580             return new holder( held );
   586     placeholder * content;
   594 #if any_CPP11_OR_GREATER   596 template< 
class T, 
class ...Args >
   597 inline any make_any( Args&& ...args )
   602 template< 
class T, 
class U, 
class ...Args >
   603 inline any make_any( std::initializer_list<U> il, Args&& ...args )
   608 #endif // any_CPP11_OR_GREATER   612 #if any_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG   614     , 
typename = 
typename std::enable_if< (std::is_reference<ValueType>::value || std::is_copy_constructible<ValueType>::value), 
nonstd::any_lite::detail::enabler >::type
   621 #if any_CONFIG_NO_EXCEPTIONS   626        throw bad_any_cast();
   635 #if any_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG   637     , 
typename = 
typename std::enable_if< (std::is_reference<ValueType>::value || std::is_copy_constructible<ValueType>::value), 
nonstd::any_lite::detail::enabler >::type
   644 #if any_CONFIG_NO_EXCEPTIONS   649        throw bad_any_cast();
   656 #if any_CPP11_OR_GREATER   660 #if any_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG   661     any_REQUIRES_T( std::is_reference<ValueType>::value || std::is_copy_constructible<ValueType>::value )
   668 #if any_CONFIG_NO_EXCEPTIONS   673        throw bad_any_cast();
   680 #endif // any_CPP11_OR_GREATER   682 template< 
class ValueType >
   688 template<
class ValueType >
   696 using namespace any_lite;
   700 #endif // any_USES_STD_ANY   702 #endif // NONSTD_ANY_LITE_HPP 
const std::type_info & type() const
#define nonstd_lite_in_place_type(T)
in_place_t in_place(detail::in_place_index_tag< K >=detail::in_place_index_tag< K >())
any(ValueType const &value)
ValueType * any_cast(any *operand)
in_place_t in_place_index(detail::in_place_index_tag< K >=detail::in_place_index_tag< K >())
const ValueType * to_ptr() const
#define nonstd_lite_in_place_type_t(T)
any & operator=(any const &other)
in_place_t in_place_type(detail::in_place_type_tag< T >=detail::in_place_type_tag< T >())
void swap(any &x, any &y)
any & operator=(ValueType const &value)
in_place_t in_place(detail::in_place_type_tag< T >=detail::in_place_type_tag< T >())