[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