Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:38:06

0001 /*!
0002 @file
0003 Defines function-like equivalents to the standard `<type_traits>`, and also
0004 to some utilities like `std::declval`.
0005 
0006 Copyright Louis Dionne 2013-2022
0007 Distributed under the Boost Software License, Version 1.0.
0008 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
0009  */
0010 
0011 #ifndef BOOST_HANA_TRAITS_HPP
0012 #define BOOST_HANA_TRAITS_HPP
0013 
0014 #include <boost/hana/config.hpp>
0015 #include <boost/hana/integral_constant.hpp>
0016 #include <boost/hana/type.hpp>
0017 
0018 #include <cstddef>
0019 #include <type_traits>
0020 
0021 
0022 namespace boost { namespace hana { namespace traits {
0023     namespace detail {
0024         // We use this instead of hana::integral because we want to return
0025         // hana::integral_constants instead of std::integral_constants.
0026         template <template <typename ...> class F>
0027         struct hana_trait {
0028             template <typename ...T>
0029             constexpr auto operator()(T const& ...) const {
0030                 using Result = typename F<typename T::type...>::type;
0031                 return hana::integral_c<typename Result::value_type, Result::value>;
0032             }
0033         };
0034     }
0035 
0036     ///////////////////////
0037     // Type properties
0038     ///////////////////////
0039     // Primary type categories
0040     BOOST_HANA_INLINE_VARIABLE constexpr auto is_void = detail::hana_trait<std::is_void>{};
0041     BOOST_HANA_INLINE_VARIABLE constexpr auto is_null_pointer = detail::hana_trait<std::is_null_pointer>{};
0042     BOOST_HANA_INLINE_VARIABLE constexpr auto is_integral = detail::hana_trait<std::is_integral>{};
0043     BOOST_HANA_INLINE_VARIABLE constexpr auto is_floating_point = detail::hana_trait<std::is_floating_point>{};
0044     BOOST_HANA_INLINE_VARIABLE constexpr auto is_array = detail::hana_trait<std::is_array>{};
0045     BOOST_HANA_INLINE_VARIABLE constexpr auto is_enum = detail::hana_trait<std::is_enum>{};
0046     BOOST_HANA_INLINE_VARIABLE constexpr auto is_union = detail::hana_trait<std::is_union>{};
0047     BOOST_HANA_INLINE_VARIABLE constexpr auto is_class = detail::hana_trait<std::is_class>{};
0048     BOOST_HANA_INLINE_VARIABLE constexpr auto is_function = detail::hana_trait<std::is_function>{};
0049     BOOST_HANA_INLINE_VARIABLE constexpr auto is_pointer = detail::hana_trait<std::is_pointer>{};
0050     BOOST_HANA_INLINE_VARIABLE constexpr auto is_lvalue_reference = detail::hana_trait<std::is_lvalue_reference>{};
0051     BOOST_HANA_INLINE_VARIABLE constexpr auto is_rvalue_reference = detail::hana_trait<std::is_rvalue_reference>{};
0052     BOOST_HANA_INLINE_VARIABLE constexpr auto is_member_object_pointer = detail::hana_trait<std::is_member_object_pointer>{};
0053     BOOST_HANA_INLINE_VARIABLE constexpr auto is_member_function_pointer = detail::hana_trait<std::is_member_function_pointer>{};
0054 
0055     // Composite type categories
0056     BOOST_HANA_INLINE_VARIABLE constexpr auto is_fundamental = detail::hana_trait<std::is_fundamental>{};
0057     BOOST_HANA_INLINE_VARIABLE constexpr auto is_arithmetic = detail::hana_trait<std::is_arithmetic>{};
0058     BOOST_HANA_INLINE_VARIABLE constexpr auto is_scalar = detail::hana_trait<std::is_scalar>{};
0059     BOOST_HANA_INLINE_VARIABLE constexpr auto is_object = detail::hana_trait<std::is_object>{};
0060     BOOST_HANA_INLINE_VARIABLE constexpr auto is_compound = detail::hana_trait<std::is_compound>{};
0061     BOOST_HANA_INLINE_VARIABLE constexpr auto is_reference = detail::hana_trait<std::is_reference>{};
0062     BOOST_HANA_INLINE_VARIABLE constexpr auto is_member_pointer = detail::hana_trait<std::is_member_pointer>{};
0063 
0064     // Type properties
0065     BOOST_HANA_INLINE_VARIABLE constexpr auto is_const = detail::hana_trait<std::is_const>{};
0066     BOOST_HANA_INLINE_VARIABLE constexpr auto is_volatile = detail::hana_trait<std::is_volatile>{};
0067     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivial = detail::hana_trait<std::is_trivial>{};
0068     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_copyable = detail::hana_trait<std::is_trivially_copyable>{};
0069     BOOST_HANA_INLINE_VARIABLE constexpr auto is_standard_layout = detail::hana_trait<std::is_standard_layout>{};
0070 #if __cplusplus < 202002L
0071     BOOST_HANA_INLINE_VARIABLE constexpr auto is_pod = detail::hana_trait<std::is_pod>{};
0072 #endif
0073 #if __cplusplus < 201703L
0074     BOOST_HANA_INLINE_VARIABLE constexpr auto is_literal_type = detail::hana_trait<std::is_literal_type>{};
0075 #endif
0076     BOOST_HANA_INLINE_VARIABLE constexpr auto is_empty = detail::hana_trait<std::is_empty>{};
0077     BOOST_HANA_INLINE_VARIABLE constexpr auto is_polymorphic = detail::hana_trait<std::is_polymorphic>{};
0078     BOOST_HANA_INLINE_VARIABLE constexpr auto is_abstract = detail::hana_trait<std::is_abstract>{};
0079     BOOST_HANA_INLINE_VARIABLE constexpr auto is_signed = detail::hana_trait<std::is_signed>{};
0080     BOOST_HANA_INLINE_VARIABLE constexpr auto is_unsigned = detail::hana_trait<std::is_unsigned>{};
0081 
0082     // Supported operations
0083     BOOST_HANA_INLINE_VARIABLE constexpr auto is_constructible = detail::hana_trait<std::is_constructible>{};
0084     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_constructible = detail::hana_trait<std::is_trivially_constructible>{};
0085     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_constructible = detail::hana_trait<std::is_nothrow_constructible>{};
0086 
0087     BOOST_HANA_INLINE_VARIABLE constexpr auto is_default_constructible = detail::hana_trait<std::is_default_constructible>{};
0088     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_default_constructible = detail::hana_trait<std::is_trivially_default_constructible>{};
0089     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_default_constructible = detail::hana_trait<std::is_nothrow_default_constructible>{};
0090 
0091     BOOST_HANA_INLINE_VARIABLE constexpr auto is_copy_constructible = detail::hana_trait<std::is_copy_constructible>{};
0092     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_copy_constructible = detail::hana_trait<std::is_trivially_copy_constructible>{};
0093     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_copy_constructible = detail::hana_trait<std::is_nothrow_copy_constructible>{};
0094 
0095     BOOST_HANA_INLINE_VARIABLE constexpr auto is_move_constructible = detail::hana_trait<std::is_move_constructible>{};
0096     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_move_constructible = detail::hana_trait<std::is_trivially_move_constructible>{};
0097     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_move_constructible = detail::hana_trait<std::is_nothrow_move_constructible>{};
0098 
0099     BOOST_HANA_INLINE_VARIABLE constexpr auto is_assignable = detail::hana_trait<std::is_assignable>{};
0100     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_assignable = detail::hana_trait<std::is_trivially_assignable>{};
0101     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_assignable = detail::hana_trait<std::is_nothrow_assignable>{};
0102 
0103     BOOST_HANA_INLINE_VARIABLE constexpr auto is_copy_assignable = detail::hana_trait<std::is_copy_assignable>{};
0104     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_copy_assignable = detail::hana_trait<std::is_trivially_copy_assignable>{};
0105     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_copy_assignable = detail::hana_trait<std::is_nothrow_copy_assignable>{};
0106 
0107     BOOST_HANA_INLINE_VARIABLE constexpr auto is_move_assignable = detail::hana_trait<std::is_move_assignable>{};
0108     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_move_assignable = detail::hana_trait<std::is_trivially_move_assignable>{};
0109     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_move_assignable = detail::hana_trait<std::is_nothrow_move_assignable>{};
0110 
0111     BOOST_HANA_INLINE_VARIABLE constexpr auto is_destructible = detail::hana_trait<std::is_destructible>{};
0112     BOOST_HANA_INLINE_VARIABLE constexpr auto is_trivially_destructible = detail::hana_trait<std::is_trivially_destructible>{};
0113     BOOST_HANA_INLINE_VARIABLE constexpr auto is_nothrow_destructible = detail::hana_trait<std::is_nothrow_destructible>{};
0114 
0115     BOOST_HANA_INLINE_VARIABLE constexpr auto has_virtual_destructor = detail::hana_trait<std::has_virtual_destructor>{};
0116 
0117     // Property queries
0118     BOOST_HANA_INLINE_VARIABLE constexpr auto alignment_of = detail::hana_trait<std::alignment_of>{};
0119     BOOST_HANA_INLINE_VARIABLE constexpr auto rank = detail::hana_trait<std::rank>{};
0120     BOOST_HANA_INLINE_VARIABLE constexpr struct extent_t {
0121         template <typename T, typename N>
0122         constexpr auto operator()(T const&, N const&) const {
0123             constexpr unsigned n = N::value;
0124             using Result = typename std::extent<typename T::type, n>::type;
0125             return hana::integral_c<typename Result::value_type, Result::value>;
0126         }
0127 
0128         template <typename T>
0129         constexpr auto operator()(T const& t) const
0130         { return (*this)(t, hana::uint_c<0>); }
0131     } extent{};
0132 
0133     // Type relationships
0134     BOOST_HANA_INLINE_VARIABLE constexpr auto is_same = detail::hana_trait<std::is_same>{};
0135     BOOST_HANA_INLINE_VARIABLE constexpr auto is_base_of = detail::hana_trait<std::is_base_of>{};
0136     BOOST_HANA_INLINE_VARIABLE constexpr auto is_convertible = detail::hana_trait<std::is_convertible>{};
0137 
0138     ///////////////////////
0139     // Type modifications
0140     ///////////////////////
0141     // Const-volatility specifiers
0142     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_cv = metafunction<std::remove_cv>;
0143     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_const = metafunction<std::remove_const>;
0144     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_volatile = metafunction<std::remove_volatile>;
0145 
0146     BOOST_HANA_INLINE_VARIABLE constexpr auto add_cv = metafunction<std::add_cv>;
0147     BOOST_HANA_INLINE_VARIABLE constexpr auto add_const = metafunction<std::add_const>;
0148     BOOST_HANA_INLINE_VARIABLE constexpr auto add_volatile = metafunction<std::add_volatile>;
0149 
0150     // References
0151     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_reference = metafunction<std::remove_reference>;
0152     BOOST_HANA_INLINE_VARIABLE constexpr auto add_lvalue_reference = metafunction<std::add_lvalue_reference>;
0153     BOOST_HANA_INLINE_VARIABLE constexpr auto add_rvalue_reference = metafunction<std::add_rvalue_reference>;
0154 
0155     // Pointers
0156     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_pointer = metafunction<std::remove_pointer>;
0157     BOOST_HANA_INLINE_VARIABLE constexpr auto add_pointer = metafunction<std::add_pointer>;
0158 
0159     // Sign modifiers
0160     BOOST_HANA_INLINE_VARIABLE constexpr auto make_signed = metafunction<std::make_signed>;
0161     BOOST_HANA_INLINE_VARIABLE constexpr auto make_unsigned = metafunction<std::make_unsigned>;
0162 
0163     // Arrays
0164     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_extent = metafunction<std::remove_extent>;
0165     BOOST_HANA_INLINE_VARIABLE constexpr auto remove_all_extents = metafunction<std::remove_all_extents>;
0166 
0167     // Miscellaneous transformations
0168     BOOST_HANA_INLINE_VARIABLE constexpr struct aligned_storage_t {
0169         template <typename Len, typename Align>
0170         constexpr auto operator()(Len const&, Align const&) const {
0171             constexpr std::size_t len = Len::value;
0172             constexpr std::size_t align = Align::value;
0173             using Result = typename std::aligned_storage<len, align>::type;
0174             return hana::type_c<Result>;
0175         }
0176 
0177         template <typename Len>
0178         constexpr auto operator()(Len const&) const {
0179             constexpr std::size_t len = Len::value;
0180             using Result = typename std::aligned_storage<len>::type;
0181             return hana::type_c<Result>;
0182         }
0183     } aligned_storage{};
0184 
0185     BOOST_HANA_INLINE_VARIABLE constexpr struct aligned_union_t {
0186         template <typename Len, typename ...T>
0187         constexpr auto operator()(Len const&, T const&...) const {
0188             constexpr std::size_t len = Len::value;
0189             using Result = typename std::aligned_union<len, typename T::type...>::type;
0190             return hana::type_c<Result>;
0191         }
0192     } aligned_union{};
0193 
0194     BOOST_HANA_INLINE_VARIABLE constexpr auto decay = metafunction<std::decay>;
0195     // enable_if
0196     // disable_if
0197     // conditional
0198 
0199     BOOST_HANA_INLINE_VARIABLE constexpr auto common_type = metafunction<std::common_type>;
0200     BOOST_HANA_INLINE_VARIABLE constexpr auto underlying_type = metafunction<std::underlying_type>;
0201 
0202 
0203     ///////////////////////
0204     // Utilities
0205     ///////////////////////
0206     struct declval_t {
0207         template <typename T>
0208         typename std::add_rvalue_reference<
0209             typename T::type
0210         >::type operator()(T const&) const;
0211     };
0212 
0213     BOOST_HANA_INLINE_VARIABLE constexpr declval_t declval{};
0214 } }} // end namespace boost::hana
0215 
0216 #endif // !BOOST_HANA_TRAITS_HPP