[libcxx-commits] [PATCH] D122072: [libc++][test] Adds an cpp20_output_iterator.
Mark de Wever via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Mar 19 09:40:37 PDT 2022
Mordante created this revision.
Mordante added a reviewer: ldionne.
Herald added a project: All.
Mordante requested review of this revision.
Herald added a project: libc++.
Herald added a subscriber: libcxx-commits.
Herald added a reviewer: libc++.
This iterator is used to test code that only needs to satisfy the
output_iterator concept. Follow-up changes will use this iterator in
older language Standards.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D122072
Files:
libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
libcxx/test/support/test_iterators.h
Index: libcxx/test/support/test_iterators.h
===================================================================
--- libcxx/test/support/test_iterators.h
+++ libcxx/test/support/test_iterators.h
@@ -514,6 +514,43 @@
struct iter_value_or_void<I> {
using type = std::iter_value_t<I>;
};
+#endif // TEST_STD_VER > 17
+
+// This iterator will be used in <algorithm> tests using older language standards.
+template <class It>
+class cpp20_output_iterator
+{
+ It it_;
+public:
+#if TEST_STD_VER > 17
+ using difference_type = std::iter_difference_t<It>;
+#else
+ using difference_type = typename std::iterator_traits<It>::difference_type;
+#endif
+
+ TEST_CONSTEXPR explicit cpp20_output_iterator(It it) : it_(it) {}
+ cpp20_output_iterator(cpp20_output_iterator&&) = default;
+ cpp20_output_iterator& operator=(cpp20_output_iterator&&) = default;
+#if TEST_STD_VER > 17
+ constexpr decltype(auto) operator*() const { return *it_; }
+#else
+ typename std::iterator_traits<It>::reference operator*() const { return *it_; }
+#endif
+ TEST_CONSTEXPR_CXX14 cpp20_output_iterator& operator++() { ++it_; return *this; }
+ TEST_CONSTEXPR_CXX14 cpp20_output_iterator operator++(int) {
+ auto temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ friend TEST_CONSTEXPR It base(const cpp20_output_iterator& i) { return i.it_; }
+
+ template <class T>
+ void operator,(T const &) = delete;
+};
+
+#if TEST_STD_VER > 17
+static_assert(std::output_iterator<cpp20_output_iterator<int*>, int>);
// Iterator adaptor that counts the number of times the iterator has had a successor/predecessor
// operation called. Has two recorders:
Index: libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
===================================================================
--- libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
+++ libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
@@ -28,6 +28,15 @@
static_assert( std::output_iterator<cpp17_output_iterator<T*>, DerivedFromT>);
static_assert(!std::output_iterator<cpp17_output_iterator<DerivedFromT*>, T>);
+static_assert( std::output_iterator<cpp20_output_iterator<int*>, int>);
+static_assert( std::output_iterator<cpp20_output_iterator<int*>, short>);
+static_assert( std::output_iterator<cpp20_output_iterator<int*>, long>);
+static_assert( std::output_iterator<cpp20_output_iterator<T*>, T>);
+static_assert(!std::output_iterator<cpp20_output_iterator<T const*>, T>);
+static_assert( std::output_iterator<cpp20_output_iterator<T*>, T const>);
+static_assert( std::output_iterator<cpp20_output_iterator<T*>, DerivedFromT>);
+static_assert(!std::output_iterator<cpp20_output_iterator<DerivedFromT*>, T>);
+
// Not satisfied when the iterator is not an input_or_output_iterator
static_assert(!std::output_iterator<void, int>);
static_assert(!std::output_iterator<void (*)(), int>);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D122072.416706.patch
Type: text/x-patch
Size: 3092 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20220319/5470cfcf/attachment.bin>
More information about the libcxx-commits
mailing list