Edit: /usr/include/boost/hana/traits.hpp (10172B)
/*!
@file
Defines function-like equivalents to the standard `
`, and also
to some utilities like `std::declval`.
@copyright Louis Dionne 2013-2017
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_HANA_TRAITS_HPP
#define BOOST_HANA_TRAITS_HPP
#include
#include
#include
#include
#include
BOOST_HANA_NAMESPACE_BEGIN namespace traits {
namespace detail {
// We use this instead of hana::integral because we want to return
// hana::integral_constants instead of std::integral_constants.
template class F>
struct hana_trait {
template
constexpr auto operator()(T const& ...) const {
using Result = typename F::type;
return hana::integral_c;
}
};
}
///////////////////////
// Type properties
///////////////////////
// Primary type categories
constexpr auto is_void = detail::hana_trait{};
constexpr auto is_null_pointer = detail::hana_trait{};
constexpr auto is_integral = detail::hana_trait{};
constexpr auto is_floating_point = detail::hana_trait{};
constexpr auto is_array = detail::hana_trait{};
constexpr auto is_enum = detail::hana_trait{};
constexpr auto is_union = detail::hana_trait{};
constexpr auto is_class = detail::hana_trait{};
constexpr auto is_function = detail::hana_trait{};
constexpr auto is_pointer = detail::hana_trait{};
constexpr auto is_lvalue_reference = detail::hana_trait{};
constexpr auto is_rvalue_reference = detail::hana_trait{};
constexpr auto is_member_object_pointer = detail::hana_trait{};
constexpr auto is_member_function_pointer = detail::hana_trait{};
// Composite type categories
constexpr auto is_fundamental = detail::hana_trait{};
constexpr auto is_arithmetic = detail::hana_trait{};
constexpr auto is_scalar = detail::hana_trait{};
constexpr auto is_object = detail::hana_trait{};
constexpr auto is_compound = detail::hana_trait{};
constexpr auto is_reference = detail::hana_trait{};
constexpr auto is_member_pointer = detail::hana_trait{};
// Type properties
constexpr auto is_const = detail::hana_trait{};
constexpr auto is_volatile = detail::hana_trait{};
constexpr auto is_trivial = detail::hana_trait{};
constexpr auto is_trivially_copyable = detail::hana_trait{};
constexpr auto is_standard_layout = detail::hana_trait{};
constexpr auto is_pod = detail::hana_trait{};
constexpr auto is_literal_type = detail::hana_trait{};
constexpr auto is_empty = detail::hana_trait{};
constexpr auto is_polymorphic = detail::hana_trait{};
constexpr auto is_abstract = detail::hana_trait{};
constexpr auto is_signed = detail::hana_trait{};
constexpr auto is_unsigned = detail::hana_trait{};
// Supported operations
constexpr auto is_constructible = detail::hana_trait{};
constexpr auto is_trivially_constructible = detail::hana_trait{};
constexpr auto is_nothrow_constructible = detail::hana_trait{};
constexpr auto is_default_constructible = detail::hana_trait{};
constexpr auto is_trivially_default_constructible = detail::hana_trait{};
constexpr auto is_nothrow_default_constructible = detail::hana_trait{};
constexpr auto is_copy_constructible = detail::hana_trait{};
constexpr auto is_trivially_copy_constructible = detail::hana_trait{};
constexpr auto is_nothrow_copy_constructible = detail::hana_trait{};
constexpr auto is_move_constructible = detail::hana_trait{};
constexpr auto is_trivially_move_constructible = detail::hana_trait{};
constexpr auto is_nothrow_move_constructible = detail::hana_trait{};
constexpr auto is_assignable = detail::hana_trait{};
constexpr auto is_trivially_assignable = detail::hana_trait{};
constexpr auto is_nothrow_assignable = detail::hana_trait{};
constexpr auto is_copy_assignable = detail::hana_trait{};
constexpr auto is_trivially_copy_assignable = detail::hana_trait{};
constexpr auto is_nothrow_copy_assignable = detail::hana_trait{};
constexpr auto is_move_assignable = detail::hana_trait{};
constexpr auto is_trivially_move_assignable = detail::hana_trait{};
constexpr auto is_nothrow_move_assignable = detail::hana_trait{};
constexpr auto is_destructible = detail::hana_trait{};
constexpr auto is_trivially_destructible = detail::hana_trait{};
constexpr auto is_nothrow_destructible = detail::hana_trait{};
constexpr auto has_virtual_destructor = detail::hana_trait{};
// Property queries
constexpr auto alignment_of = detail::hana_trait{};
constexpr auto rank = detail::hana_trait{};
constexpr struct extent_t {
template
constexpr auto operator()(T const&, N const&) const {
constexpr unsigned n = N::value;
using Result = typename std::extent::type;
return hana::integral_c;
}
template
constexpr auto operator()(T const& t) const
{ return (*this)(t, hana::uint_c<0>); }
} extent{};
// Type relationships
constexpr auto is_same = detail::hana_trait{};
constexpr auto is_base_of = detail::hana_trait{};
constexpr auto is_convertible = detail::hana_trait{};
///////////////////////
// Type modifications
///////////////////////
// Const-volatility specifiers
constexpr auto remove_cv = metafunction;
constexpr auto remove_const = metafunction;
constexpr auto remove_volatile = metafunction;
constexpr auto add_cv = metafunction;
constexpr auto add_const = metafunction;
constexpr auto add_volatile = metafunction;
// References
constexpr auto remove_reference = metafunction;
constexpr auto add_lvalue_reference = metafunction;
constexpr auto add_rvalue_reference = metafunction;
// Pointers
constexpr auto remove_pointer = metafunction;
constexpr auto add_pointer = metafunction;
// Sign modifiers
constexpr auto make_signed = metafunction;
constexpr auto make_unsigned = metafunction;
// Arrays
constexpr auto remove_extent = metafunction;
constexpr auto remove_all_extents = metafunction;
// Miscellaneous transformations
constexpr struct aligned_storage_t {
template
constexpr auto operator()(Len const&, Align const&) const {
constexpr std::size_t len = Len::value;
constexpr std::size_t align = Align::value;
using Result = typename std::aligned_storage::type;
return hana::type_c;
}
template
constexpr auto operator()(Len const&) const {
constexpr std::size_t len = Len::value;
using Result = typename std::aligned_storage::type;
return hana::type_c;
}
} aligned_storage{};
constexpr struct aligned_union_t {
template
constexpr auto operator()(Len const&, T const&...) const {
constexpr std::size_t len = Len::value;
using Result = typename std::aligned_union::type;
return hana::type_c;
}
} aligned_union{};
constexpr auto decay = metafunction;
// enable_if
// disable_if
// conditional
constexpr auto common_type = metafunction;
constexpr auto underlying_type = metafunction;
constexpr auto result_of = metafunction;
///////////////////////
// Utilities
///////////////////////
struct declval_t {
template
typename std::add_rvalue_reference<
typename T::type
>::type operator()(T const&) const;
};
constexpr declval_t declval{};
} BOOST_HANA_NAMESPACE_END
#endif // !BOOST_HANA_TRAITS_HPP