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&)
80 constexpr auto base() && -> Iter<is_const> {
return util::move(m_base); }
81 constexpr auto base()
const& -> Iter<is_const>
const& {
return m_base; }
83 constexpr auto operator*()
const ->
decltype(
auto) {
return *m_base; }
85 constexpr void advance_one() { m_missing =
container::advance(m_base, m_stride, m_end); }
87 constexpr void back_one()
94 constexpr void advance_n(SSizeType<is_const> n)
106 template<
bool other_is_const>
107 friend class Iterator;
110 return self.m_base == self.m_end;
112 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
115 return a.m_base == b.m_base;
118 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
121 return a.m_base <=> b.m_base;
124 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType<is_const>
127 auto n = a.m_base - b.m_base;
129 return (n + a.m_missing - b.m_missing) / a.m_stride;
155 Iter<is_const> m_base {};
156 Sent<is_const> m_end {};
157 SSizeType<is_const> m_stride { 0 };
158 SSizeType<is_const> m_missing { 0 };
171 constexpr auto base() && ->
View {
return util::move(m_base); }
173 constexpr auto stride()
const {
return m_stride; }
201 constexpr auto end() const
229 SSizeType<false> m_stride;
232template<
typename Con>
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition stride_view.h:22
constexpr auto stride() const
Definition stride_view.h:173
constexpr auto base() &&-> View
Definition stride_view.h:171
constexpr auto end() const
Definition stride_view.h:201
constexpr auto size()
Definition stride_view.h:215
constexpr auto end()
Definition stride_view.h:187
constexpr auto size() const
Definition stride_view.h:221
constexpr auto begin() const
Definition stride_view.h:181
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition stride_view.h:166
constexpr StrideView(View base, SSizeType< false > stride)
Definition stride_view.h:162
constexpr auto begin()
Definition stride_view.h:175
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:47
constexpr auto advance
Definition advance.h:62
constexpr auto begin
Definition begin.h:44
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