18template<concepts::InputContainer View>
19requires(concepts::View<View>)
24 template<
bool is_const>
27 template<
bool is_const>
30 template<
bool is_const>
33 template<
bool is_const>
36 template<
bool is_const>
41 concepts::RandomAccessIterator<Iter<is_const>>, RandomAccessIteratorTag,
42 meta::Conditional<concepts::BidirectionalIterator<Iter<is_const>>, BidirectionalIteratorTag,
43 meta::Conditional<concepts::ForwardIterator<Iter<is_const>>, ForwardIteratorTag,
45 ValueType<is_const>, SSizeType<is_const>> {
50 SSizeType<is_const> missing = 0)
51 : m_base(util::move(
base))
53 , m_stride(parent->stride())
54 , m_missing(missing) {}
61 constexpr Iterator(Iterator<!is_const> other)
64 : m_base(util::move(other.m_base))
65 , m_end(util::move(other.m_end))
66 , m_stride(other.m_stride)
67 , m_missing(other.m_missing) {}
69 Iterator(Iterator
const&) =
default;
70 Iterator(Iterator&&) =
default;
72 auto operator=(Iterator
const&) -> Iterator& =
default;
73 auto operator=(Iterator&&) -> Iterator& =
default;
75 Iterator(Iterator
const&)
78 auto operator=(Iterator
const&) -> Iterator&
82 constexpr auto base() && -> Iter<is_const> {
return util::move(m_base); }
83 constexpr auto base()
const& -> Iter<is_const>
const& {
return m_base; }
85 constexpr auto operator*()
const ->
decltype(
auto) {
return *m_base; }
87 constexpr void advance_one() { m_missing =
container::advance(m_base, m_stride, m_end); }
89 constexpr void back_one()
96 constexpr void advance_n(SSizeType<is_const> n)
108 template<
bool other_is_const>
109 friend class Iterator;
112 return self.m_base == self.m_end;
114 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
117 return a.m_base == b.m_base;
120 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
123 return a.m_base <=> b.m_base;
126 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType<is_const>
129 auto n = a.m_base - b.m_base;
131 return (n + a.m_missing - b.m_missing) / a.m_stride;
157 Iter<is_const> m_base {};
158 Sent<is_const> m_end {};
159 SSizeType<is_const> m_stride { 0 };
160 SSizeType<is_const> m_missing { 0 };
173 constexpr auto base() && ->
View {
return util::move(m_base); }
175 constexpr auto stride()
const {
return m_stride; }
203 constexpr auto end() const
231 SSizeType<false> m_stride;
234template<
typename Con>
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition stride_view.h:22
constexpr auto stride() const
Definition stride_view.h:175
constexpr auto base() &&-> View
Definition stride_view.h:173
constexpr auto end() const
Definition stride_view.h:203
constexpr auto size()
Definition stride_view.h:217
constexpr auto end()
Definition stride_view.h:189
constexpr auto size() const
Definition stride_view.h:223
constexpr auto begin() const
Definition stride_view.h:183
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition stride_view.h:168
constexpr StrideView(View base, SSizeType< false > stride)
Definition stride_view.h:164
constexpr auto begin()
Definition stride_view.h:177
Definition view_interface.h:26
Definition bidirectional_container.h:8
Definition bidirectional_iterator.h:8
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition forward_container.h:8
Definition forward_iterator.h:10
Definition indirectly_swappable.h:7
Definition random_access_iterator.h:12
Definition simple_view.h:11
Definition sized_container.h:8
Definition sized_sentinel_for.h:9
Definition any_storable.h:9
constexpr auto operator<=>(MoveIterator< Iter > const &a, MoveIterator< U > const &b)
Definition move_iterator.h:90
constexpr auto operator-(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> decltype(a.base() - b.base())
Definition move_iterator.h:95
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto move
Definition move.h:38
StrideView(Con &&, meta::ContainerSSizeType< Con >) -> StrideView< meta::AsView< Con > >
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto distance
Definition distance.h:44
constexpr auto iterator_swap
Definition iterator_swap.h:49
constexpr auto default_sentinel
Definition default_sentinel.h:6
constexpr auto end
Definition end.h:55
constexpr auto advance
Definition advance.h:62
constexpr auto begin
Definition begin.h:52
constexpr auto to_unsigned
Definition to_unsigned.h:16
constexpr auto divide_round_up
Definition divide_round_up.h:17
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition default_sentinel.h:4
Definition enable_borrowed_container.h:9
Definition iterator_base.h:14