[libcxx][iterator][ranges] adds `forward_iterator` and `forward_range`
authorChristopher Di Bella <cjdb@google.com>
Sun, 11 Apr 2021 22:11:03 +0000 (22:11 +0000)
committerChristopher Di Bella <cjdb@google.com>
Mon, 3 May 2021 20:46:18 +0000 (20:46 +0000)
Implements parts of:
    * P0896R4 The One Ranges Proposal`

Depends on D100271.

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

50 files changed:
libcxx/include/__iterator/concepts.h
libcxx/include/__ranges/concepts.h
libcxx/include/iterator
libcxx/include/ranges
libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp
libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp
libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/forward_iterator.compile.pass.cpp [new file with mode: 0644]
libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/subsumption.compile.pass.cpp [moved from libcxx/test/libcxx/iterators/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp with 78% similarity]
libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp
libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/ranges/range.refinements/forward_range.compile.pass.cpp [new file with mode: 0644]
libcxx/test/std/ranges/range.refinements/subsumption.compile.pass.cpp
libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/re/re.results/range_concept_conformance.compile.pass.cpp
libcxx/test/std/strings/basic.string/range_concept_conformance.compile.pass.cpp
libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp
libcxx/test/std/strings/string.view/range_concept_conformance.compile.pass.cpp
libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp

index 9ea1d16..3e6022b 100644 (file)
@@ -119,6 +119,14 @@ concept input_iterator =
   requires { typename _ITER_CONCEPT<_Ip>; } &&
   derived_from<_ITER_CONCEPT<_Ip>, input_iterator_tag>;
 
+// [iterator.concept.forward]
+template<class _Ip>
+concept forward_iterator =
+  input_iterator<_Ip> &&
+  derived_from<_ITER_CONCEPT<_Ip>, forward_iterator_tag> &&
+  incrementable<_Ip> &&
+  sentinel_for<_Ip, _Ip>;
+
 // clang-format on
 
 #endif // !defined(_LIBCPP_HAS_NO_RANGES)
index 8f2f467..36e6739 100644 (file)
@@ -55,7 +55,11 @@ namespace ranges {
   concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp> >;
 
   template <class _Tp>
+  concept forward_range = input_range<_Tp> && forward_iterator<iterator_t<_Tp> >;
+
+  template <class _Tp>
   concept common_range = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp> >;
+
 } // namespace ranges
 
 #endif // !defined(_LIBCPP_HAS_NO_RANGES)
index d759eae..78f67dd 100644 (file)
@@ -79,6 +79,10 @@ template<class S, class I>
 template<class I>
   concept input_iterator = see below;                      // since C++20
 
+// [iterator.concept.forward], concept forward_iterator
+template<class I>
+  concept forward_iterator = see below;                    // since C++20
+
 template<class Category, class T, class Distance = ptrdiff_t,
          class Pointer = T*, class Reference = T&>
 struct iterator
index ca9f648..58b67f1 100644 (file)
@@ -51,6 +51,9 @@ namespace std::ranges {
   template<class T>
     concept input_range = see below;
 
+  template<class T>
+    concept forward_range = see below;
+
   template <class _Tp>
     concept common_range = see below;
 }
index 576118f..a833200 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::map<int, int>::reverse_iterator;
 using const_reverse_iterator = std::map<int, int>::const_reverse_iterator;
 using value_type = std::pair<const int, int>;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<const_iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
index 7a9e34c..998227d 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index ab74dfc..1693fa0 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::multimap<int, int>::reverse_iterator;
 using const_reverse_iterator = std::multimap<int, int>::const_reverse_iterator;
 using value_type = std::pair<const int, int>;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<const_iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
index 45c422f..dde9ba1 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 0487700..1c88b55 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::multiset<int>::reverse_iterator;
 using const_reverse_iterator = std::multiset<int>::const_reverse_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,11 +32,10 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
+static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sentinel_for<const_iterator, const_reverse_iterator>);
index eb97b28..b5c8e24 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 55539b4..f5f92a9 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::set<int>::reverse_iterator;
 using const_reverse_iterator = std::set<int>::const_reverse_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
index 6eec057..846c0e3 100644 (file)
@@ -21,10 +21,8 @@ using const_iterator = std::array<int, 10>::const_iterator;
 using reverse_iterator = std::array<int, 10>::reverse_iterator;
 using const_reverse_iterator = std::array<int, 10>::const_reverse_iterator;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,10 +32,8 @@ static_assert(std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, int>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -46,4 +42,3 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index 05ed9e1..cdb245b 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index a401e2d..d5d455e 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::deque<int>::reverse_iterator;
 using const_reverse_iterator = std::deque<int>::const_reverse_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -35,10 +33,8 @@ static_assert(std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -47,4 +43,3 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index 881e823..afb7677 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 9b7d36f..fae2648 100644 (file)
@@ -20,22 +20,16 @@ using iterator = std::forward_list<int>::iterator;
 using const_iterator = std::forward_list<int>::const_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<const_iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index 5203a23..19fe353 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 8566ec9..e2b60ce 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::list<int>::reverse_iterator;
 using const_reverse_iterator = std::list<int>::const_reverse_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -48,4 +43,3 @@ static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index abb58f5..c831850 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 7aa8cb4..3320317 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::vector<bool>::reverse_iterator;
 using const_reverse_iterator = std::vector<bool>::const_reverse_iterator;
 using value_type = bool;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -35,10 +33,8 @@ static_assert(std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -47,4 +43,3 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index d00394d..3fe82de 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index c72eee7..8f67670 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::vector<int>::reverse_iterator;
 using const_reverse_iterator = std::vector<int>::const_reverse_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -35,10 +33,8 @@ static_assert(std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -47,4 +43,3 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index 425d516..ab80054 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 58311bd..1bc67b2 100644 (file)
@@ -22,10 +22,8 @@ using local_iterator = std::unordered_map<int, int>::local_iterator;
 using const_local_iterator = std::unordered_map<int, int>::const_local_iterator;
 using value_type = std::pair<const int, int>;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, local_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_local_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, local_iterator>);
@@ -48,12 +43,9 @@ static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_iterator>);
 
-static_assert(std::indirectly_readable<local_iterator>);
+static_assert(std::forward_iterator<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
-static_assert(std::incrementable<local_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(!std::sentinel_for<local_iterator, iterator>);
 static_assert(!std::sentinel_for<local_iterator, const_iterator>);
 static_assert(std::sentinel_for<local_iterator, local_iterator>);
@@ -62,12 +54,9 @@ static_assert(!std::sized_sentinel_for<local_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<local_iterator>);
 
-static_assert(std::indirectly_readable<const_local_iterator>);
+static_assert(std::forward_iterator<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
-static_assert(std::incrementable<const_local_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, const_iterator>);
 static_assert(std::sentinel_for<const_local_iterator, local_iterator>);
@@ -76,4 +65,3 @@ static_assert(!std::sized_sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_local_iterator>);
index d3b98a7..a62ca69 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 8033a91..a53edc9 100644 (file)
@@ -22,10 +22,8 @@ using local_iterator = std::unordered_multimap<int, int>::local_iterator;
 using const_local_iterator = std::unordered_multimap<int, int>::const_local_iterator;
 using value_type = std::pair<const int, int>;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, local_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_local_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, local_iterator>);
@@ -48,12 +43,9 @@ static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_iterator>);
 
-static_assert(std::indirectly_readable<local_iterator>);
+static_assert(std::forward_iterator<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
-static_assert(std::incrementable<local_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(!std::sentinel_for<local_iterator, iterator>);
 static_assert(!std::sentinel_for<local_iterator, const_iterator>);
 static_assert(std::sentinel_for<local_iterator, local_iterator>);
@@ -62,12 +54,9 @@ static_assert(!std::sized_sentinel_for<local_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<local_iterator>);
 
-static_assert(std::indirectly_readable<const_local_iterator>);
+static_assert(std::forward_iterator<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
-static_assert(std::incrementable<const_local_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, const_iterator>);
 static_assert(std::sentinel_for<const_local_iterator, local_iterator>);
@@ -76,4 +65,3 @@ static_assert(!std::sized_sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_local_iterator>);
index 4f0e403..2418b0f 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 5a0cfb5..c1b05fe 100644 (file)
@@ -22,10 +22,8 @@ using local_iterator = std::unordered_multiset<int>::local_iterator;
 using const_local_iterator = std::unordered_multiset<int>::const_local_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, local_iterator>);
@@ -34,12 +32,9 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_local_iterator>);
-static_assert(std::input_iterator<iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, local_iterator>);
@@ -48,12 +43,9 @@ static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_iterator>);
 
-static_assert(std::indirectly_readable<local_iterator>);
+static_assert(std::forward_iterator<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
-static_assert(std::incrementable<local_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(!std::sentinel_for<local_iterator, iterator>);
 static_assert(!std::sentinel_for<local_iterator, const_iterator>);
 static_assert(std::sentinel_for<local_iterator, local_iterator>);
@@ -62,12 +54,9 @@ static_assert(!std::sized_sentinel_for<local_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<local_iterator>);
 
-static_assert(std::indirectly_readable<const_local_iterator>);
+static_assert(std::forward_iterator<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
-static_assert(std::incrementable<const_local_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, const_iterator>);
 static_assert(std::sentinel_for<const_local_iterator, local_iterator>);
@@ -76,4 +65,3 @@ static_assert(!std::sized_sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, local_iterator>);
 static_assert(!std::sized_sentinel_for<const_local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_local_iterator>);
index 9d42fb7..8d34570 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 447b3eb..01e36e1 100644 (file)
@@ -22,39 +22,45 @@ using local_iterator = std::unordered_set<int>::local_iterator;
 using const_local_iterator = std::unordered_set<int>::const_local_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, local_iterator>);
 static_assert(!std::sentinel_for<iterator, const_local_iterator>);
-static_assert(std::input_iterator<iterator>);
+static_assert(!std::sized_sentinel_for<iterator, iterator>);
+static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
+static_assert(!std::sized_sentinel_for<iterator, local_iterator>);
+static_assert(!std::sized_sentinel_for<iterator, const_local_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
+static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, local_iterator>);
 static_assert(!std::sentinel_for<const_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_iterator>);
+static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
+static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
+static_assert(!std::sized_sentinel_for<const_iterator, local_iterator>);
+static_assert(!std::sized_sentinel_for<const_iterator, const_local_iterator>);
 
-static_assert(std::indirectly_readable<local_iterator>);
-static_assert(std::incrementable<local_iterator>);
-static_assert(std::input_or_output_iterator<local_iterator>);
+static_assert(std::forward_iterator<local_iterator>);
 static_assert(!std::sentinel_for<local_iterator, iterator>);
 static_assert(!std::sentinel_for<local_iterator, const_iterator>);
 static_assert(std::sentinel_for<local_iterator, local_iterator>);
 static_assert(std::sentinel_for<local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<local_iterator>);
+static_assert(!std::sized_sentinel_for<local_iterator, iterator>);
+static_assert(!std::sized_sentinel_for<local_iterator, const_iterator>);
+static_assert(!std::sized_sentinel_for<local_iterator, local_iterator>);
+static_assert(!std::sized_sentinel_for<local_iterator, const_local_iterator>);
 
-static_assert(std::indirectly_readable<const_local_iterator>);
+static_assert(std::forward_iterator<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
-static_assert(std::incrementable<const_local_iterator>);
-static_assert(std::input_or_output_iterator<const_local_iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, iterator>);
 static_assert(!std::sentinel_for<const_local_iterator, const_iterator>);
 static_assert(std::sentinel_for<const_local_iterator, local_iterator>);
 static_assert(std::sentinel_for<const_local_iterator, const_local_iterator>);
-static_assert(std::input_iterator<const_local_iterator>);
+static_assert(!std::sized_sentinel_for<const_local_iterator, iterator>);
+static_assert(!std::sized_sentinel_for<const_local_iterator, const_iterator>);
+static_assert(!std::sized_sentinel_for<const_local_iterator, local_iterator>);
+static_assert(!std::sized_sentinel_for<const_local_iterator, const_local_iterator>);
index 7806ce0..e792ce0 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::const_iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index a94cdbf..53f4e90 100644 (file)
@@ -22,8 +22,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>);
 static_assert(stdr::common_range<range>);
-static_assert(stdr::input_range<range>);
+static_assert(stdr::forward_range<range>);
 
 static_assert(std::same_as<stdr::iterator_t<range const>, range::iterator>);
 static_assert(stdr::common_range<range const>);
-static_assert(stdr::input_range<range const>);
+static_assert(stdr::forward_range<range const>);
index 5e0f16a..55d5c38 100644 (file)
@@ -20,12 +20,9 @@ using iterator = std::span<int>::iterator;
 using reverse_iterator = std::span<int>::reverse_iterator;
 using value_type = int;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
 static_assert(std::sized_sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
-static_assert(std::input_iterator<iterator>);
index 6c3ee5a..63ab32c 100644 (file)
 
 using value_type = fs::directory_entry;
 
-static_assert(std::indirectly_readable<fs::directory_iterator>);
+static_assert(std::input_iterator<fs::directory_iterator>);
+static_assert(!std::forward_iterator<fs::directory_iterator>);
 static_assert(!std::indirectly_writable<fs::directory_iterator, value_type>);
-static_assert(std::weakly_incrementable<fs::directory_iterator>);
 static_assert(!std::incrementable<fs::directory_iterator>);
-static_assert(std::input_or_output_iterator<fs::directory_iterator>);
 static_assert(std::sentinel_for<fs::directory_iterator, fs::directory_iterator>);
 static_assert(!std::sized_sentinel_for<fs::directory_iterator, fs::directory_iterator>);
-static_assert(std::input_iterator<fs::directory_iterator>);
 
-static_assert(std::indirectly_readable<fs::recursive_directory_iterator>);
+static_assert(std::input_iterator<fs::recursive_directory_iterator>);
+static_assert(!std::forward_iterator<fs::recursive_directory_iterator>);
 static_assert(!std::indirectly_writable<fs::recursive_directory_iterator, value_type>);
-static_assert(std::weakly_incrementable<fs::recursive_directory_iterator>);
 static_assert(!std::incrementable<fs::recursive_directory_iterator>);
-static_assert(std::input_or_output_iterator<fs::recursive_directory_iterator>);
 static_assert(std::sentinel_for<fs::recursive_directory_iterator, fs::recursive_directory_iterator>);
 static_assert(!std::sized_sentinel_for<fs::recursive_directory_iterator, fs::recursive_directory_iterator>);
-static_assert(std::input_iterator<fs::recursive_directory_iterator>);
index 3cb551a..6f22e25 100644 (file)
@@ -21,8 +21,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<fs::path>, fs::path::iterator>);
 static_assert(stdr::common_range<fs::path>);
-static_assert(stdr::input_range<fs::path>);
+static_assert(stdr::forward_range<fs::path>);
 
 static_assert(std::same_as<stdr::iterator_t<fs::path const>, fs::path::const_iterator>);
 static_assert(stdr::common_range<fs::path const>);
-static_assert(stdr::input_range<fs::path const>);
+static_assert(stdr::forward_range<fs::path const>);
diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/forward_iterator.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/forward_iterator.compile.pass.cpp
new file mode 100644 (file)
index 0000000..61eb3ea
--- /dev/null
@@ -0,0 +1,89 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+
+// std::forward_iterator;
+
+#include <iterator>
+
+#include <concepts>
+
+#include "test_iterators.h"
+
+static_assert(!std::forward_iterator<cpp17_input_iterator<int*> >);
+static_assert(!std::forward_iterator<cpp20_input_iterator<int*> >);
+static_assert(std::forward_iterator<forward_iterator<int*> >);
+static_assert(std::forward_iterator<bidirectional_iterator<int*> >);
+static_assert(std::forward_iterator<random_access_iterator<int*> >);
+static_assert(std::forward_iterator<contiguous_iterator<int*> >);
+
+static_assert(std::forward_iterator<int*>);
+static_assert(std::forward_iterator<int const*>);
+static_assert(std::forward_iterator<int volatile*>);
+static_assert(std::forward_iterator<int const volatile*>);
+
+struct not_input_iterator {
+  // using value_type = int;
+  using difference_type = std::ptrdiff_t;
+  using iterator_concept = std::forward_iterator_tag;
+
+  int operator*() const;
+
+  not_input_iterator& operator++();
+  not_input_iterator operator++(int);
+
+  bool operator==(not_input_iterator const&) const = default;
+};
+static_assert(std::input_or_output_iterator<not_input_iterator>);
+static_assert(!std::input_iterator<not_input_iterator>);
+static_assert(!std::forward_iterator<not_input_iterator>);
+
+struct bad_iterator_tag {
+  using value_type = int;
+  using difference_type = std::ptrdiff_t;
+  using iterator_concept = std::input_iterator_tag;
+
+  int operator*() const;
+
+  bad_iterator_tag& operator++();
+  bad_iterator_tag operator++(int);
+
+  bool operator==(bad_iterator_tag const&) const = default;
+};
+static_assert(!std::forward_iterator<bad_iterator_tag>);
+
+struct not_incrementable {
+  using value_type = int;
+  using difference_type = std::ptrdiff_t;
+  using iterator_concept = std::forward_iterator_tag;
+
+  int operator*() const;
+
+  not_incrementable& operator++();
+  void operator++(int);
+
+  bool operator==(not_incrementable const&) const = default;
+};
+static_assert(!std::forward_iterator<not_incrementable>);
+
+struct not_equality_comparable {
+  using value_type = int;
+  using difference_type = std::ptrdiff_t;
+  using iterator_concept = std::forward_iterator_tag;
+
+  int operator*() const;
+
+  not_equality_comparable& operator++();
+  not_equality_comparable operator++(int);
+
+  bool operator==(not_equality_comparable const&) const = delete;
+};
+static_assert(!std::forward_iterator<not_equality_comparable>);
 // UNSUPPORTED: libcpp-no-concepts
 // UNSUPPORTED: gcc-10
 
-// template<class T>
-// concept input_iterator;
+// std::forward_iterator;
 
 #include <iterator>
 
 #include <concepts>
 
 // clang-format off
-template<std::input_or_output_iterator I>
-requires std::indirectly_readable<I> &&
-         std::derived_from<std::_ITER_CONCEPT<I>, std::input_iterator_tag>
+template<std::input_iterator>
 [[nodiscard]] constexpr bool check_subsumption() {
   return false;
 }
 
-template<std::input_iterator>
+template<std::forward_iterator>
 [[nodiscard]] constexpr bool check_subsumption() {
   return true;
 }
index 3a18b8a..608a7d0 100644 (file)
@@ -1 +1,33 @@
-// Due to the need to check _ITER_CONCEPT, this test  is located in `test/libcxx/iterators/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp`.
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+
+// template<class T>
+// concept input_iterator;
+
+#include <iterator>
+
+#include <concepts>
+
+// clang-format off
+template<std::input_or_output_iterator I>
+requires std::indirectly_readable<I>
+[[nodiscard]] constexpr bool check_subsumption() {
+  return false;
+}
+
+template<std::input_iterator>
+[[nodiscard]] constexpr bool check_subsumption() {
+  return true;
+}
+// clang-format on
+
+static_assert(check_subsumption<int*>());
index 185f04b..e239ce1 100644 (file)
 #include <iterator>
 
 using iterator = std::move_iterator<int*>;
-static_assert(std::indirectly_readable<iterator>);
+
+
+static_assert(std::input_iterator<iterator>);
+static_assert(!std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, int>);
 static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sized_sentinel_for<iterator, iterator>);
-static_assert(std::input_iterator<iterator>);
index ea8d020..4144617 100644 (file)
 
 #include <iterator>
 
-using iterator = std::reverse_iterator<int*>;
-
-static_assert(std::indirectly_readable<iterator>);
-static_assert(std::indirectly_writable<iterator, int>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
-static_assert(std::sentinel_for<iterator, iterator>);
-static_assert(std::sized_sentinel_for<iterator, iterator>);
-static_assert(std::input_iterator<iterator>);
-
-using other_iterator = std::reverse_iterator<float*>;
-static_assert(std::sentinel_for<iterator, other_iterator>);
-static_assert(!std::sized_sentinel_for<iterator, other_iterator>);
+#include "test_iterators.h"
+
+template<class I1>
+[[nodiscard]] consteval bool common_reverse_iterator_checks() {
+  static_assert(std::indirectly_writable<I1, int>);
+  static_assert(std::sentinel_for<I1, I1>);
+  static_assert(std::sentinel_for<I1, std::reverse_iterator<float*>>);
+  static_assert(!std::sized_sentinel_for<I1, std::reverse_iterator<float*>>);
+  return true;
+}
+
+using reverse_bidirectional_iterator = std::reverse_iterator<bidirectional_iterator<int*>>;
+static_assert(common_reverse_iterator_checks<reverse_bidirectional_iterator>());
+static_assert(std::forward_iterator<reverse_bidirectional_iterator>);
+static_assert(!std::sized_sentinel_for<reverse_bidirectional_iterator, reverse_bidirectional_iterator>);
+
+using reverse_random_access_iterator = std::reverse_iterator<random_access_iterator<int*>>;
+static_assert(common_reverse_iterator_checks<reverse_random_access_iterator>());
+static_assert(std::forward_iterator<reverse_random_access_iterator>);
+static_assert(std::sized_sentinel_for<reverse_random_access_iterator, reverse_random_access_iterator>);
+
+using reverse_contiguous_iterator = std::reverse_iterator<contiguous_iterator<int*>>;
+static_assert(common_reverse_iterator_checks<reverse_contiguous_iterator>());
+static_assert(std::forward_iterator<reverse_contiguous_iterator>);
+static_assert(std::sized_sentinel_for<reverse_contiguous_iterator, reverse_contiguous_iterator>);
index e953563..765d5b2 100644 (file)
 #include <string>
 
 using iterator = std::istreambuf_iterator<char>;
-static_assert(std::indirectly_readable<iterator>);
+
+static_assert(std::input_iterator<iterator>);
+static_assert(!std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, char>);
-static_assert(std::weakly_incrementable<iterator>);
 static_assert(!std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(!std::sized_sentinel_for<iterator, iterator>);
-static_assert(std::input_iterator<iterator>);
diff --git a/libcxx/test/std/ranges/range.refinements/forward_range.compile.pass.cpp b/libcxx/test/std/ranges/range.refinements/forward_range.compile.pass.cpp
new file mode 100644 (file)
index 0000000..1a58f1f
--- /dev/null
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+
+// std::ranges::forward_range;
+
+#include <ranges>
+
+#include "test_iterators.h"
+#include "test_range.h"
+
+namespace stdr = std::ranges;
+
+template <template <class...> class I>
+constexpr bool check_forward_range() {
+  constexpr bool result = stdr::forward_range<test_range<I> >;
+  static_assert(stdr::forward_range<test_range<I> const> == result);
+  static_assert(stdr::forward_range<test_non_const_common_range<I> > == result);
+  static_assert(stdr::forward_range<test_non_const_range<I> > == result);
+  static_assert(stdr::forward_range<test_common_range<I> > == result);
+  static_assert(stdr::forward_range<test_common_range<I> const> == result);
+  static_assert(!stdr::forward_range<test_non_const_common_range<I> const>);
+  static_assert(!stdr::forward_range<test_non_const_range<I> const>);
+  return result;
+}
+
+static_assert(!check_forward_range<cpp17_input_iterator>());
+static_assert(!check_forward_range<cpp20_input_iterator>());
+static_assert(check_forward_range<forward_iterator>());
+static_assert(check_forward_range<bidirectional_iterator>());
+static_assert(check_forward_range<random_access_iterator>());
+static_assert(check_forward_range<contiguous_iterator>());
index 5f3519e..0480557 100644 (file)
@@ -13,6 +13,8 @@
 // template<class T>
 // concept input_iterator;
 
+// std::ranges::forward_range
+
 #include <ranges>
 
 #include <iterator>
@@ -37,3 +39,19 @@ requires true
 // clang-format on
 
 static_assert(check_input_range_subsumption<range>());
+
+// clang-format off
+template<std::ranges::input_range R>
+requires std::forward_iterator<std::ranges::iterator_t<R> >
+[[nodiscard]] constexpr bool check_forward_range_subsumption() {
+  return false;
+}
+
+template<std::ranges::forward_range>
+requires true
+[[nodiscard]] constexpr bool check_forward_range_subsumption() {
+  return true;
+}
+// clang-format on
+
+static_assert(check_forward_range_subsumption<range>());
index 2512ec9..b37640b 100644 (file)
 
 #include <iterator>
 
-static_assert(std::indirectly_readable<std::cregex_iterator>);
+static_assert(std::forward_iterator<std::cregex_iterator>);
 static_assert(!std::indirectly_writable<std::cregex_iterator, char>);
-static_assert(std::incrementable<std::cregex_iterator>);
-static_assert(std::input_or_output_iterator<std::cregex_iterator>);
 static_assert(std::sentinel_for<std::cregex_iterator, std::cregex_iterator>);
 static_assert(!std::sized_sentinel_for<std::cregex_iterator, std::cregex_iterator>);
-static_assert(std::input_iterator<std::cregex_iterator>);
index 4f68d64..b3e69d5 100644 (file)
 
 #include <iterator>
 
-static_assert(std::indirectly_readable<std::cregex_token_iterator>);
+static_assert(std::forward_iterator<std::cregex_token_iterator>);
 static_assert(!std::indirectly_writable<std::cregex_token_iterator, char>);
-static_assert(std::incrementable<std::cregex_token_iterator>);
-static_assert(std::input_or_output_iterator<std::cregex_token_iterator>);
 static_assert(std::sentinel_for<std::cregex_token_iterator, std::cregex_token_iterator>);
 static_assert(!std::sized_sentinel_for<std::cregex_token_iterator, std::cregex_token_iterator>);
-static_assert(std::input_iterator<std::cregex_token_iterator>);
index e743f7c..2bc1f75 100644 (file)
@@ -21,8 +21,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<std::cmatch>, std::cmatch::iterator>);
 static_assert(stdr::common_range<std::cmatch>);
-static_assert(stdr::input_range<std::cmatch>);
+static_assert(stdr::forward_range<std::cmatch>);
 
 static_assert(std::same_as<stdr::iterator_t<std::cmatch const>, std::cmatch::const_iterator>);
 static_assert(stdr::common_range<std::cmatch const>);
-static_assert(stdr::input_range<std::cmatch const>);
+static_assert(stdr::forward_range<std::cmatch const>);
index 18b0a1d..4605cfd 100644 (file)
@@ -21,8 +21,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<std::string>, std::string::iterator>);
 static_assert(stdr::common_range<std::string>);
-static_assert(stdr::input_range<std::string>);
+static_assert(stdr::forward_range<std::string>);
 
 static_assert(std::same_as<stdr::iterator_t<std::string const>, std::string::const_iterator>);
 static_assert(stdr::common_range<std::string const>);
-static_assert(stdr::input_range<std::string const>);
+static_assert(stdr::forward_range<std::string const>);
index 19c480e..2777b1f 100644 (file)
@@ -22,10 +22,8 @@ using reverse_iterator = std::string::reverse_iterator;
 using const_reverse_iterator = std::string::const_reverse_iterator;
 using value_type = char;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -35,9 +33,8 @@ static_assert(std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
-static_assert(std::incrementable<const_iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -46,4 +43,3 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);
index 8957db2..f4ee18b 100644 (file)
@@ -21,8 +21,8 @@ namespace stdr = std::ranges;
 
 static_assert(std::same_as<stdr::iterator_t<std::string_view>, std::string_view::iterator>);
 static_assert(stdr::common_range<std::string_view>);
-static_assert(stdr::input_range<std::string_view>);
+static_assert(stdr::forward_range<std::string_view>);
 
 static_assert(std::same_as<stdr::iterator_t<std::string_view const>, std::string_view::const_iterator>);
 static_assert(stdr::common_range<std::string_view const>);
-static_assert(stdr::input_range<std::string_view const>);
+static_assert(stdr::forward_range<std::string_view const>);
index 6effb1f..db8d8be 100644 (file)
@@ -21,10 +21,8 @@ using const_iterator = std::string_view::const_iterator;
 using reverse_iterator = std::string_view::reverse_iterator;
 using const_reverse_iterator = std::string_view::const_reverse_iterator;
 
-static_assert(std::indirectly_readable<iterator>);
+static_assert(std::forward_iterator<iterator>);
 static_assert(!std::indirectly_writable<iterator, char>);
-static_assert(std::incrementable<iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<iterator, iterator>);
 static_assert(std::sentinel_for<iterator, const_iterator>);
 static_assert(!std::sentinel_for<iterator, reverse_iterator>);
@@ -34,10 +32,8 @@ static_assert(std::sized_sentinel_for<iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
 
-static_assert(std::indirectly_readable<const_iterator>);
+static_assert(std::forward_iterator<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, char>);
-static_assert(std::incrementable<const_iterator>);
-static_assert(std::input_or_output_iterator<iterator>);
 static_assert(std::sentinel_for<const_iterator, iterator>);
 static_assert(std::sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
@@ -46,4 +42,3 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
 static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
 static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
-static_assert(std::input_iterator<const_iterator>);