13template<concepts::InputContainer View>
14requires(concepts::View<View> && concepts::InputContainer<meta::ContainerReference<View>>)
17 template<
bool is_const>
20 template<
bool is_const>
23 template<
bool is_const>
26 template<
bool is_const>
30 template<
typename Con>
31 constexpr static bool IsCommon =
36 template<
typename Con>
37 constexpr static bool IsBidirectional =
41 template<
typename Con>
42 constexpr static bool IsForward =
46 template<
bool is_const>
50 meta::Conditional<IsBidirectional<Base<is_const>>, BidirectionalIteratorTag,
51 meta::Conditional<IsForward<Base<is_const>>, ForwardIteratorTag, InputIteratorTag>>,
52 Value<is_const>, SSizeType<is_const>> {
65 Iterator(Iterator
const&) =
delete;
66 auto operator=(Iterator
const&) -> Iterator& =
delete;
68 Iterator(Iterator
const&)
69 requires(IsForward<Base<is_const>>)
71 auto operator=(Iterator
const&) -> Iterator&
requires(IsForward<Base<is_const>>) =
default;
73 Iterator(Iterator&&) =
default;
74 auto operator=(Iterator&&) -> Iterator& =
default;
76 constexpr Iterator(Parent& parent, Outer outer)
77 : m_parent(util::addressof(parent)), m_outer(util::move(outer)) {
81 constexpr Iterator(Iterator<!is_const> other)
84 : m_parent(other.m_parent), m_outer(util::move(other.m_outer)), m_inner(util::move(other.m_outer)) {}
86 constexpr auto operator*()
const ->
decltype(
auto) {
return *m_inner; }
88 constexpr auto operator->()
const -> Inner
89 requires(
requires(Inner
const i) { i.operator->(); })
94 constexpr auto outer()
const -> Outer
const& {
return m_outer; }
96 constexpr void advance_one() {
97 auto&& inner_container = [&]() ->
auto&& {
98 if constexpr (ref_is_glvalue) {
101 return *m_parent->m_inner.value;
111 constexpr void back_one()
112 requires(IsBidirectional<Base<is_const>>)
124 template<
bool other_is_const>
125 friend class Iterator;
127 constexpr void satisfy() {
129 if constexpr (ref_is_glvalue) {
132 return m_parent->m_inner.value.emplace_deref(x);
137 auto&& inner = update_inner(m_outer);
144 if constexpr (ref_is_glvalue) {
149 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
152 return a.m_outer == b.m_outer && a.m_inner == b.m_inner;
165 Parent* m_parent {
nullptr };
170 template<
bool is_const>
176 Sentinel() =
default;
178 constexpr explicit Sentinel(Parent& parent) : m_base(
container::end(parent.m_base)) {}
180 constexpr Sentinel(Sentinel<!is_const> other)
182 : m_base(other.base()) {}
184 constexpr auto base()
const {
return m_base; }
187 constexpr friend auto operator==(Iterator<is_const>
const& a, Sentinel
const& b) ->
bool {
188 return a.outer() == b.m_base;
191 Sent<is_const> m_base;
206 constexpr auto base() && ->
View {
return util::move(m_base); }
221 if constexpr (IsCommon<View>) {
222 return Iterator<concepts::SimpleView<View>>(*
this,
container::end(m_base));
224 return Sentinel<concepts::SimpleView<View>>(*this);
228 constexpr auto end() const
231 if constexpr (IsCommon<View const>) {
234 return Sentinel<true>(*
this);
239 template<
bool is_const>
240 friend class Iterator;
248template<
typename Con>
Definition join_view.h:15
constexpr auto end()
Definition join_view.h:220
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition join_view.h:201
constexpr JoinView(View base)
Definition join_view.h:199
constexpr auto base() &&-> View
Definition join_view.h:206
constexpr auto end() const
Definition join_view.h:228
constexpr auto begin() const
Definition join_view.h:214
constexpr auto begin()
Definition join_view.h:208
Definition view_interface.h:26
Definition bidirectional_container.h:8
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition forward_container.h:8
Definition indirectly_swappable.h:7
Definition simple_view.h:11
Definition any_storable.h:9
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto move
Definition move.h:38
JoinView(Con &&) -> JoinView< meta::AsView< Con > >
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
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
Definition iterator_base.h:14