[libcxx-commits] [libcxx] 83de107 - [libc++][test] Adds an cpp20_output_iterator.

Mark de Wever via libcxx-commits libcxx-commits at lists.llvm.org
Tue Apr 5 08:31:48 PDT 2022


Author: Mark de Wever
Date: 2022-04-05T17:31:42+02:00
New Revision: 83de1073824463ab80061a0687199079a3cd2931

URL: https://github.com/llvm/llvm-project/commit/83de1073824463ab80061a0687199079a3cd2931
DIFF: https://github.com/llvm/llvm-project/commit/83de1073824463ab80061a0687199079a3cd2931.diff

LOG: [libc++][test] Adds an cpp20_output_iterator.

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.

Reviewed By: ldionne, #libc, philnik, var-const

Differential Revision: https://reviews.llvm.org/D122072

Added: 
    

Modified: 
    libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
    libcxx/test/support/test_iterators.h

Removed: 
    


################################################################################
diff  --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
index ea6988074be78..19e989d9d8ffe 100644
--- a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp
+++ b/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*>, T const>);
 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>);

diff  --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h
index 6b546e6b2f6c6..6b15efe20cc1f 100644
--- a/libcxx/test/support/test_iterators.h
+++ b/libcxx/test/support/test_iterators.h
@@ -515,6 +515,32 @@ struct iter_value_or_void<I> {
     using type = std::iter_value_t<I>;
 };
 
+template <class It>
+class cpp20_output_iterator {
+  It it_;
+
+public:
+  using 
diff erence_type = std::iter_
diff erence_t<It>;
+
+  constexpr explicit cpp20_output_iterator(It it) : it_(it) {}
+  cpp20_output_iterator(cpp20_output_iterator&&) = default;
+  cpp20_output_iterator& operator=(cpp20_output_iterator&&) = default;
+
+  constexpr decltype(auto) operator*() const { return *it_; }
+  constexpr cpp20_output_iterator& operator++() {
+    ++it_;
+    return *this;
+  }
+  constexpr cpp20_output_iterator operator++(int) { return cpp20_output_iterator(it_++); }
+
+  friend constexpr It base(const cpp20_output_iterator& i) { return i.it_; }
+
+  template <class T>
+  void operator,(T const&) = delete;
+};
+
+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:
 // * `stride_count`, which records the total number of calls to an op++, op--, op+=, or op-=.


        


More information about the libcxx-commits mailing list