From 9af8f5565a388aa7b80855856cf2e6b1a19acb1e Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Sun, 26 Jan 2025 09:54:21 +0100 Subject: [PATCH] [libc++] Use __detected_or_t to implement __has_iterator_{category,concept}_convertible_to --- libcxx/include/__iterator/iterator_traits.h | 43 ++++++--------------- libcxx/include/module.modulemap | 6 ++- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/libcxx/include/__iterator/iterator_traits.h b/libcxx/include/__iterator/iterator_traits.h index db68dd2c377ac..a749d7ee52b79 100644 --- a/libcxx/include/__iterator/iterator_traits.h +++ b/libcxx/include/__iterator/iterator_traits.h @@ -24,6 +24,7 @@ #include <__iterator/readable_traits.h> #include <__type_traits/common_reference.h> #include <__type_traits/conditional.h> +#include <__type_traits/detected_or.h> #include <__type_traits/disjunction.h> #include <__type_traits/enable_if.h> #include <__type_traits/integral_constant.h> @@ -32,6 +33,7 @@ #include <__type_traits/is_primary_template.h> #include <__type_traits/is_reference.h> #include <__type_traits/is_valid_expansion.h> +#include <__type_traits/nat.h> #include <__type_traits/remove_const.h> #include <__type_traits/remove_cv.h> #include <__type_traits/remove_cvref.h> @@ -126,30 +128,6 @@ struct __has_iterator_typedefs { static const bool value = decltype(__test<_Tp>(nullptr, nullptr, nullptr, nullptr, nullptr))::value; }; -template -struct __has_iterator_category { -private: - template - static false_type __test(...); - template - static true_type __test(typename _Up::iterator_category* = nullptr); - -public: - static const bool value = decltype(__test<_Tp>(nullptr))::value; -}; - -template -struct __has_iterator_concept { -private: - template - static false_type __test(...); - template - static true_type __test(typename _Up::iterator_concept* = nullptr); - -public: - static const bool value = decltype(__test<_Tp>(nullptr))::value; -}; - #if _LIBCPP_STD_VER >= 20 // The `cpp17-*-iterator` exposition-only concepts have very similar names to the `Cpp17*Iterator` named requirements @@ -417,18 +395,19 @@ struct _LIBCPP_TEMPLATE_VIS iterator_traits<_Tp*> { #endif }; -template >::value> -struct __has_iterator_category_convertible_to : is_convertible::iterator_category, _Up> { -}; +template +using __iterator_category _LIBCPP_NODEBUG = typename _Tp::iterator_category; -template -struct __has_iterator_category_convertible_to<_Tp, _Up, false> : false_type {}; +template +using __iterator_concept _LIBCPP_NODEBUG = typename _Tp::iterator_concept; -template ::value> -struct __has_iterator_concept_convertible_to : is_convertible {}; +template +using __has_iterator_category_convertible_to _LIBCPP_NODEBUG = + is_convertible<__detected_or_t<__nat, __iterator_category, iterator_traits<_Tp> >, _Up>; template -struct __has_iterator_concept_convertible_to<_Tp, _Up, false> : false_type {}; +using __has_iterator_concept_convertible_to _LIBCPP_NODEBUG = + is_convertible<__detected_or_t<__nat, __iterator_concept, _Tp>, _Up>; template using __has_input_iterator_category _LIBCPP_NODEBUG = __has_iterator_category_convertible_to<_Tp, input_iterator_tag>; diff --git a/libcxx/include/module.modulemap b/libcxx/include/module.modulemap index b9964dac84acd..b2a0875554f6e 100644 --- a/libcxx/include/module.modulemap +++ b/libcxx/include/module.modulemap @@ -418,7 +418,10 @@ module std [system] { module copy_backward { header "__algorithm/copy_backward.h" } module copy_if { header "__algorithm/copy_if.h" } module copy_move_common { header "__algorithm/copy_move_common.h" } - module copy_n { header "__algorithm/copy_n.h" } + module copy_n { + header "__algorithm/copy_n.h" + export std.iterator_traits + } module copy { header "__algorithm/copy.h" } module count_if { header "__algorithm/count_if.h" } module count { header "__algorithm/count.h" } @@ -1471,6 +1474,7 @@ module std [system] { module iterator_traits { header "__iterator/iterator_traits.h" export std_core.type_traits.integral_constant + export std_core.type_traits.is_convertible } module iterator_with_data { header "__iterator/iterator_with_data.h" } module iterator { header "__iterator/iterator.h" }