mirror of
https://github.com/intel/llvm.git
synced 2026-01-28 00:15:21 +08:00
[libcxx][iterator][ranges] adds forward_iterator and forward_range
Implements parts of:
* P0896R4 The One Ranges Proposal`
Depends on D100271.
Differential Revision: https://reviews.llvm.org/D100275
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -54,8 +54,12 @@ namespace ranges {
|
||||
template <class _Tp>
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -18,20 +18,16 @@
|
||||
|
||||
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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
@@ -10,22 +10,19 @@
|
||||
// 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;
|
||||
}
|
||||
@@ -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*>());
|
||||
|
||||
@@ -15,10 +15,11 @@
|
||||
#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>);
|
||||
|
||||
@@ -14,16 +14,28 @@
|
||||
|
||||
#include <iterator>
|
||||
|
||||
using iterator = std::reverse_iterator<int*>;
|
||||
#include "test_iterators.h"
|
||||
|
||||
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>);
|
||||
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 other_iterator = std::reverse_iterator<float*>;
|
||||
static_assert(std::sentinel_for<iterator, other_iterator>);
|
||||
static_assert(!std::sized_sentinel_for<iterator, other_iterator>);
|
||||
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>);
|
||||
|
||||
@@ -18,11 +18,10 @@
|
||||
#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>);
|
||||
|
||||
@@ -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>());
|
||||
@@ -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>());
|
||||
|
||||
@@ -16,10 +16,7 @@
|
||||
|
||||
#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>);
|
||||
|
||||
@@ -16,10 +16,7 @@
|
||||
|
||||
#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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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>);
|
||||
|
||||
Reference in New Issue
Block a user