Home | History | Annotate | Download | only in type_traits
      1 //  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
      2 //  Use, modification and distribution are subject to the Boost Software License,
      3 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
      4 //  http://www.boost.org/LICENSE_1_0.txt).
      5 //
      6 //  See http://www.boost.org/libs/type_traits for most recent version including documentation.
      7 
      8 #ifndef BOOST_TT_INTRINSICS_HPP_INCLUDED
      9 #define BOOST_TT_INTRINSICS_HPP_INCLUDED
     10 
     11 #ifndef BOOST_TT_CONFIG_HPP_INCLUDED
     12 #include <boost/type_traits/config.hpp>
     13 #endif
     14 
     15 //
     16 // Helper macros for builtin compiler support.
     17 // If your compiler has builtin support for any of the following
     18 // traits concepts, then redefine the appropriate macros to pick
     19 // up on the compiler support:
     20 //
     21 // (these should largely ignore cv-qualifiers)
     22 // BOOST_IS_UNION(T) should evaluate to true if T is a union type
     23 // BOOST_IS_POD(T) should evaluate to true if T is a POD type
     24 // BOOST_IS_EMPTY(T) should evaluate to true if T is an empty class type (and not a union)
     25 // BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect
     26 // BOOST_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy
     27 // BOOST_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy
     28 // BOOST_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect
     29 // BOOST_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw
     30 // BOOST_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw
     31 // BOOST_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw
     32 // BOOST_HAS_VIRTUAL_DESTRUCTOR(T) should evaluate to true T has a virtual destructor
     33 //
     34 // The following can also be defined: when detected our implementation is greatly simplified.
     35 //
     36 // BOOST_IS_ABSTRACT(T) true if T is an abstract type
     37 // BOOST_IS_BASE_OF(T,U) true if T is a base class of U
     38 // BOOST_IS_CLASS(T) true if T is a class type (and not a union)
     39 // BOOST_IS_CONVERTIBLE(T,U) true if T is convertible to U
     40 // BOOST_IS_ENUM(T) true is T is an enum
     41 // BOOST_IS_POLYMORPHIC(T) true if T is a polymorphic type
     42 // BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T.
     43 
     44 #ifdef BOOST_HAS_SGI_TYPE_TRAITS
     45     // Hook into SGI's __type_traits class, this will pick up user supplied
     46     // specializations as well as SGI - compiler supplied specializations.
     47 #   include <boost/type_traits/is_same.hpp>
     48 #   ifdef __NetBSD__
     49       // There are two different versions of type_traits.h on NetBSD on Spark
     50       // use an implicit include via algorithm instead, to make sure we get
     51       // the same version as the std lib:
     52 #     include <algorithm>
     53 #   else
     54 #    include <type_traits.h>
     55 #   endif
     56 #   define BOOST_IS_POD(T) ::boost::is_same< typename ::__type_traits<T>::is_POD_type, ::__true_type>::value
     57 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_default_constructor, ::__true_type>::value
     58 #   define BOOST_HAS_TRIVIAL_COPY(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_copy_constructor, ::__true_type>::value
     59 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_assignment_operator, ::__true_type>::value
     60 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_destructor, ::__true_type>::value
     61 
     62 #   ifdef __sgi
     63 #      define BOOST_HAS_TYPE_TRAITS_INTRINSICS
     64 #   endif
     65 #endif
     66 
     67 #if defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000)
     68     // Metrowerks compiler is acquiring intrinsic type traits support
     69     // post version 8.  We hook into the published interface to pick up
     70     // user defined specializations as well as compiler intrinsics as
     71     // and when they become available:
     72 #   include <msl_utility>
     73 #   define BOOST_IS_UNION(T) BOOST_STD_EXTENSION_NAMESPACE::is_union<T>::value
     74 #   define BOOST_IS_POD(T) BOOST_STD_EXTENSION_NAMESPACE::is_POD<T>::value
     75 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_default_ctor<T>::value
     76 #   define BOOST_HAS_TRIVIAL_COPY(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_copy_ctor<T>::value
     77 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_assignment<T>::value
     78 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_dtor<T>::value
     79 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
     80 #endif
     81 
     82 #if defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215)
     83 #   include <boost/type_traits/is_same.hpp>
     84 
     85 #   define BOOST_IS_UNION(T) __is_union(T)
     86 #   define BOOST_IS_POD(T) (__is_pod(T) && __has_trivial_constructor(T))
     87 #   define BOOST_IS_EMPTY(T) __is_empty(T)
     88 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
     89 #   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T)|| ( ::boost::is_pod<T>::value && !::boost::is_volatile<T>::value))
     90 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) || ( ::boost::is_pod<T>::value && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value))
     91 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) || ::boost::is_pod<T>::value)
     92 #   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) || ::boost::has_trivial_constructor<T>::value)
     93 #   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) || ::boost::has_trivial_copy<T>::value)
     94 #   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) || ::boost::has_trivial_assign<T>::value)
     95 #   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
     96 
     97 #   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
     98 #   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
     99 #   define BOOST_IS_CLASS(T) __is_class(T)
    100 #   define BOOST_IS_CONVERTIBLE(T,U) ((__is_convertible_to(T,U) || is_same<T,U>::value) && !__is_abstract(U))
    101 #   define BOOST_IS_ENUM(T) __is_enum(T)
    102 //  This one doesn't quite always do the right thing:
    103 //  #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
    104 //  This one fails if the default alignment has been changed with /Zp:
    105 //  #   define BOOST_ALIGNMENT_OF(T) __alignof(T)
    106 
    107 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    108 #endif
    109 
    110 #if defined(__DMC__) && (__DMC__ >= 0x848)
    111 // For Digital Mars C++, www.digitalmars.com
    112 #   define BOOST_IS_UNION(T) (__typeinfo(T) & 0x400)
    113 #   define BOOST_IS_POD(T) (__typeinfo(T) & 0x800)
    114 #   define BOOST_IS_EMPTY(T) (__typeinfo(T) & 0x1000)
    115 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__typeinfo(T) & 0x10)
    116 #   define BOOST_HAS_TRIVIAL_COPY(T) (__typeinfo(T) & 0x20)
    117 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__typeinfo(T) & 0x40)
    118 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__typeinfo(T) & 0x8)
    119 #   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__typeinfo(T) & 0x80)
    120 #   define BOOST_HAS_NOTHROW_COPY(T) (__typeinfo(T) & 0x100)
    121 #   define BOOST_HAS_NOTHROW_ASSIGN(T) (__typeinfo(T) & 0x200)
    122 #   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) (__typeinfo(T) & 0x4)
    123 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    124 #endif
    125 
    126 #if defined(BOOST_CLANG) && defined(__has_feature)
    127 #   include <cstddef>
    128 #   include <boost/type_traits/is_same.hpp>
    129 #   include <boost/type_traits/is_reference.hpp>
    130 #   include <boost/type_traits/is_volatile.hpp>
    131 
    132 #   if __has_feature(is_union)
    133 #     define BOOST_IS_UNION(T) __is_union(T)
    134 #   endif
    135 #   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_pod)
    136 #     define BOOST_IS_POD(T) __is_pod(T)
    137 #   endif
    138 #   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_empty)
    139 #     define BOOST_IS_EMPTY(T) __is_empty(T)
    140 #   endif
    141 #   if __has_feature(has_trivial_constructor)
    142 #     define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
    143 #   endif
    144 #   if __has_feature(has_trivial_copy)
    145 #     define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value && !is_volatile<T>::value)
    146 #   endif
    147 #   if __has_feature(has_trivial_assign)
    148 #     define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
    149 #   endif
    150 #   if __has_feature(has_trivial_destructor)
    151 #     define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
    152 #   endif
    153 #   if __has_feature(has_nothrow_constructor)
    154 #     define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
    155 #   endif
    156 #   if __has_feature(has_nothrow_copy)
    157 #     define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value)
    158 #   endif
    159 #   if __has_feature(has_nothrow_assign)
    160 #     define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
    161 #   endif
    162 #   if __has_feature(has_virtual_destructor)
    163 #     define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    164 #   endif
    165 #   if __has_feature(is_abstract)
    166 #     define BOOST_IS_ABSTRACT(T) __is_abstract(T)
    167 #   endif
    168 #   if __has_feature(is_base_of)
    169 #     define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
    170 #   endif
    171 #   if __has_feature(is_class)
    172 #     define BOOST_IS_CLASS(T) __is_class(T)
    173 #   endif
    174 #   if __has_feature(is_convertible_to)
    175 #     include <boost/type_traits/is_abstract.hpp>
    176 #     define BOOST_IS_CONVERTIBLE(T,U) (__is_convertible_to(T,U) && !::boost::is_abstract<U>::value)
    177 #   endif
    178 #   if __has_feature(is_enum)
    179 #     define BOOST_IS_ENUM(T) __is_enum(T)
    180 #   endif
    181 #   if __has_feature(is_polymorphic)
    182 #     define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
    183 #   endif
    184 #   define BOOST_ALIGNMENT_OF(T) __alignof(T)
    185 
    186 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    187 #endif
    188 
    189 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
    190 #   include <boost/type_traits/is_same.hpp>
    191 #   include <boost/type_traits/is_reference.hpp>
    192 #   include <boost/type_traits/is_volatile.hpp>
    193 
    194 #ifdef BOOST_INTEL
    195 #  define BOOST_INTEL_TT_OPTS || is_pod<T>::value
    196 #else
    197 #  define BOOST_INTEL_TT_OPTS
    198 #endif
    199 
    200 #   define BOOST_IS_UNION(T) __is_union(T)
    201 #   define BOOST_IS_POD(T) __is_pod(T)
    202 #   define BOOST_IS_EMPTY(T) __is_empty(T)
    203 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ((__has_trivial_constructor(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value)
    204 #   define BOOST_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_INTEL_TT_OPTS) && !is_reference<T>::value && ! ::boost::is_volatile<T>::value)
    205 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value)
    206 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_INTEL_TT_OPTS)
    207 #   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) BOOST_INTEL_TT_OPTS)
    208 #   define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value)
    209 #   define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value)
    210 #   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    211 
    212 #   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
    213 #   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
    214 #   define BOOST_IS_CLASS(T) __is_class(T)
    215 #   define BOOST_IS_ENUM(T) __is_enum(T)
    216 #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
    217 #   if (!defined(unix) && !defined(__unix__)) || defined(__LP64__)
    218       // GCC sometimes lies about alignment requirements
    219       // of type double on 32-bit unix platforms, use the
    220       // old implementation instead in that case:
    221 #     define BOOST_ALIGNMENT_OF(T) __alignof__(T)
    222 #   endif
    223 
    224 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    225 #endif
    226 
    227 #if defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
    228 #   include <boost/type_traits/is_same.hpp>
    229 #   include <boost/type_traits/is_reference.hpp>
    230 #   include <boost/type_traits/is_volatile.hpp>
    231 
    232 #   define BOOST_IS_UNION(T) __is_union(T)
    233 #   define BOOST_IS_POD(T) __is_pod(T)
    234 #   define BOOST_IS_EMPTY(T) __is_empty(T)
    235 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
    236 #   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value && !is_volatile<T>::value)
    237 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
    238 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
    239 #   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
    240 #   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value)
    241 #   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
    242 #   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    243 
    244 #   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
    245 #   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)
    246 #   define BOOST_IS_CLASS(T) __is_class(T)
    247 #   define BOOST_IS_ENUM(T) __is_enum(T)
    248 #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
    249 #   define BOOST_ALIGNMENT_OF(T) __alignof__(T)
    250 
    251 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    252 #endif
    253 
    254 # if defined(__CODEGEARC__)
    255 #   include <boost/type_traits/is_same.hpp>
    256 #   include <boost/type_traits/is_reference.hpp>
    257 #   include <boost/type_traits/is_volatile.hpp>
    258 #   include <boost/type_traits/is_void.hpp>
    259 
    260 #   define BOOST_IS_UNION(T) __is_union(T)
    261 #   define BOOST_IS_POD(T) __is_pod(T)
    262 #   define BOOST_IS_EMPTY(T) __is_empty(T)
    263 #   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T))
    264 #   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T) && !is_volatile<T>::value && !is_reference<T>::value)
    265 #   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
    266 #   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T))
    267 #   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T))
    268 #   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy_constructor(T) && !is_volatile<T>::value && !is_reference<T>::value)
    269 #   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
    270 #   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    271 
    272 #   define BOOST_IS_ABSTRACT(T) __is_abstract(T)
    273 #   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_void<T>::value && !is_void<U>::value)
    274 #   define BOOST_IS_CLASS(T) __is_class(T)
    275 #   define BOOST_IS_CONVERTIBLE(T,U) (__is_convertible(T,U) || is_void<U>::value)
    276 #   define BOOST_IS_ENUM(T) __is_enum(T)
    277 #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
    278 #   define BOOST_ALIGNMENT_OF(T) alignof(T)
    279 
    280 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    281 #endif
    282 
    283 #endif // BOOST_TT_INTRINSICS_HPP_INCLUDED
    284 
    285 
    286 
    287 
    288 
    289 
    290