[libcxx-commits] [libcxx] [libc++] Move __has_iterator_typedefs to up-to-C++17 implementation of iterator_traits (PR #144265)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Jun 15 08:14:39 PDT 2025
https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/144265
`__has_iterator_typedefs` is only used in the up-to-C++17 implementation of `type_traits`. To make that clearer the struct is moved into that code block.
>From aea4bec95feb65400a2408bd00e8cf536e1276ab Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Sun, 15 Jun 2025 17:13:09 +0200
Subject: [PATCH] [libc++] Move __has_iterator_typedefs to up-to-C++17
implementation of iterator_traits
---
libcxx/include/__iterator/iterator_traits.h | 34 ++++++++++-----------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/libcxx/include/__iterator/iterator_traits.h b/libcxx/include/__iterator/iterator_traits.h
index 221d36614db08..f727e8ff36df2 100644
--- a/libcxx/include/__iterator/iterator_traits.h
+++ b/libcxx/include/__iterator/iterator_traits.h
@@ -71,23 +71,6 @@ struct random_access_iterator_tag : public bidirectional_iterator_tag {};
struct contiguous_iterator_tag : public random_access_iterator_tag {};
#endif
-template <class _Tp>
-struct __has_iterator_typedefs {
-private:
- template <class _Up>
- static false_type __test(...);
- template <class _Up>
- static true_type
- __test(__void_t<typename _Up::iterator_category>* = nullptr,
- __void_t<typename _Up::difference_type>* = nullptr,
- __void_t<typename _Up::value_type>* = nullptr,
- __void_t<typename _Up::reference>* = nullptr,
- __void_t<typename _Up::pointer>* = nullptr);
-
-public:
- static const bool value = decltype(__test<_Tp>(nullptr, nullptr, nullptr, nullptr, nullptr))::value;
-};
-
#if _LIBCPP_STD_VER >= 20
// The `cpp17-*-iterator` exposition-only concepts have very similar names to the `Cpp17*Iterator` named requirements
@@ -322,6 +305,23 @@ struct __iterator_traits<_Iter, true>
is_convertible<typename _Iter::iterator_category, input_iterator_tag>::value ||
is_convertible<typename _Iter::iterator_category, output_iterator_tag>::value > {};
+template <class _Tp>
+struct __has_iterator_typedefs {
+private:
+ template <class _Up>
+ static false_type __test(...);
+ template <class _Up>
+ static true_type
+ __test(__void_t<typename _Up::iterator_category>* = nullptr,
+ __void_t<typename _Up::difference_type>* = nullptr,
+ __void_t<typename _Up::value_type>* = nullptr,
+ __void_t<typename _Up::reference>* = nullptr,
+ __void_t<typename _Up::pointer>* = nullptr);
+
+public:
+ static const bool value = decltype(__test<_Tp>(nullptr, nullptr, nullptr, nullptr, nullptr))::value;
+};
+
// iterator_traits<Iterator> will only have the nested types if Iterator::iterator_category
// exists. Else iterator_traits<Iterator> will be an empty class. This is a
// conforming extension which allows some programs to compile and behave as
More information about the libcxx-commits
mailing list