17 template<
typename Con,
typename Pattern>
23 template<
typename Con>
27template<concepts::InputContainer View, concepts::ForwardContainer Pattern>
34 template<
bool other_is_const>
37 template<
bool is_const>
42 concepts::Reference<meta::ContainerReference<meta::MaybeConst<is_const, View>>> &&
43 concepts::BidirectionalContainer<meta::MaybeConst<is_const, View>> &&
44 detail::BidirectionalCommon<meta::ContainerReference<meta::MaybeConst<is_const, View>>> &&
45 detail::BidirectionalCommon<meta::MaybeConst<is_const, Pattern>>,
46 BidirectionalIteratorTag,
48 concepts::Reference<meta::ContainerReference<meta::MaybeConst<is_const, View>>> &&
49 concepts::ForwardIterator<meta::ContainerIterator<meta::MaybeConst<is_const, View>>> &&
50 concepts::ForwardIterator<
51 meta::ContainerIterator<meta::ContainerReference<meta::MaybeConst<is_const, View>>>>,
52 ForwardIteratorTag, InputIteratorTag>>,
53 meta::CommonType<meta::ContainerValue<meta::ContainerReference<meta::MaybeConst<is_const, View>>>,
54 meta::ContainerValue<meta::MaybeConst<is_const, Pattern>>>,
55 meta::CommonType<meta::ContainerSSizeType<meta::MaybeConst<is_const, View>>,
56 meta::ContainerSSizeType<meta::ContainerReference<meta::MaybeConst<is_const, View>>>,
57 meta::ContainerSSizeType<meta::MaybeConst<is_const, Pattern>>>> {
70 constexpr Iterator(Parent& parent, OuterIter outer)
71 : m_parent(util::addressof(parent)), m_outer(util::move(outer)) {
73 auto&& inner = this->update_inner(m_outer);
84 Iterator(Iterator
const&) =
delete;
85 auto operator=(Iterator
const&) -> Iterator& =
delete;
87 Iterator(Iterator
const&)
90 auto operator=(Iterator
const&) -> Iterator&
requires(
93 Iterator(Iterator&&) =
default;
94 auto operator=(Iterator&&) -> Iterator& =
default;
96 constexpr Iterator(Iterator<!is_const> other)
100 : m_parent(other.m_parent), m_outer(util::move(other.m_outer)), m_inner(util::move(other.m_inner)) {}
102 constexpr auto operator*()
const ->
decltype(
auto) {
106 [](
auto& it) -> Reference {
112 constexpr void advance_one() {
121 constexpr void back_one()
126 auto&& inner = *--m_outer;
131 if (m_inner.index() == 0) {
134 auto&& inner = *--m_outer;
141 auto&& inner = *m_outer;
157 constexpr auto outer()
const -> OuterIter
const& {
return m_outer; }
160 template<
bool other_is_const>
161 friend class Iterator;
163 template<
bool other_is_const>
164 friend class Sentinel;
168 constexpr auto update_inner(OuterIter
const& x) ->
auto&& {
169 if constexpr (ref_is_glvalue) {
172 return m_parent->m_inner.value.emplace_deref(x);
176 constexpr auto get_inner(OuterIter
const& x) ->
auto&& {
177 if constexpr (ref_is_glvalue) {
180 return *m_parent->m_inner.value;
184 constexpr void satisfy() {
186 if (m_inner.index() == 0) {
193 auto&& inner = this->get_inner(m_outer);
199 if constexpr (ref_is_glvalue) {
200 m_inner.template emplace<0>();
210 constexpr friend auto operator==(Iterator
const& x, Iterator
const& y) ->
bool
213 return x.m_outer == y.m_outer && x.m_inner == y.m_inner;
227 Parent* m_parent {
nullptr };
228 OuterIter m_outer {};
232 template<
bool is_const>
238 constexpr explicit Sentinel(Parent& parent) : m_base(
container::end(parent.m_base)) {}
241 Sentinel() =
default;
243 constexpr Sentinel(Sentinel<!is_const> other)
245 : m_base(util::move(other.m_base)) {}
248 template<
bool other_is_const>
249 friend class Iterator;
251 template<
bool other_is_const>
252 friend class Sentinel;
256 template<
bool other_is_const>
259 constexpr friend auto operator==(Iterator<other_is_const>
const& x, Sentinel
const& y) ->
bool {
260 return x.outer() == y.m_base;
273 template<concepts::InputContainer Con>
284 constexpr auto base() && ->
View {
return util::move(m_base); }
287 constexpr bool is_const =
310 constexpr auto end() const
319 return Sentinel<true>(*
this);
324 template<
bool is_const>
325 friend class Iterator;
333template<
typename Con,
typename Pattern>
336template<concepts::InputContainer Con>
Definition join_with_view.h:30
constexpr JoinWithView(View base, Pattern pattern)
Definition join_with_view.h:271
constexpr auto begin() const
Definition join_with_view.h:292
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition join_with_view.h:279
constexpr auto base() &&-> View
Definition join_with_view.h:284
constexpr auto end() const
Definition join_with_view.h:310
constexpr auto end()
Definition join_with_view.h:299
constexpr JoinWithView(Con &&container, meta::ContainerValue< InnerContainer > value)
Definition join_with_view.h:276
constexpr auto begin()
Definition join_with_view.h:286
Definition single_view.h:15
Definition view_interface.h:26
Definition variant_forward_declaration.h:6
Definition bidirectional_container.h:8
Definition common_container.h:10
Definition operations.h:11
Definition operations.h:99
Definition operations.h:27
Definition forward_container.h:8
Definition forward_iterator.h:10
Definition indirectly_swappable.h:7
Definition sentinel_for.h:9
Definition simple_view.h:11
Definition join_with_view.h:24
Definition join_with_view.h:18
Definition any_storable.h:9
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto move
Definition move.h:38
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto iterator_swap
Definition iterator_swap.h:49
JoinWithView(Con &&, Pattern &&) -> JoinWithView< meta::AsView< Con >, meta::AsView< Pattern > >
constexpr auto end
Definition end.h:47
auto tag_invoke(types::Tag< util::deduce_create >, InPlaceTemplate< NodeHashMap >, Con &&) -> NodeHashMap< meta::TupleElement< T, 0 >, meta::TupleElement< T, 1 > >
constexpr auto begin
Definition begin.h:44
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
Definition iterator_base.h:14