Iros
 
Loading...
Searching...
No Matches
enumerate_view.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/meta/language.h"
10#include "di/meta/util.h"
11#include "di/util/move.h"
12
13namespace di::container {
14template<concepts::InputContainer View>
15requires(concepts::View<View>)
18 , public meta::EnableBorrowedContainer<EnumerateView<View>, concepts::BorrowedContainer<View>> {
19private:
20 template<bool is_const>
22
23 template<bool is_const>
25
26 template<bool is_const>
28
29 template<bool is_const>
31
32 template<bool is_const>
34
35 template<bool is_const>
37
38 template<bool is_const>
39 class Iterator
40 : public IteratorExtension<Iterator<is_const>, Iter<is_const>, Tuple<Index<is_const>, Value<is_const>>> {
41 private:
42 using Base = IteratorExtension<Iterator<is_const>, Iter<is_const>, Tuple<Index<is_const>, Value<is_const>>>;
43
44 public:
45 Iterator() = default;
46
47 constexpr explicit Iterator(Iter<is_const> base, SSizeType<is_const> index)
48 : Base(util::move(base)), m_index(static_cast<Index<is_const>>(index)) {}
49
50 constexpr Iterator(Iterator<!is_const> other)
51 requires(is_const && concepts::ConvertibleTo<Iter<false>, Iter<true>>)
52 : Base(other.base()), m_index(other.m_index) {}
53
54 constexpr auto operator*() const {
55 return Tuple<Index<is_const>, meta::IteratorReference<Iter<is_const>>> { m_index, *this->base() };
56 }
57
58 constexpr void advance_one() {
59 Base::advance_one();
60 ++m_index;
61 }
62
63 constexpr void back_one()
65 {
66 Base::back_one();
67 --m_index;
68 }
69
70 constexpr void advance_n(SSizeType<is_const> n)
72 {
73 Base::advance_n(n);
74 m_index += n;
75 }
76
77 private:
78 template<bool other_is_const>
79 friend class Iterator;
80
81 Index<is_const> m_index;
82 };
83
84 template<bool is_const>
85 class Sentinel : public SentinelExtension<Sentinel<is_const>, Sent<is_const>, Iterator<is_const>, Iter<is_const>> {
86 private:
87 using Base = SentinelExtension<Sentinel<is_const>, Sent<is_const>, Iterator<is_const>, Iter<is_const>>;
88
89 public:
90 Sentinel() = default;
91
92 constexpr explicit Sentinel(Sent<is_const> base) : Base(base) {}
93
94 constexpr Sentinel(Sentinel<!is_const> other)
95 requires(is_const && concepts::ConvertibleTo<Sent<false>, Sent<true>>)
96 : Base(other.base()) {}
97 };
98
99public:
102 = default;
103
104 constexpr explicit EnumerateView(View base) : m_base(util::move(base)) {}
105
106 constexpr auto base() const& -> View
107 requires(concepts::CopyConstructible<View>)
108 {
109 return m_base;
110 }
111 constexpr auto base() && -> View { return util::move(m_base); }
112
113 constexpr auto begin()
115 {
116 return Iterator<false>(container::begin(m_base), 0);
117 }
118
119 constexpr auto begin() const
120 requires(concepts::Container<View const>)
121 {
122 return Iterator<true>(container::begin(m_base), 0);
123 }
124
125 constexpr auto end()
127 {
129 return Iterator<false>(container::end(m_base), static_cast<SSizeType<false>>(this->size()));
130 } else {
131 return Sentinel<false>(container::end(m_base));
132 }
133 }
134
135 constexpr auto end() const
136 requires(concepts::Container<View const>)
137 {
139 return Iterator<false>(container::end(m_base), static_cast<SSizeType<true>>(this->size()));
140 } else {
141 return Sentinel<false>(container::end(m_base));
142 }
143 }
144
145 constexpr auto size()
147 {
148 return container::size(m_base);
149 }
150
151 constexpr auto size() const
152 requires(concepts::SizedContainer<View const>)
153 {
154 return container::size(m_base);
155 }
156
157private:
158 View m_base;
159};
160
161template<typename Con>
163}
Definition enumerate_view.h:18
constexpr auto end()
Definition enumerate_view.h:125
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition enumerate_view.h:106
constexpr auto size() const
Definition enumerate_view.h:151
constexpr EnumerateView(View base)
Definition enumerate_view.h:104
constexpr auto size()
Definition enumerate_view.h:145
constexpr auto begin() const
Definition enumerate_view.h:119
constexpr auto end() const
Definition enumerate_view.h:135
constexpr auto begin()
Definition enumerate_view.h:113
constexpr auto base() &&-> View
Definition enumerate_view.h:111
Definition iterator_extension.h:19
constexpr auto base() const &-> Iter const &
Definition iterator_extension.h:30
Definition sentinel_extension.h:10
constexpr auto base() const -> Sent
Definition sentinel_extension.h:16
Definition view_interface.h:26
Definition view.h:35
Definition tuple_forward_declaration.h:5
Definition bidirectional_iterator.h:8
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition random_access_iterator.h:12
Definition simple_view.h:11
Definition sized_container.h:8
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto move
Definition move.h:38
constexpr auto size
Definition size.h:54
constexpr auto end
Definition end.h:47
EnumerateView(Con &&) -> EnumerateView< meta::AsView< Con > >
constexpr auto begin
Definition begin.h:44
Definition merge_interfaces.h:6
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition container_ssize_type.h:8
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
detail::MakeUnsignedHelper< RemoveCV< T > >::Type MakeUnsigned
Definition language.h:362
Conditional< is_const, T const, T > MaybeConst
Definition util.h:9
decltype(*util::declval< T const & >()) IteratorReference
Definition iterator_reference.h:7
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
Definition vocab.h:96
Definition enable_borrowed_container.h:9