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&
72 requires(IsForward<Base<is_const>>)
75 Iterator(Iterator&&) =
default;
76 auto operator=(Iterator&&) -> Iterator& =
default;
78 constexpr Iterator(Parent& parent, Outer outer)
79 : m_parent(util::addressof(parent)), m_outer(util::move(outer)) {
83 constexpr Iterator(Iterator<!is_const> other)
86 : m_parent(other.m_parent), m_outer(util::move(other.m_outer)), m_inner(util::move(other.m_outer)) {}
88 constexpr auto operator*()
const ->
decltype(
auto) {
return *m_inner; }
90 constexpr auto operator->()
const -> Inner
91 requires(
requires(Inner
const i) { i.operator->(); })
96 constexpr auto outer()
const -> Outer
const& {
return m_outer; }
98 constexpr void advance_one() {
99 auto&& inner_container = [&]() ->
auto&& {
100 if constexpr (ref_is_glvalue) {
103 return *m_parent->m_inner.value;
113 constexpr void back_one()
114 requires(IsBidirectional<Base<is_const>>)
126 template<
bool other_is_const>
127 friend class Iterator;
129 constexpr void satisfy() {
131 if constexpr (ref_is_glvalue) {
134 return m_parent->m_inner.value.emplace_deref(x);
139 auto&& inner = update_inner(m_outer);
146 if constexpr (ref_is_glvalue) {
151 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
154 return a.m_outer == b.m_outer && a.m_inner == b.m_inner;
167 Parent* m_parent {
nullptr };
172 template<
bool is_const>
178 Sentinel() =
default;
180 constexpr explicit Sentinel(Parent& parent) : m_base(
container::end(parent.m_base)) {}
182 constexpr Sentinel(Sentinel<!is_const> other)
184 : m_base(other.base()) {}
186 constexpr auto base()
const {
return m_base; }
189 constexpr friend auto operator==(Iterator<is_const>
const& a, Sentinel
const& b) ->
bool {
190 return a.outer() == b.m_base;
193 Sent<is_const> m_base;
208 constexpr auto base() && ->
View {
return util::move(m_base); }
223 if constexpr (IsCommon<View>) {
224 return Iterator<concepts::SimpleView<View>>(*
this,
container::end(m_base));
226 return Sentinel<concepts::SimpleView<View>>(*this);
230 constexpr auto end() const
233 if constexpr (IsCommon<View const>) {
236 return Sentinel<true>(*
this);
241 template<
bool is_const>
242 friend class Iterator;
250template<
typename Con>
Definition join_view.h:15
constexpr auto end()
Definition join_view.h:222
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition join_view.h:203
constexpr JoinView(View base)
Definition join_view.h:201
constexpr auto base() &&-> View
Definition join_view.h:208
constexpr auto end() const
Definition join_view.h:230
constexpr auto begin() const
Definition join_view.h:216
constexpr auto begin()
Definition join_view.h:210
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:55
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:52
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition iterator_base.h:14