[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