Iros
 
Loading...
Searching...
No Matches
chunk_by_view.h
Go to the documentation of this file.
1#pragma once
2
14#include "di/function/flip.h"
15#include "di/function/invoke.h"
16#include "di/function/not_fn.h"
17#include "di/util/addressof.h"
18#include "di/util/move.h"
22#include "di/util/store_if.h"
23
24namespace di::container {
25template<concepts::ForwardContainer View, concepts::IndirectBinaryPredicate<meta::ContainerIterator<View>> Pred>
26requires(concepts::View<View> && concepts::Object<Pred>)
27class ChunkByView : public ViewInterface<ChunkByView<View, Pred>> {
28private:
29 using SSizeType = meta::ContainerSSizeType<View>;
32
33 class Iterator
34 : public IteratorBase<
35 Iterator,
36 meta::Conditional<concepts::BidirectionalIterator<Iter>, BidirectionalIteratorTag, ForwardIteratorTag>,
37 Value, SSizeType> {
38 private:
39 friend class ChunkByView;
40
41 constexpr Iterator(ChunkByView& parent, Iter current, Iter next)
42 : m_parent(util::addressof(parent)), m_current(util::move(current)), m_next(util::move(next)) {}
43
44 public:
45 Iterator()
47 = default;
48
49 constexpr auto operator*() const -> decltype(auto) {
50 return container::reconstruct(in_place_type<View>, m_current, m_next);
51 }
52
53 constexpr void advance_one() {
54 m_current = m_next;
55 m_next = m_parent->find_next(m_current);
56 }
57
58 constexpr void back_one()
60 {
61 m_next = m_current;
62 m_current = m_parent->find_prev(m_next);
63 }
64
65 private:
66 constexpr friend auto operator==(Iterator const& a, Iterator const& b) -> bool {
67 return a.m_current == b.m_current;
68 }
69 constexpr friend auto operator==(Iterator const& a, DefaultSentinel) -> bool { return a.m_current == a.m_next; }
70
71 ChunkByView* m_parent { nullptr };
72 Iter m_current {};
73 Iter m_next {};
74 };
75
76public:
79 = default;
80
81 constexpr explicit ChunkByView(View base, Pred predicate)
82 : m_base(util::move(base)), m_predicate(util::move(predicate)) {}
83
84 constexpr auto base() const& -> View
85 requires(concepts::CopyConstructible<View>)
86 {
87 return m_base;
88 }
89 constexpr auto base() && -> View { return util::move(m_base); }
90
91 constexpr auto pred() const -> Pred const& { return m_predicate.value(); }
92
93 constexpr auto begin() -> Iterator {
94 if (!m_cache) {
95 m_cache = Iterator(*this, container::begin(m_base), find_next(container::begin(m_base)));
96 }
97 return *m_cache;
98 }
99
100 constexpr auto end() {
101 if constexpr (concepts::CommonContainer<View>) {
102 return Iterator(*this, container::end(m_base), container::end(m_base));
103 } else {
104 return default_sentinel;
105 }
106 }
107
108private:
109 constexpr auto find_next(Iter current) -> Iter {
110 return container::next(
111 container::adjacent_find(current, container::end(m_base), function::not_fn(util::ref(m_predicate.value()))),
112 1, container::end(m_base));
113 }
114
115 constexpr auto find_prev(Iter current) -> Iter
117 {
118 auto reversed = container::View(container::begin(m_base), current) | view::reverse;
119 return container::prev(
120 container::adjacent_find(reversed, function::not_fn(function::flip(util::ref(m_predicate.value())))).base(),
121 1, container::begin(m_base));
122 }
123
124 View m_base {};
125 util::RebindableBox<Pred> m_predicate;
126 util::NonPropagatingCache<Iterator> m_cache;
127};
128
129template<typename Con, typename Pred>
131}
Definition chunk_by_view.h:27
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition chunk_by_view.h:84
constexpr auto begin() -> Iterator
Definition chunk_by_view.h:93
constexpr auto pred() const -> Pred const &
Definition chunk_by_view.h:91
constexpr auto base() &&-> View
Definition chunk_by_view.h:89
constexpr ChunkByView(View base, Pred predicate)
Definition chunk_by_view.h:81
constexpr auto end()
Definition chunk_by_view.h:100
Definition view_interface.h:26
Definition view.h:35
Definition bidirectional_container.h:8
Definition bidirectional_iterator.h:8
Definition common_container.h:10
Definition operations.h:27
Definition any_storable.h:9
constexpr auto reverse
Definition reverse.h:52
Definition sequence.h:12
constexpr auto prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
constexpr auto adjacent_find
Definition adjacent_find.h:37
constexpr auto reconstruct
Definition reconstruct.h:75
constexpr auto move
Definition move.h:38
View(Iter, Sent) -> View< Iter, Sent >
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto default_sentinel
Definition default_sentinel.h:6
ChunkByView(Con &&, Pred) -> ChunkByView< meta::AsView< Con >, Pred >
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
constexpr auto not_fn(F &&function)
Definition not_fn.h:55
constexpr auto flip(F &&function)
Definition flip.h:54
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition container_ssize_type.h:8
decltype(container::reconstruct(in_place_type< T >, util::declval< It >(), util::declval< Sent >())) Reconstructed
Definition reconstructed.h:11
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
Definition vocab.h:96
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto in_place_type
Definition in_place_type.h:12
Definition default_sentinel.h:4
Definition iterator_base.h:14