10#include <dr/detail/ranges_shim.hpp>
25 using accessor_type = Accessor;
26 using const_accessor_type =
typename Accessor::const_iterator_accessor;
27 using nonconst_accessor_type =
typename Accessor::nonconst_iterator_accessor;
29 using difference_type =
typename Accessor::difference_type;
30 using value_type =
typename Accessor::value_type;
33 using reference =
typename Accessor::reference;
34 using iterator_category =
typename Accessor::iterator_category;
38 static_assert(std::is_same_v<iterator, iterator_adaptor<Accessor>>);
45 template <
typename... Args>
47 sizeof...(Args) >= 1 &&
48 !((
sizeof...(Args) == 1 &&
50 (std::is_same_v<const_iterator, std::decay_t<Args>> || ...) ||
51 (std::is_same_v<nonconst_accessor_type, std::decay_t<Args>> || ...) ||
52 (std::is_same_v<const_accessor_type, std::decay_t<Args>> || ...)) &&
53 std::is_constructible_v<accessor_type, Args...>)
58 requires(!std::is_same_v<accessor_type, const_accessor_type>)
59 : accessor_(accessor) {}
62 requires(!std::is_same_v<iterator, const_iterator>)
68 return accessor_ == other.accessor_;
71 bool operator!=(
const_iterator other)
const {
return !(*
this == other); }
74 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
76 return accessor_ < other.accessor_;
80 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
82 return *
this < other || *
this == other;
86 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
88 return !(*
this <= other);
92 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
94 return !(*
this < other);
97 reference operator*()
const {
return *accessor_; }
99 reference operator[](difference_type offset)
const
100 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
102 return *(*
this + offset);
105 iterator &operator+=(difference_type offset)
noexcept
106 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
112 iterator &operator-=(difference_type offset)
noexcept
113 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
115 accessor_ += -offset;
119 iterator operator+(difference_type offset)
const
120 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
127 iterator operator-(difference_type offset)
const
128 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
136 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
138 return accessor_ - other.accessor_;
142 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
150 !std::is_same_v<iterator_category, std::random_access_iterator_tag>)
164 std::is_same_v<iterator_category, std::random_access_iterator_tag> ||
165 std::is_same_v<iterator_category, std::bidirectional_iterator_tag>)
173 std::is_same_v<iterator_category, std::random_access_iterator_tag> ||
174 std::is_same_v<iterator_category, std::bidirectional_iterator_tag>)
181 auto segments()
const noexcept
182 requires(has_segments_method<accessor_type>)
184 return accessor_.segments();
188 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
197 accessor_type accessor_;
Definition: iterator_adaptor.hpp:23
Definition: iterator_adaptor.hpp:17