libstdc++: Improve Doxygen documentation groups [PR 101258]
This defines some new Doxygen groups for C++17 variable templates and for the contents of <experimental/type_traits>. By documenting the group as a whole and adding each template to a group we don't need to document them individually. Also mark more internals with "@cond undocumented" so that Doxygen ignores them by default. Also make Doxygen process <experimental/simd>. For some reason, many of the class templates in <type_traits> do not appear in the "Metaprogramming" group. For example, add_cv, remove_extent, and all the is_xxx_constructible and is_xxx_assignable traits. For some reason, Doxygen doesn't include them in the group, despite doing it correctly for other traits in the same header. Signed-off-by: Jonathan Wakely <jwakely@redhat.com> libstdc++-v3/ChangeLog: PR libstdc++/101258 * doc/doxygen/user.cfg.in (INPUT): Add <experimental/simd>. (COLS_IN_ALPHA_INDEX): Remove obsolete tag. (PREDEFINED): Add/fix some more macros that need to be expanded. * include/bits/random.h: Stop Doxygen from documenting internal implementation details. * include/bits/random.tcc: Likewise. * include/bits/this_thread_sleep.h: Fix @file name. * include/experimental/bits/simd.h: Add to Doxygen group. Do not document internal implementation details. * include/experimental/bits/simd_detail.h: Do not document internal implementation details. * include/experimental/simd: Define Doxygen groups. * include/experimental/type_traits: Improve documentation for the header file. Define groups. Use @since commands. * include/std/scoped_allocator (scoped_allocator_adaptor): Move declaration before undocumented region. * include/std/type_traits (true_type, false_type): Use using declaration instead of typedef. (is_invocable_v, is_nothrow_invocable_v, is_invocable_r_v) (is_nothrow_invocable_r_v): Move definitions next to other C++17 variable templates. Do not document internal implementation details. Move misplaced group-end command. Define group for variable templates. * include/std/variant: Do not document internal implementation details. * testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error line number.
This commit is contained in:
parent
36adced3b6
commit
6963c3b9ed
@ -1013,6 +1013,7 @@ INPUT = @srcdir@/doc/doxygen/doxygroups.cc \
|
||||
include/experimental/ratio \
|
||||
include/experimental/regex \
|
||||
include/experimental/set \
|
||||
include/experimental/simd \
|
||||
include/experimental/string \
|
||||
include/experimental/string_view \
|
||||
include/experimental/system_error \
|
||||
@ -1334,13 +1335,6 @@ CLANG_DATABASE_PATH =
|
||||
|
||||
ALPHABETICAL_INDEX = YES
|
||||
|
||||
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
|
||||
# which the alphabetical index list will be split.
|
||||
# Minimum value: 1, maximum value: 20, default value: 5.
|
||||
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
|
||||
|
||||
COLS_IN_ALPHA_INDEX = 2
|
||||
|
||||
# In case all classes in a project start with a common prefix, all classes will
|
||||
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
|
||||
# can be used to specify a prefix (or a list of prefixes) that should be ignored
|
||||
@ -2415,7 +2409,8 @@ PREDEFINED = __cplusplus=201703L \
|
||||
"_GLIBCXX_END_NAMESPACE_CXX11= " \
|
||||
"_GLIBCXX_END_NAMESPACE_LDBL= " \
|
||||
"_GLIBCXX_TEMPLATE_ARGS=... " \
|
||||
_GLIBCXX_DEPRECATED \
|
||||
"_GLIBCXX_DEPRECATED= " \
|
||||
"_GLIBCXX_DEPRECATED_SUGGEST(E)= " \
|
||||
_GLIBCXX_CONSTEXPR=constexpr \
|
||||
_GLIBCXX_USE_CONSTEXPR=constexpr \
|
||||
"_GLIBCXX_THROW(E)= " \
|
||||
@ -2430,6 +2425,7 @@ PREDEFINED = __cplusplus=201703L \
|
||||
_GLIBCXX_USE_NANOSLEEP \
|
||||
__cpp_exceptions \
|
||||
__cpp_rtti \
|
||||
__cpp_inline_variables \
|
||||
ATOMIC_INT_LOCK_FREE=2 \
|
||||
PB_DS_DATA_TRUE_INDICATOR \
|
||||
PB_DS_STATIC_ASSERT=// \
|
||||
@ -2440,11 +2436,16 @@ PREDEFINED = __cplusplus=201703L \
|
||||
__glibcxx_class_requires2=// \
|
||||
__glibcxx_class_requires3=// \
|
||||
__glibcxx_class_requires4=// \
|
||||
"__attribute__(X)=" \
|
||||
"__attribute__(X)= " \
|
||||
_GLIBCXX14_CONSTEXPR=constexpr \
|
||||
_GLIBCXX17_CONSTEXPR=constexpr \
|
||||
_GLIBCXX20_CONSTEXPR=constexpr \
|
||||
_GLIBCXX17_DEPRECATED= \
|
||||
"_GLIBCXX11_DEPRECATED= " \
|
||||
"_GLIBCXX11_DEPRECATED_SUGGEST(E)= " \
|
||||
"_GLIBCXX17_DEPRECATED= " \
|
||||
"_GLIBCXX17_DEPRECATED_SUGGEST(E)= " \
|
||||
"_GLIBCXX20_DEPRECATED(E)= " \
|
||||
"_GLIBCXX20_DEPRECATED(E)= " \
|
||||
_GLIBCXX17_INLINE=inline
|
||||
|
||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
|
||||
|
@ -60,9 +60,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
_RealType
|
||||
generate_canonical(_UniformRandomNumberGenerator& __g);
|
||||
|
||||
/*
|
||||
* Implementation-space details.
|
||||
*/
|
||||
/// @cond undocumented
|
||||
// Implementation-space details.
|
||||
namespace __detail
|
||||
{
|
||||
template<typename _UIntType, size_t __w,
|
||||
@ -212,6 +211,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
>;
|
||||
|
||||
} // namespace __detail
|
||||
/// @endcond
|
||||
|
||||
/**
|
||||
* @addtogroup random_generators Random Number Generators
|
||||
|
@ -36,9 +36,8 @@ namespace std _GLIBCXX_VISIBILITY(default)
|
||||
{
|
||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
/*
|
||||
* (Further) implementation-space details.
|
||||
*/
|
||||
/// @cond undocumented
|
||||
// (Further) implementation-space details.
|
||||
namespace __detail
|
||||
{
|
||||
// General case for x = (ax + c) mod m -- use Schrage's algorithm
|
||||
@ -90,6 +89,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
}
|
||||
|
||||
} // namespace __detail
|
||||
/// @endcond
|
||||
|
||||
template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
|
||||
constexpr _UIntType
|
||||
|
@ -22,7 +22,7 @@
|
||||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
/** @file bits/std_thread_sleep.h
|
||||
/** @file bits/this_thread_sleep.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* Do not attempt to use it directly. @headername{thread}
|
||||
*/
|
||||
|
@ -45,6 +45,9 @@
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
|
||||
/** @ingroup ts_simd
|
||||
* @{
|
||||
*/
|
||||
/* There are several closely related types, with the following naming
|
||||
* convention:
|
||||
* _Tp: vectorizable (arithmetic) type (or any type)
|
||||
@ -4035,6 +4038,7 @@ template <typename _Tp, typename _Abi, size_t _Np>
|
||||
|
||||
// }}}
|
||||
|
||||
/// @cond undocumented
|
||||
// _SmartReference {{{
|
||||
template <typename _Up, typename _Accessor = _Up,
|
||||
typename _ValueType = typename _Up::value_type>
|
||||
@ -4316,6 +4320,7 @@ template <typename _Tp, size_t _Np, typename>
|
||||
struct __deduce_impl : public __deduce_fixed_size_fallback<_Tp, _Np> {};
|
||||
|
||||
//}}}1
|
||||
/// @endcond
|
||||
|
||||
// simd_mask {{{
|
||||
template <typename _Tp, typename _Abi>
|
||||
@ -4663,6 +4668,7 @@ template <typename _Tp, typename _Abi>
|
||||
|
||||
// }}}
|
||||
|
||||
/// @cond undocumented
|
||||
// __data(simd_mask) {{{
|
||||
template <typename _Tp, typename _Ap>
|
||||
_GLIBCXX_SIMD_INTRINSIC constexpr const auto&
|
||||
@ -4675,6 +4681,7 @@ template <typename _Tp, typename _Ap>
|
||||
{ return __x._M_data; }
|
||||
|
||||
// }}}
|
||||
/// @endcond
|
||||
|
||||
// simd_mask reductions [simd_mask.reductions] {{{
|
||||
template <typename _Tp, typename _Abi>
|
||||
@ -4817,6 +4824,7 @@ find_last_set(_ExactBool)
|
||||
|
||||
// }}}
|
||||
|
||||
/// @cond undocumented
|
||||
// _SimdIntOperators{{{1
|
||||
template <typename _V, typename _Impl, bool>
|
||||
class _SimdIntOperators {};
|
||||
@ -4937,6 +4945,7 @@ template <typename _V, typename _Impl>
|
||||
};
|
||||
|
||||
//}}}1
|
||||
/// @endcond
|
||||
|
||||
// simd {{{
|
||||
template <typename _Tp, typename _Abi>
|
||||
@ -5212,6 +5221,7 @@ template <typename _Tp, typename _Abi>
|
||||
};
|
||||
|
||||
// }}}
|
||||
/// @cond undocumented
|
||||
// __data {{{
|
||||
template <typename _Tp, typename _Ap>
|
||||
_GLIBCXX_SIMD_INTRINSIC constexpr const auto&
|
||||
@ -5255,7 +5265,9 @@ template <typename _Tp, typename _Ap>
|
||||
operator~(const simd<_Tp, _Ap>& __a)
|
||||
{ return {__private_init, _Ap::_SimdImpl::_S_complement(__data(__a))}; }
|
||||
} // namespace __float_bitwise_operators }}}
|
||||
/// @endcond
|
||||
|
||||
/// @}
|
||||
_GLIBCXX_SIMD_END_NAMESPACE
|
||||
|
||||
#endif // __cplusplus >= 201703L
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
#define _GLIBCXX_SIMD_BEGIN_NAMESPACE \
|
||||
namespace std _GLIBCXX_VISIBILITY(default) \
|
||||
@ -300,6 +301,8 @@
|
||||
#define _GLIBCXX_SIMD_FIX_P2TS_ISSUE66 1
|
||||
// }}}
|
||||
|
||||
/// @endcond
|
||||
|
||||
#endif // __cplusplus >= 201703L
|
||||
#endif // _GLIBCXX_EXPERIMENTAL_SIMD_DETAIL_H_
|
||||
|
||||
|
@ -35,6 +35,23 @@
|
||||
|
||||
#if __cplusplus >= 201703L
|
||||
|
||||
/** @defgroup par-ts Parallelism TS
|
||||
* @ingroup experimental
|
||||
*
|
||||
* Components defined by the _C++ Extensions for Parallelism_
|
||||
* Technical Specification.
|
||||
*
|
||||
* - ISO/IEC TS 19570:2015 C++ Extensions for Parallelism
|
||||
* - ISO/IEC TS 19570:2018 C++ Extensions for Parallelism, Version 2
|
||||
*/
|
||||
|
||||
/** @defgroup ts_simd Data parallel extensions
|
||||
* @ingroup par-ts
|
||||
*
|
||||
* Data-parallel types library.
|
||||
* @since C++17
|
||||
*/
|
||||
/// @ingroup ts_simd
|
||||
#define __cpp_lib_experimental_parallel_simd 201803
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
|
@ -24,7 +24,14 @@
|
||||
|
||||
/** @file experimental/type_traits
|
||||
* This is a TS C++ Library header.
|
||||
*
|
||||
* This header defines variable templates for the C++14 type traits.
|
||||
*
|
||||
* Equivalent variable templates are defined in namespace `std` since C++17.
|
||||
* @see variable_templates
|
||||
*
|
||||
* @ingroup libfund-ts
|
||||
* @since C++14
|
||||
*/
|
||||
|
||||
//
|
||||
@ -49,6 +56,14 @@ namespace experimental
|
||||
{
|
||||
inline namespace fundamentals_v1
|
||||
{
|
||||
/** @defgroup lfts_variable_templates Variable template for type traits
|
||||
* @ingroup libfund-ts
|
||||
* @since Library Fundamentals TS v1. C++14.
|
||||
* @see variable_templates
|
||||
*/
|
||||
/** @ingroup lfts_variable_templates
|
||||
* @{
|
||||
*/
|
||||
#define __cpp_lib_experimental_type_trait_variable_templates 201402
|
||||
|
||||
// See C++14 20.10.4.1, primary type categories
|
||||
@ -213,7 +228,7 @@ template <typename _Base, typename _Derived>
|
||||
constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
|
||||
template <typename _From, typename _To>
|
||||
constexpr bool is_convertible_v = is_convertible<_From, _To>::value;
|
||||
|
||||
/// @}
|
||||
|
||||
// 3.3.2, Other type transformations
|
||||
// invocation_type (still unimplemented)
|
||||
@ -224,14 +239,24 @@ template <typename _From, typename _To>
|
||||
|
||||
inline namespace fundamentals_v2
|
||||
{
|
||||
/**
|
||||
* @defgroup lfts_detect Detection idiom
|
||||
* @ingroup libfund-ts
|
||||
* @since Library Fundamentals TS v2. C++14.
|
||||
*/
|
||||
/** @ingroup lfts_detect
|
||||
* @{
|
||||
*/
|
||||
#define __cpp_lib_experimental_detect 201505
|
||||
|
||||
// [meta.detect]
|
||||
|
||||
/// A metafunction that always yields void, used for detecting valid types.
|
||||
template<typename...> using void_t = void;
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
|
||||
/// @internal
|
||||
struct __nonesuchbase {};
|
||||
struct nonesuch : private __nonesuchbase
|
||||
{
|
||||
@ -272,7 +297,16 @@ template<typename _To, template<typename...> class _Op, typename... _Args>
|
||||
template<typename _To, template<typename...> class _Op, typename... _Args>
|
||||
constexpr bool is_detected_convertible_v
|
||||
= is_detected_convertible<_To, _Op, _Args...>::value;
|
||||
/// @}
|
||||
|
||||
/**
|
||||
* @defgroup lfts_logical Logical operator traits
|
||||
* @ingroup libfund-ts
|
||||
* @since Library Fundamentals TS v2. C++14.
|
||||
*/
|
||||
/** @ingroup lfts_logical
|
||||
* @{
|
||||
*/
|
||||
#define __cpp_lib_experimental_logical_traits 201511
|
||||
|
||||
template<typename... _Bn>
|
||||
@ -301,6 +335,7 @@ template<typename... _Bn>
|
||||
template<typename _Pp>
|
||||
constexpr bool negation_v
|
||||
= negation<_Pp>::value;
|
||||
/// @}
|
||||
} // namespace fundamentals_v2
|
||||
} // namespace experimental
|
||||
|
||||
|
@ -53,6 +53,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
* @{
|
||||
*/
|
||||
|
||||
template<typename _OuterAlloc, typename... _InnerAllocs>
|
||||
class scoped_allocator_adaptor;
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
template<typename _Alloc>
|
||||
@ -81,15 +84,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
{ return __base::_S_outermost(__a.outer_allocator()); }
|
||||
};
|
||||
|
||||
/// Implementation of the OUTERMOST pseudofunction
|
||||
// Implementation of the OUTERMOST pseudofunction
|
||||
template<typename _Alloc>
|
||||
inline typename __outermost_type<_Alloc>::type&
|
||||
__outermost(_Alloc& __a)
|
||||
{ return __outermost_type<_Alloc>::_S_outermost(__a); }
|
||||
|
||||
template<typename _OuterAlloc, typename... _InnerAllocs>
|
||||
class scoped_allocator_adaptor;
|
||||
|
||||
template<typename...>
|
||||
struct __inner_type_impl;
|
||||
|
||||
|
@ -41,6 +41,12 @@ namespace std _GLIBCXX_VISIBILITY(default)
|
||||
{
|
||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
template<typename... _Elements>
|
||||
class tuple;
|
||||
|
||||
template<typename _Tp>
|
||||
class reference_wrapper;
|
||||
|
||||
/**
|
||||
* @defgroup metaprogramming Metaprogramming
|
||||
* @ingroup utilities
|
||||
@ -49,6 +55,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
* including type classification traits, type property inspection traits
|
||||
* and type transformation traits.
|
||||
*
|
||||
* @since C++11
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
@ -72,25 +80,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
constexpr _Tp integral_constant<_Tp, __v>::value;
|
||||
|
||||
/// The type used as a compile-time boolean with true value.
|
||||
typedef integral_constant<bool, true> true_type;
|
||||
using true_type = integral_constant<bool, true>;
|
||||
|
||||
/// The type used as a compile-time boolean with false value.
|
||||
typedef integral_constant<bool, false> false_type;
|
||||
using false_type = integral_constant<bool, false>;
|
||||
|
||||
/// @cond undocumented
|
||||
/// bool_constant for C++11
|
||||
template<bool __v>
|
||||
using __bool_constant = integral_constant<bool, __v>;
|
||||
/// @endcond
|
||||
|
||||
#if __cplusplus > 201402L
|
||||
#if __cplusplus >= 201703L
|
||||
# define __cpp_lib_bool_constant 201505
|
||||
/// Alias template for compile-time boolean constant types.
|
||||
/// @since C++17
|
||||
template<bool __v>
|
||||
using bool_constant = integral_constant<bool, __v>;
|
||||
#endif
|
||||
|
||||
// Meta programming helper types.
|
||||
// Metaprogramming helper types.
|
||||
|
||||
template<bool, typename, typename>
|
||||
struct conditional;
|
||||
|
||||
/// @cond undocumented
|
||||
template <typename _Type>
|
||||
struct __type_identity
|
||||
{ using type = _Type; };
|
||||
@ -148,13 +162,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __not_
|
||||
: public __bool_constant<!bool(_Pp::value)>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
#if __cplusplus >= 201703L
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename... _Bn>
|
||||
inline constexpr bool __or_v = __or_<_Bn...>::value;
|
||||
template<typename... _Bn>
|
||||
inline constexpr bool __and_v = __and_<_Bn...>::value;
|
||||
/// @endcond
|
||||
|
||||
#define __cpp_lib_logical_traits 201510
|
||||
|
||||
@ -173,6 +190,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: __not_<_Pp>
|
||||
{ };
|
||||
|
||||
/** @ingroup variable_templates
|
||||
* @{
|
||||
*/
|
||||
template<typename... _Bn>
|
||||
inline constexpr bool conjunction_v = conjunction<_Bn...>::value;
|
||||
|
||||
@ -181,6 +201,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
template<typename _Pp>
|
||||
inline constexpr bool negation_v = negation<_Pp>::value;
|
||||
/// @}
|
||||
|
||||
#endif // C++17
|
||||
|
||||
@ -191,6 +212,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct is_function;
|
||||
template<typename>
|
||||
struct is_void;
|
||||
template<typename>
|
||||
struct remove_cv;
|
||||
template<typename>
|
||||
struct is_const;
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename>
|
||||
struct __is_array_unknown_bounds;
|
||||
|
||||
@ -223,16 +250,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __failure_type
|
||||
{ };
|
||||
|
||||
template<typename>
|
||||
struct remove_cv;
|
||||
|
||||
// __remove_cv_t (std::remove_cv_t for C++11).
|
||||
template<typename _Tp>
|
||||
using __remove_cv_t = typename remove_cv<_Tp>::type;
|
||||
|
||||
template<typename>
|
||||
struct is_const;
|
||||
|
||||
// Primary type categories.
|
||||
|
||||
template<typename>
|
||||
@ -242,6 +263,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<>
|
||||
struct __is_void_helper<void>
|
||||
: public true_type { };
|
||||
/// @endcond
|
||||
|
||||
/// is_void
|
||||
template<typename _Tp>
|
||||
@ -249,6 +271,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public __is_void_helper<__remove_cv_t<_Tp>>::type
|
||||
{ };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename>
|
||||
struct __is_integral_helper
|
||||
: public false_type { };
|
||||
@ -362,6 +385,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_3>
|
||||
: public true_type { };
|
||||
#endif
|
||||
/// @endcond
|
||||
|
||||
/// is_integral
|
||||
template<typename _Tp>
|
||||
@ -369,6 +393,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public __is_integral_helper<__remove_cv_t<_Tp>>::type
|
||||
{ };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename>
|
||||
struct __is_floating_point_helper
|
||||
: public false_type { };
|
||||
@ -390,6 +415,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_floating_point_helper<__float128>
|
||||
: public true_type { };
|
||||
#endif
|
||||
/// @endcond
|
||||
|
||||
/// is_floating_point
|
||||
template<typename _Tp>
|
||||
@ -518,6 +544,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
{ };
|
||||
|
||||
/// __is_nullptr_t (deprecated extension).
|
||||
/// @deprecated Use `is_null_pointer` instead.
|
||||
template<typename _Tp>
|
||||
struct __is_nullptr_t
|
||||
: public is_null_pointer<_Tp>
|
||||
@ -567,6 +594,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct is_compound
|
||||
: public __not_<is_fundamental<_Tp>>::type { };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp>
|
||||
struct __is_member_pointer_helper
|
||||
: public false_type { };
|
||||
@ -574,6 +602,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _Tp, typename _Cp>
|
||||
struct __is_member_pointer_helper<_Tp _Cp::*>
|
||||
: public true_type { };
|
||||
/// @endcond
|
||||
|
||||
/// is_member_pointer
|
||||
template<typename _Tp>
|
||||
@ -584,6 +613,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename, typename>
|
||||
struct is_same;
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, typename... _Types>
|
||||
using __is_one_of = __or_<is_same<_Tp, _Types>...>;
|
||||
|
||||
@ -644,6 +674,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_referenceable<_Tp, __void_t<_Tp&>>
|
||||
: public true_type
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
// Type properties.
|
||||
|
||||
@ -674,7 +705,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
// is_trivially_copyable
|
||||
/// is_trivially_copyable
|
||||
template<typename _Tp>
|
||||
struct is_trivially_copyable
|
||||
: public integral_constant<bool, __is_trivially_copyable(_Tp)>
|
||||
@ -692,7 +723,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// is_pod (deprecated in C++20)
|
||||
/** is_pod (deprecated in C++20)
|
||||
* @deprecated Use `is_standard_layout && is_trivial` instead.
|
||||
*/
|
||||
// Could use is_standard_layout && is_trivial instead of the builtin.
|
||||
template<typename _Tp>
|
||||
struct
|
||||
@ -704,7 +737,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// is_literal_type
|
||||
/** is_literal_type
|
||||
* @deprecated Deprecated in C++20. The idea of a literal type isn't useful.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
struct
|
||||
_GLIBCXX17_DEPRECATED
|
||||
@ -730,6 +765,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
#if __cplusplus >= 201402L
|
||||
#define __cpp_lib_is_final 201402L
|
||||
/// is_final
|
||||
/// @since C++14
|
||||
template<typename _Tp>
|
||||
struct is_final
|
||||
: public integral_constant<bool, __is_final(_Tp)>
|
||||
@ -742,6 +778,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public integral_constant<bool, __is_abstract(_Tp)>
|
||||
{ };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp,
|
||||
bool = is_arithmetic<_Tp>::value>
|
||||
struct __is_signed_helper
|
||||
@ -751,6 +788,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_signed_helper<_Tp, true>
|
||||
: public integral_constant<bool, _Tp(-1) < _Tp(0)>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// is_signed
|
||||
template<typename _Tp>
|
||||
@ -764,14 +802,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public __and_<is_arithmetic<_Tp>, __not_<is_signed<_Tp>>>
|
||||
{ };
|
||||
|
||||
|
||||
// Destructible and constructible type properties.
|
||||
|
||||
/**
|
||||
* @brief Utility to simplify expressions used in unevaluated operands
|
||||
* @ingroup utilities
|
||||
*/
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, typename _Up = _Tp&&>
|
||||
_Up
|
||||
__declval(int);
|
||||
@ -779,6 +810,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _Tp>
|
||||
_Tp
|
||||
__declval(long);
|
||||
/// @endcond
|
||||
|
||||
template<typename _Tp>
|
||||
auto declval() noexcept -> decltype(__declval<_Tp>(0));
|
||||
@ -789,6 +821,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename>
|
||||
struct remove_all_extents;
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp>
|
||||
struct __is_array_known_bounds
|
||||
: public integral_constant<bool, (extent<_Tp>::value > 0)>
|
||||
@ -799,6 +832,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public __and_<is_array<_Tp>, __not_<extent<_Tp>>>
|
||||
{ };
|
||||
|
||||
// Destructible and constructible type properties.
|
||||
|
||||
// In N3290 is_destructible does not say anything about function
|
||||
// types and abstract types, see LWG 2049. This implementation
|
||||
// describes function types as non-destructible and all complete
|
||||
@ -840,6 +875,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _Tp>
|
||||
struct __is_destructible_safe<_Tp, false, true>
|
||||
: public true_type { };
|
||||
/// @endcond
|
||||
|
||||
/// is_destructible
|
||||
template<typename _Tp>
|
||||
@ -850,6 +886,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
// is_nothrow_destructible requires that is_destructible is
|
||||
// satisfied as well. We realize that by mimicing the
|
||||
// implementation of is_destructible but refer to noexcept(expr)
|
||||
@ -891,6 +929,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _Tp>
|
||||
struct __is_nt_destructible_safe<_Tp, false, true>
|
||||
: public true_type { };
|
||||
/// @endcond
|
||||
|
||||
/// is_nothrow_destructible
|
||||
template<typename _Tp>
|
||||
@ -901,10 +940,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, typename... _Args>
|
||||
struct __is_constructible_impl
|
||||
: public __bool_constant<__is_constructible(_Tp, _Args...)>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// is_constructible
|
||||
template<typename _Tp, typename... _Args>
|
||||
@ -924,6 +965,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, bool = __is_referenceable<_Tp>::value>
|
||||
struct __is_copy_constructible_impl;
|
||||
|
||||
@ -935,6 +977,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_copy_constructible_impl<_Tp, true>
|
||||
: public __is_constructible_impl<_Tp, const _Tp&>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// is_copy_constructible
|
||||
template<typename _Tp>
|
||||
@ -945,6 +988,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, bool = __is_referenceable<_Tp>::value>
|
||||
struct __is_move_constructible_impl;
|
||||
|
||||
@ -956,6 +1000,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_move_constructible_impl<_Tp, true>
|
||||
: public __is_constructible_impl<_Tp, _Tp&&>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// is_move_constructible
|
||||
template<typename _Tp>
|
||||
@ -966,9 +1011,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, typename... _Args>
|
||||
using __is_nothrow_constructible_impl
|
||||
= __bool_constant<__is_nothrow_constructible(_Tp, _Args...)>;
|
||||
/// @endcond
|
||||
|
||||
/// is_nothrow_constructible
|
||||
template<typename _Tp, typename... _Args>
|
||||
@ -988,7 +1035,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, bool = __is_referenceable<_Tp>::value>
|
||||
struct __is_nothrow_copy_constructible_impl;
|
||||
|
||||
@ -1000,6 +1047,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_nothrow_copy_constructible_impl<_Tp, true>
|
||||
: public __is_nothrow_constructible_impl<_Tp, const _Tp&>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// is_nothrow_copy_constructible
|
||||
template<typename _Tp>
|
||||
@ -1010,6 +1058,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp, bool = __is_referenceable<_Tp>::value>
|
||||
struct __is_nothrow_move_constructible_impl;
|
||||
|
||||
@ -1021,6 +1070,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_nothrow_move_constructible_impl<_Tp, true>
|
||||
: public __is_nothrow_constructible_impl<_Tp, _Tp&&>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// is_nothrow_move_constructible
|
||||
template<typename _Tp>
|
||||
@ -1605,6 +1655,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
// Sign modifications.
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
// Utility for constructing identically cv-qualified types.
|
||||
template<typename _Unqualified, bool _IsConst, bool _IsVol>
|
||||
struct __cv_selector;
|
||||
@ -1776,6 +1828,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
using __type
|
||||
= typename __make_unsigned_selector<char32_t, false, true>::__type;
|
||||
};
|
||||
/// @endcond
|
||||
|
||||
// Given an integral/enum type, return the corresponding unsigned
|
||||
// integer type.
|
||||
@ -1789,6 +1842,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<>
|
||||
struct make_unsigned<bool>;
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
// Utility for finding the signed versions of unsigned integral types.
|
||||
template<typename _Tp>
|
||||
@ -1902,6 +1956,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
using __type
|
||||
= typename __make_signed_selector<char32_t, false, true>::__type;
|
||||
};
|
||||
/// @endcond
|
||||
|
||||
// Given an integral/enum type, return the corresponding signed
|
||||
// integer type.
|
||||
@ -1979,7 +2034,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public __remove_pointer_helper<_Tp, __remove_cv_t<_Tp>>
|
||||
{ };
|
||||
|
||||
/// add_pointer
|
||||
template<typename _Tp, bool = __or_<__is_referenceable<_Tp>,
|
||||
is_void<_Tp>>::value>
|
||||
struct __add_pointer_helper
|
||||
@ -1989,6 +2043,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __add_pointer_helper<_Tp, true>
|
||||
{ typedef typename remove_reference<_Tp>::type* type; };
|
||||
|
||||
/// add_pointer
|
||||
template<typename _Tp>
|
||||
struct add_pointer
|
||||
: public __add_pointer_helper<_Tp>
|
||||
@ -2082,6 +2137,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template <size_t _Len, typename... _Types>
|
||||
const size_t aligned_union<_Len, _Types...>::alignment_value;
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
// Decay trait for arrays and functions, used for perfect forwarding
|
||||
// in make_pair, make_tuple, etc.
|
||||
template<typename _Up,
|
||||
@ -2101,6 +2158,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _Up>
|
||||
struct __decay_selector<_Up, false, true>
|
||||
{ typedef typename add_pointer<_Up>::type __type; };
|
||||
/// @endcond
|
||||
|
||||
/// decay
|
||||
template<typename _Tp>
|
||||
@ -2112,12 +2170,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
typedef typename __decay_selector<__remove_type>::__type type;
|
||||
};
|
||||
|
||||
// __decay_t (std::decay_t for C++11).
|
||||
template<typename _Tp>
|
||||
using __decay_t = typename decay<_Tp>::type;
|
||||
|
||||
template<typename _Tp>
|
||||
class reference_wrapper;
|
||||
/// @cond undocumented
|
||||
|
||||
// Helper which adds a reference to a type when given a reference_wrapper
|
||||
template<typename _Tp>
|
||||
@ -2132,12 +2185,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
typedef _Tp& __type;
|
||||
};
|
||||
|
||||
// __decay_t (std::decay_t for C++11).
|
||||
template<typename _Tp>
|
||||
using __decay_t = typename decay<_Tp>::type;
|
||||
|
||||
template<typename _Tp>
|
||||
using __decay_and_strip = __strip_reference_wrapper<__decay_t<_Tp>>;
|
||||
|
||||
/// @endcond
|
||||
|
||||
// Primary template.
|
||||
/// Define a member typedef @c type only if a boolean constant is true.
|
||||
/// Define a member typedef `type` only if a boolean constant is true.
|
||||
template<bool, typename _Tp = void>
|
||||
struct enable_if
|
||||
{ };
|
||||
@ -2147,13 +2204,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct enable_if<true, _Tp>
|
||||
{ typedef _Tp type; };
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
// __enable_if_t (std::enable_if_t for C++11)
|
||||
template<bool _Cond, typename _Tp = void>
|
||||
using __enable_if_t = typename enable_if<_Cond, _Tp>::type;
|
||||
|
||||
// Helper for SFINAE constraints
|
||||
template<typename... _Cond>
|
||||
using _Require = __enable_if_t<__and_<_Cond...>::value>;
|
||||
|
||||
// __remove_cvref_t (std::remove_cvref_t for C++11).
|
||||
template<typename _Tp>
|
||||
using __remove_cvref_t
|
||||
= typename remove_cv<typename remove_reference<_Tp>::type>::type;
|
||||
/// @endcond
|
||||
|
||||
// Primary template.
|
||||
/// Define a member typedef @c type to one of two argument types.
|
||||
template<bool _Cond, typename _Iftrue, typename _Iffalse>
|
||||
@ -2165,17 +2231,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct conditional<false, _Iftrue, _Iffalse>
|
||||
{ typedef _Iffalse type; };
|
||||
|
||||
// __remove_cvref_t (std::remove_cvref_t for C++11).
|
||||
template<typename _Tp>
|
||||
using __remove_cvref_t
|
||||
= typename remove_cv<typename remove_reference<_Tp>::type>::type;
|
||||
|
||||
/// common_type
|
||||
template<typename... _Tp>
|
||||
struct common_type;
|
||||
|
||||
// Sfinae-friendly common_type implementation:
|
||||
|
||||
/// @cond undocumented
|
||||
struct __do_common_type_impl
|
||||
{
|
||||
template<typename _Tp, typename _Up>
|
||||
@ -2278,6 +2340,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _Tp>
|
||||
struct __underlying_type_impl<_Tp, false>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// The underlying type of an enum.
|
||||
template<typename _Tp>
|
||||
@ -2285,12 +2348,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: public __underlying_type_impl<_Tp>
|
||||
{ };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp>
|
||||
struct __declval_protector
|
||||
{
|
||||
static const bool __stop = false;
|
||||
};
|
||||
/// @endcond
|
||||
|
||||
/** Utility to simplify expressions used in unevaluated operands
|
||||
* @since C++11
|
||||
* @ingroup utilities
|
||||
*/
|
||||
template<typename _Tp>
|
||||
auto declval() noexcept -> decltype(__declval<_Tp>(0))
|
||||
{
|
||||
@ -2307,6 +2376,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
#define __cpp_lib_result_of_sfinae 201210
|
||||
|
||||
/// @cond undocumented
|
||||
struct __invoke_memfun_ref { };
|
||||
struct __invoke_memfun_deref { };
|
||||
struct __invoke_memobj_ref { };
|
||||
@ -2490,6 +2560,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
_Functor, _ArgTypes...
|
||||
>::type
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
template<typename _Functor, typename... _ArgTypes>
|
||||
struct result_of<_Functor(_ArgTypes...)>
|
||||
@ -2536,6 +2607,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename...> using void_t = void;
|
||||
#endif
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
/// Implementation of the detection idiom (negative case).
|
||||
template<typename _Default, typename _AlwaysVoid,
|
||||
template<typename...> class _Op, typename... _Args>
|
||||
@ -2565,8 +2638,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
using __detected_or_t
|
||||
= typename __detected_or<_Default, _Op, _Args...>::type;
|
||||
|
||||
/// @} group metaprogramming
|
||||
|
||||
/**
|
||||
* Use SFINAE to determine if the type _Tp has a publicly-accessible
|
||||
* member type _NTYPE.
|
||||
@ -2587,9 +2658,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template <typename _Tp>
|
||||
struct __is_nothrow_swappable;
|
||||
|
||||
template<typename... _Elements>
|
||||
class tuple;
|
||||
|
||||
template<typename>
|
||||
struct __is_tuple_like_impl : false_type
|
||||
{ };
|
||||
@ -2603,6 +2671,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_tuple_like
|
||||
: public __is_tuple_like_impl<__remove_cvref_t<_Tp>>::type
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
template<typename _Tp>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
@ -2621,6 +2690,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
|
||||
noexcept(__is_nothrow_swappable<_Tp>::value);
|
||||
|
||||
/// @cond undocumented
|
||||
namespace __swappable_details {
|
||||
using std::swap;
|
||||
|
||||
@ -2670,6 +2740,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
struct __is_nothrow_swappable
|
||||
: public __is_nothrow_swappable_impl<_Tp>::type
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
#if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
|
||||
#define __cpp_lib_is_swappable 201603
|
||||
@ -2705,6 +2776,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
is_nothrow_swappable<_Tp>::value;
|
||||
#endif // __cplusplus >= 201402L
|
||||
|
||||
/// @cond undocumented
|
||||
namespace __swappable_with_details {
|
||||
using std::swap;
|
||||
|
||||
@ -2764,6 +2836,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
{
|
||||
typedef decltype(__test<_Tp&>(0)) type;
|
||||
};
|
||||
/// @endcond
|
||||
|
||||
/// is_swappable_with
|
||||
template<typename _Tp, typename _Up>
|
||||
@ -2801,6 +2874,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
#endif// c++1z or gnu++11
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
// __is_invocable (std::is_invocable for C++11)
|
||||
|
||||
// The primary template is used for invalid INVOKE expressions.
|
||||
@ -2912,6 +2987,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
void operator=(__nonesuch const&) = delete;
|
||||
};
|
||||
#pragma GCC diagnostic pop
|
||||
/// @endcond
|
||||
|
||||
#if __cplusplus >= 201703L
|
||||
# define __cpp_lib_is_invocable 201703
|
||||
@ -2971,6 +3047,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
"each argument type must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Result, typename _Ret, typename = void>
|
||||
struct __is_nt_invocable_impl : false_type { };
|
||||
|
||||
@ -2980,6 +3057,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
: __or_<is_void<_Ret>,
|
||||
__is_nothrow_convertible<typename _Result::type, _Ret>>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
/// std::is_nothrow_invocable_r
|
||||
template<typename _Ret, typename _Fn, typename... _ArgTypes>
|
||||
@ -2995,29 +3073,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
static_assert(std::__is_complete_or_unbounded(__type_identity<_Ret>{}),
|
||||
"_Ret must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// std::is_invocable_v
|
||||
template<typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value;
|
||||
|
||||
/// std::is_nothrow_invocable_v
|
||||
template<typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_nothrow_invocable_v
|
||||
= is_nothrow_invocable<_Fn, _Args...>::value;
|
||||
|
||||
/// std::is_invocable_r_v
|
||||
template<typename _Ret, typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_invocable_r_v
|
||||
= is_invocable_r<_Ret, _Fn, _Args...>::value;
|
||||
|
||||
/// std::is_nothrow_invocable_r_v
|
||||
template<typename _Ret, typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_nothrow_invocable_r_v
|
||||
= is_nothrow_invocable_r<_Ret, _Fn, _Args...>::value;
|
||||
#endif // C++17
|
||||
|
||||
#if __cplusplus >= 201703L
|
||||
# define __cpp_lib_type_trait_variable_templates 201510L
|
||||
/**
|
||||
* @defgroup variable_templates Variable templates for type traits.
|
||||
* @ingroup metaprogramming
|
||||
*
|
||||
* The variable `is_foo_v<T>` is a boolean constant with the same value
|
||||
* as the type trait `is_foo<T>::value`.
|
||||
*
|
||||
* @since C++17
|
||||
*/
|
||||
|
||||
/** @ingroup variable_templates
|
||||
* @{
|
||||
*/
|
||||
template <typename _Tp>
|
||||
inline constexpr bool is_void_v = is_void<_Tp>::value;
|
||||
template <typename _Tp>
|
||||
@ -3184,6 +3256,18 @@ template <typename _Base, typename _Derived>
|
||||
inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
|
||||
template <typename _From, typename _To>
|
||||
inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value;
|
||||
template<typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value;
|
||||
template<typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_nothrow_invocable_v
|
||||
= is_nothrow_invocable<_Fn, _Args...>::value;
|
||||
template<typename _Ret, typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_invocable_r_v
|
||||
= is_invocable_r<_Ret, _Fn, _Args...>::value;
|
||||
template<typename _Ret, typename _Fn, typename... _Args>
|
||||
inline constexpr bool is_nothrow_invocable_r_v
|
||||
= is_nothrow_invocable_r<_Ret, _Fn, _Args...>::value;
|
||||
/// @}
|
||||
|
||||
#ifdef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP
|
||||
# define __cpp_lib_has_unique_object_representations 201606
|
||||
@ -3198,6 +3282,7 @@ template <typename _From, typename _To>
|
||||
"template argument must be a complete class or an unbounded array");
|
||||
};
|
||||
|
||||
/// @ingroup variable_templates
|
||||
template<typename _Tp>
|
||||
inline constexpr bool has_unique_object_representations_v
|
||||
= has_unique_object_representations<_Tp>::value;
|
||||
@ -3211,7 +3296,7 @@ template <typename _From, typename _To>
|
||||
: bool_constant<__is_aggregate(remove_cv_t<_Tp>)>
|
||||
{ };
|
||||
|
||||
/// is_aggregate_v
|
||||
/// @ingroup variable_templates
|
||||
template<typename _Tp>
|
||||
inline constexpr bool is_aggregate_v = is_aggregate<_Tp>::value;
|
||||
#endif
|
||||
@ -3280,10 +3365,12 @@ template <typename _From, typename _To>
|
||||
: public __is_array_unknown_bounds<_Tp>
|
||||
{ };
|
||||
|
||||
/// @ingroup variable_templates
|
||||
template<typename _Tp>
|
||||
inline constexpr bool is_bounded_array_v
|
||||
= is_bounded_array<_Tp>::value;
|
||||
|
||||
/// @ingroup variable_templates
|
||||
template<typename _Tp>
|
||||
inline constexpr bool is_unbounded_array_v
|
||||
= is_unbounded_array<_Tp>::value;
|
||||
@ -3291,6 +3378,9 @@ template <typename _From, typename _To>
|
||||
#if __cplusplus > 202002L
|
||||
#define __cpp_lib_is_scoped_enum 202011L
|
||||
|
||||
/// @since C++23
|
||||
//@{
|
||||
|
||||
template<typename _Tp>
|
||||
struct is_scoped_enum
|
||||
: false_type
|
||||
@ -3312,6 +3402,9 @@ template <typename _From, typename _To>
|
||||
: bool_constant<!requires(_Tp __t, void(*__f)(int)) { __f(__t); }>
|
||||
{ };
|
||||
|
||||
/**
|
||||
* @ingroup variable_templates
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline constexpr bool is_scoped_enum_v = is_scoped_enum<_Tp>::value;
|
||||
#endif // C++23
|
||||
@ -3320,11 +3413,14 @@ template <typename _From, typename _To>
|
||||
|
||||
#define __cpp_lib_is_constant_evaluated 201811L
|
||||
|
||||
/// Returns true only when called during constant evaluation.
|
||||
constexpr inline bool
|
||||
is_constant_evaluated() noexcept
|
||||
{ return __builtin_is_constant_evaluated(); }
|
||||
/// @}
|
||||
#endif
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _From, typename _To>
|
||||
using __copy_cv = typename __match_cv_qualifiers<_From, _To>::__type;
|
||||
|
||||
@ -3378,12 +3474,14 @@ template <typename _From, typename _To>
|
||||
struct __common_ref_impl<_Xp&, _Yp&&>
|
||||
: __common_ref_impl<_Yp&&, _Xp&>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
template<typename _Tp, typename _Up,
|
||||
template<typename> class _TQual, template<typename> class _UQual>
|
||||
struct basic_common_reference
|
||||
{ };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp>
|
||||
struct __xref
|
||||
{ template<typename _Up> using __type = __copy_cv<_Tp, _Up>; };
|
||||
@ -3402,6 +3500,7 @@ template <typename _From, typename _To>
|
||||
remove_cvref_t<_Tp2>,
|
||||
__xref<_Tp1>::template __type,
|
||||
__xref<_Tp2>::template __type>::type;
|
||||
/// @endcond
|
||||
|
||||
template<typename... _Tp>
|
||||
struct common_reference;
|
||||
@ -3419,6 +3518,7 @@ template <typename _From, typename _To>
|
||||
struct common_reference<_Tp0>
|
||||
{ using type = _Tp0; };
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Tp1, typename _Tp2, int _Bullet = 1, typename = void>
|
||||
struct __common_reference_impl
|
||||
: __common_reference_impl<_Tp1, _Tp2, _Bullet + 1>
|
||||
@ -3488,9 +3588,12 @@ template <typename _From, typename _To>
|
||||
void_t<common_reference_t<_Tp1, _Tp2>>>
|
||||
: public common_reference<common_reference_t<_Tp1, _Tp2>, _Rest...>
|
||||
{ };
|
||||
/// @endcond
|
||||
|
||||
#endif // C++2a
|
||||
|
||||
/// @} group metaprogramming
|
||||
|
||||
_GLIBCXX_END_NAMESPACE_VERSION
|
||||
} // namespace std
|
||||
|
||||
|
@ -1723,6 +1723,7 @@ namespace __variant
|
||||
return __detail::__variant::__get<_Np>(std::move(__v));
|
||||
}
|
||||
|
||||
/// @cond undocumented
|
||||
template<typename _Result_type, typename _Visitor, typename... _Variants>
|
||||
constexpr decltype(auto)
|
||||
__do_visit(_Visitor&& __visitor, _Variants&&... __variants)
|
||||
@ -1734,6 +1735,7 @@ namespace __variant
|
||||
return (*__func_ptr)(std::forward<_Visitor>(__visitor),
|
||||
std::forward<_Variants>(__variants)...);
|
||||
}
|
||||
/// @endcond
|
||||
|
||||
template<typename _Visitor, typename... _Variants>
|
||||
constexpr __detail::__variant::__visit_result_t<_Visitor, _Variants...>
|
||||
@ -1784,6 +1786,7 @@ namespace __variant
|
||||
}
|
||||
#endif
|
||||
|
||||
/// @cond undocumented
|
||||
template<bool, typename... _Types>
|
||||
struct __variant_hash_call_base_impl
|
||||
{
|
||||
@ -1814,6 +1817,7 @@ namespace __variant
|
||||
using __variant_hash_call_base =
|
||||
__variant_hash_call_base_impl<(__poison_hash<remove_const_t<_Types>>::
|
||||
__enable_hash_call &&...), _Types...>;
|
||||
/// @endcond
|
||||
|
||||
template<typename... _Types>
|
||||
struct hash<variant<_Types...>>
|
||||
|
@ -10,6 +10,6 @@ std::__detail::_Adaptor<std::mt19937, unsigned long> aurng(urng);
|
||||
auto x = std::generate_canonical<std::size_t,
|
||||
std::numeric_limits<std::size_t>::digits>(urng);
|
||||
|
||||
// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 167 }
|
||||
// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 166 }
|
||||
|
||||
// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3350 }
|
||||
|
Loading…
Reference in New Issue
Block a user