17template<concepts::View View>
20template<concepts::View View>
28 class InnerIterator :
public IteratorBase<InnerIterator, InputIteratorTag, meta::ContainerValue<View>, SSizeType> {
32 constexpr explicit InnerIterator(
ChunkView& parent) : m_parent(
util::addressof(parent)) {}
36 auto operator=(InnerIterator&&) -> InnerIterator& =
default;
38 constexpr auto base() const& -> Iter const& {
return *m_parent->m_current; }
40 constexpr auto operator*() const -> decltype(auto) {
return **m_parent->m_current; }
43 ++*m_parent->m_current;
45 m_parent->m_remainder = 0;
47 --m_parent->m_remainder;
52 constexpr auto at_end() const ->
bool {
return m_parent->m_remainder == 0; }
54 constexpr auto distance() const -> SSizeType {
78 constexpr explicit ValueType(
ChunkView& parent) : m_parent(
util::addressof(parent)) {}
85 constexpr auto size() const
86 requires(
concepts::SizedSentinelFor<Sent, Iter>)
95 class OuterIterator :
public IteratorBase<OuterIterator, InputIteratorTag, ValueType, SSizeType> {
99 constexpr explicit OuterIterator(
ChunkView& parent) : m_parent(
util::addressof(parent)) {}
103 auto operator=(OuterIterator&&) -> OuterIterator& =
default;
109 m_parent->m_remainder = m_parent->m_chunk_size;
113 constexpr auto at_end() const ->
bool {
114 return *m_parent->m_current ==
container::end(m_parent->m_base) && m_parent->m_remainder != 0;
117 constexpr auto distance() const -> SSizeType {
120 if (distance < m_parent->m_remainder) {
157 constexpr auto base() && ->
View {
return util::move(m_base); }
163 m_remainder = m_chunk_size;
183 SSizeType m_chunk_size { 0 };
184 SSizeType m_remainder { 0 };
185 util::NonPropagatingCache<Iter> m_current;
188template<concepts::View View>
189requires(concepts::ForwardContainer<View>)
194 template<
bool is_const>
197 template<
bool is_const>
200 template<
bool is_const>
203 template<
bool is_const>
206 template<
bool is_const>
212 template<
bool is_const>
215 meta::Conditional<concepts::RandomAccessIterator<Iter<is_const>>, RandomAccessIteratorTag,
216 meta::Conditional<concepts::BidirectionalIterator<Iter<is_const>>,
217 BidirectionalIteratorTag, ForwardIteratorTag>>,
218 ValueType<is_const>, SSizeType<is_const>> {
223 SSizeType<is_const> missing = 0)
227 , m_missing(missing) {}
237 , m_chunk_size(other.m_chunk_size)
238 , m_missing(other.m_missing) {}
240 constexpr auto base() -> Iter<is_const> {
return m_base; }
271 return self.m_base == self.m_end;
278 return a.m_base <=> b.m_base;
284 auto n = a.m_base - b.m_base;
285 return (n + a.m_missing - b.m_missing) / a.m_chunk_size;
295 Iter<is_const> m_base {};
296 Sent<is_const> m_end {};
297 SSizeType<is_const> m_chunk_size { 0 };
298 SSizeType<is_const> m_missing { 0 };
316 constexpr auto base() && ->
View {
return util::move(m_base); }
345 constexpr auto end() const
372 SSizeType<false> m_chunk_size;
375template<
typename Con>
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition chunk_view.h:18
constexpr auto base() const &-> Iter const &
Definition chunk_view.h:38
constexpr auto begin()
Definition chunk_view.h:161
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition chunk_view.h:152
constexpr friend auto operator<=>(Iterator const &a, Iterator const &b)
Definition chunk_view.h:275
constexpr ChunkView(View base, SSizeType< false > chunk_size)
Definition chunk_view.h:306
constexpr friend auto operator-(DefaultSentinel, OuterIterator const &a) -> SSizeType requires(concepts::SizedSentinelFor< Sent, Iter >)
Definition chunk_view.h:128
constexpr auto base() -> Iter< is_const >
Definition chunk_view.h:240
constexpr friend auto operator==(InnerIterator const &a, DefaultSentinel) -> bool
Definition chunk_view.h:58
constexpr auto begin() const
Definition chunk_view.h:326
constexpr friend auto operator-(DefaultSentinel, Iterator const &b) -> SSizeType< is_const >
Definition chunk_view.h:288
constexpr auto size()
Definition chunk_view.h:169
constexpr auto begin()
Definition chunk_view.h:320
auto operator=(OuterIterator &&) -> OuterIterator &=default
constexpr void back_one()
Definition chunk_view.h:248
OuterIterator(OuterIterator &&)=default
constexpr friend auto operator==(Iterator const &a, Iterator const &b) -> bool
Definition chunk_view.h:273
constexpr friend auto operator-(DefaultSentinel, InnerIterator const &a) -> SSizeType requires(concepts::SizedSentinelFor< Sent, Iter >)
Definition chunk_view.h:60
constexpr ChunkView(View base, SSizeType chunk_size)
Definition chunk_view.h:148
constexpr void advance_one()
Definition chunk_view.h:246
constexpr auto begin() const
Definition chunk_view.h:81
constexpr auto size() const
Definition chunk_view.h:85
constexpr auto end() const
Definition chunk_view.h:83
constexpr void advance_one()
Definition chunk_view.h:42
constexpr auto end() const
Definition chunk_view.h:345
constexpr auto size() const
Definition chunk_view.h:175
auto operator=(InnerIterator &&) -> InnerIterator &=default
constexpr auto operator*() const -> decltype(auto)
Definition chunk_view.h:40
constexpr auto operator*() const -> ValueType
Definition chunk_view.h:105
constexpr auto base() &&-> View
Definition chunk_view.h:157
constexpr void advance_one()
Definition chunk_view.h:107
constexpr Iterator(Iterator<!is_const > other)
Definition chunk_view.h:232
constexpr friend auto operator==(OuterIterator const &a, DefaultSentinel) -> bool
Definition chunk_view.h:126
constexpr void advance_n(SSizeType< is_const > n)
Definition chunk_view.h:255
constexpr friend auto operator-(InnerIterator const &a, DefaultSentinel) -> SSizeType requires(concepts::SizedSentinelFor< Sent, Iter >)
Definition chunk_view.h:66
constexpr auto operator*() const -> decltype(auto)
Definition chunk_view.h:242
constexpr friend auto operator-(OuterIterator const &a, DefaultSentinel) -> SSizeType requires(concepts::SizedSentinelFor< Sent, Iter >)
Definition chunk_view.h:134
constexpr auto chunk_size() const
Definition chunk_view.h:159
InnerIterator(InnerIterator &&)=default
constexpr auto end()
Definition chunk_view.h:332
constexpr friend auto operator-(Iterator const &a, DefaultSentinel) -> SSizeType< is_const >
Definition chunk_view.h:291
constexpr friend auto operator-(Iterator const &a, Iterator const &b) -> SSizeType< is_const > requires(concepts::SizedSentinelFor< Iter< is_const >, Iter< is_const > >)
Definition chunk_view.h:281
friend class ChunkView
Definition chunk_view.h:30
friend class Iterator
Definition chunk_view.h:268
constexpr friend auto operator==(Iterator const &self, DefaultSentinel) -> bool
Definition chunk_view.h:270
constexpr auto end() const
Definition chunk_view.h:167
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 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 take
Definition take.h:35
constexpr auto min
Definition min.h:47
constexpr auto reconstruct
Definition reconstruct.h:75
ChunkView(Con &&, meta::ContainerSSizeType< Con >) -> ChunkView< meta::AsView< Con > >
constexpr auto move
Definition move.h:38
constexpr auto distance
Definition distance.h:44
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
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto distance
Definition distance.h:44
constexpr auto in_place_type
Definition in_place_type.h:12
Definition default_sentinel.h:4
Definition enable_borrowed_container.h:9