# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED = __cplusplus=201703L \
+PREDEFINED = __cplusplus=202002L \
__GTHREADS \
_GLIBCXX_HAS_GTHREADS \
_GLIBCXX_HAVE_TLS \
__cpp_exceptions \
__cpp_rtti \
__cpp_inline_variables \
+ __cpp_constexpr_dynamic_alloc \
+ __cpp_aligned_new \
+ __cpp_sized_deallocation \
+ __cpp_concepts=209900 \
+ __cpp_deduction_guides=209900 \
+ __cpp_impl_three_way_comparison=209900 \
+ __cpp_impl_coroutine \
ATOMIC_INT_LOCK_FREE=2 \
PB_DS_DATA_TRUE_INDICATOR \
PB_DS_STATIC_ASSERT=// \
"_GLIBCXX20_DEPRECATED(E)= " \
"_GLIBCXX20_DEPRECATED(E)= " \
_GLIBCXX17_INLINE=inline \
- _GLIBCXX_CHRONO_INT64_T=int64_t \
- _GLIBCXX_DEFAULT_ABI_TAG
+ _GLIBCXX_CHRONO_INT64_T=int64_t \
+ _GLIBCXX_DEFAULT_ABI_TAG \
+ _GLIBCXX_USE_DEPRECATED \
+ _GLIBCXX_HOSTED \
+ "__has_builtin(x)=1" \
+ _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP \
+ _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE \
+ _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED \
+ _GLIBCXX_HAVE_BUILTIN_LAUNDER \
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
* Reorder the elements in the range @p [__first,__last) using a random
* distribution, so that every possible ordering of the sequence is
* equally likely.
+ *
+ * @deprecated
+ * Since C++14 `std::random_shuffle` is not part of the C++ standard.
+ * Use `std::shuffle` instead, which was introduced in C++11.
*/
template<typename _RandomAccessIterator>
_GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
* provide a random distribution. Calling @p __rand(N) for a positive
* integer @p N should return a randomly chosen integer from the
* range [0,N).
+ *
+ * @deprecated
+ * Since C++14 `std::random_shuffle` is not part of the C++ standard.
+ * Use `std::shuffle` instead, which was introduced in C++11.
*/
template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
_GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
{ };
/// __is_nullptr_t (deprecated extension).
- /// @deprecated Use `is_null_pointer` instead.
+ /// @deprecated Non-standard. Use `is_null_pointer` instead.
template<typename _Tp>
struct __is_nullptr_t
: public is_null_pointer<_Tp>
"template argument must be a complete class or an unbounded array");
};
- /** is_pod (deprecated in C++20)
- * @deprecated Use `is_standard_layout && is_trivial` instead.
+ /** is_pod
+ * @deprecated Deprecated in C++20.
+ * Use `is_standard_layout && is_trivial` instead.
*/
// Could use is_standard_layout && is_trivial instead of the builtin.
template<typename _Tp>
};
/** is_literal_type
- * @deprecated Deprecated in C++20. The idea of a literal type isn't useful.
+ * @deprecated Deprecated in C++17, removed in C++20.
+ * The idea of a literal type isn't useful.
*/
template<typename _Tp>
struct
* Each variable `is_xxx_v<T>` is a boolean constant with the same value
* as the `value` member of the corresponding type trait `is_xxx<T>`.
*
- * @since C++17
+ * @since C++17 unless noted otherwise.
*/
/**
#ifdef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP
# define __cpp_lib_has_unique_object_representations 201606
/// has_unique_object_representations
+ /// @since C++17
template<typename _Tp>
struct has_unique_object_representations
: bool_constant<__has_unique_object_representations(
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE
# define __cpp_lib_is_aggregate 201703
/// is_aggregate
+ /// @since C++17
template<typename _Tp>
struct is_aggregate
: bool_constant<__is_aggregate(remove_cv_t<_Tp>)>
#endif
#endif // C++17
-#if __cplusplus > 201703L
+#if __cplusplus >= 202002L
+
+ /** * Remove references and cv-qualifiers.
+ * @since C++20
+ * @{
+ */
#define __cpp_lib_remove_cvref 201711L
- /// Remove references and cv-qualifiers.
template<typename _Tp>
struct remove_cvref
: remove_cv<_Tp>
template<typename _Tp>
using remove_cvref_t = typename remove_cvref<_Tp>::type;
+ /// @}
+ /** * Identity metafunction.
+ * @since C++20
+ * @{
+ */
#define __cpp_lib_type_identity 201806L
- /// Identity metafunction.
template<typename _Tp>
struct type_identity { using type = _Tp; };
template<typename _Tp>
using type_identity_t = typename type_identity<_Tp>::type;
+ /// @}
#define __cpp_lib_unwrap_ref 201811L
- /// Unwrap a reference_wrapper
+ /** Unwrap a reference_wrapper
+ * @since C++20
+ * @{
+ */
template<typename _Tp>
struct unwrap_reference { using type = _Tp; };
template<typename _Tp>
using unwrap_reference_t = typename unwrap_reference<_Tp>::type;
+ /// @}
- /// Decay type and if it's a reference_wrapper, unwrap it
+ /** Decay type and if it's a reference_wrapper, unwrap it
+ * @since C++20
+ * @{
+ */
template<typename _Tp>
struct unwrap_ref_decay { using type = unwrap_reference_t<decay_t<_Tp>>; };
template<typename _Tp>
using unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type;
+ /// @}
#define __cpp_lib_bounded_array_traits 201902L
/// True for a type that is an array of known bound.
+ /// @since C++20
template<typename _Tp>
struct is_bounded_array
: public __is_array_known_bounds<_Tp>
{ };
/// True for a type that is an array of unknown bound.
+ /// @since C++20
template<typename _Tp>
struct is_unbounded_array
: public __is_array_unknown_bounds<_Tp>
{ };
/// @ingroup variable_templates
+ /// @since C++20
template<typename _Tp>
inline constexpr bool is_bounded_array_v
= is_bounded_array<_Tp>::value;
/// @ingroup variable_templates
+ /// @since C++20
template<typename _Tp>
inline constexpr bool is_unbounded_array_v
= is_unbounded_array<_Tp>::value;
#if __cplusplus > 202002L
#define __cpp_lib_is_scoped_enum 202011L
+ /// True if the type is a scoped enumeration type.
/// @since C++23
- //@{
template<typename _Tp>
struct is_scoped_enum
: bool_constant<!requires(_Tp __t, void(*__f)(int)) { __f(__t); }>
{ };
- /**
- * @ingroup variable_templates
- */
+ /// @ingroup variable_templates
+ /// @since C++23
template<typename _Tp>
inline constexpr bool is_scoped_enum_v = is_scoped_enum<_Tp>::value;
+
#endif // C++23
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
#define __cpp_lib_is_constant_evaluated 201811L
/// Returns true only when called during constant evaluation.
+ /// @since C++20
constexpr inline bool
is_constant_evaluated() noexcept
{ return __builtin_is_constant_evaluated(); }
- /// @}
#endif
/// @cond undocumented