Iros
 
Loading...
Searching...
No Matches
elements_view.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/meta/core.h"
10#include "di/meta/util.h"
11#include "di/util/move.h"
13
14namespace di::container {
15namespace detail {
16 template<typename T, size_t index>
18}
19
20template<concepts::InputContainer View, size_t index>
24 : public ViewInterface<ElementsView<View, index>>
25 , public meta::EnableBorrowedContainer<ElementsView<View, index>, concepts::BorrowedContainer<View>> {
26private:
27 template<bool is_const>
29
30 template<bool is_const>
32
33 template<bool is_const>
35
36 template<bool is_const>
37 class Iterator
38 : public IteratorExtension<Iterator<is_const>, Iter<is_const>,
39 meta::RemoveCVRef<meta::TupleElement<Value<is_const>, index>>> {
40 using Base = IteratorExtension<Iterator<is_const>, Iter<is_const>,
42
43 public:
44 Iterator()
46 = default;
47
48 constexpr explicit Iterator(Iter<is_const> base) : Base(util::move(base)) {}
49
50 constexpr Iterator(Iterator<!is_const> other)
51 requires(is_const && concepts::ConvertibleTo<Iter<false>, Iter<true>>)
52 : Base(util::move(other).base()) {}
53
54 constexpr auto operator*() const -> decltype(auto) {
56 return util::get<index>(*this->base());
57 } else {
59 return static_cast<R>(util::get<index>(*this->base()));
60 }
61 }
62 };
63
64 template<bool is_const>
65 class Sentinel : public SentinelExtension<Sentinel<is_const>, Sent<is_const>, Iterator<is_const>, Iter<is_const>> {
66 private:
67 using Base = SentinelExtension<Sentinel<is_const>, Sent<is_const>, Iterator<is_const>, Iter<is_const>>;
68
69 public:
70 Sentinel() = default;
71
72 constexpr explicit Sentinel(Sent<is_const> base) : Base(base) {}
73
74 constexpr Sentinel(Sentinel<!is_const> other)
75 requires(is_const && concepts::ConvertibleTo<Sent<false>, Sent<true>>)
76 : Base(other.base()) {}
77 };
78
79public:
82 = default;
83
84 constexpr explicit ElementsView(View base) : m_base(util::move(base)) {}
85
86 constexpr auto base() const& -> View
87 requires(concepts::CopyConstructible<View>)
88 {
89 return m_base;
90 }
91 constexpr auto base() && -> View { return util::move(m_base); }
92
93 constexpr auto begin()
95 {
96 return Iterator<false>(container::begin(m_base));
97 }
98
99 constexpr auto begin() const
100 requires(concepts::Container<View const>)
101 {
102 return Iterator<true>(container::begin(m_base));
103 }
104
105 constexpr auto end()
107 {
108 if constexpr (!concepts::CommonContainer<View>) {
109 return Sentinel<false>(container::end(m_base));
110 } else {
111 return Iterator<false>(container::end(m_base));
112 }
113 }
114
115 constexpr auto end() const
116 requires(concepts::Container<View const>)
117 {
119 return Sentinel<true>(container::end(m_base));
120 } else {
121 return Iterator<true>(container::end(m_base));
122 }
123 }
124
125 constexpr auto size()
127 {
128 return container::size(m_base);
129 }
130 constexpr auto size() const
131 requires(concepts::SizedContainer<View const>)
132 {
133 return container::size(m_base);
134 }
135
136private:
137 View m_base {};
138};
139}
constexpr auto end() const
Definition elements_view.h:115
constexpr auto base() &&-> View
Definition elements_view.h:91
constexpr auto begin()
Definition elements_view.h:93
constexpr auto size()
Definition elements_view.h:125
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition elements_view.h:86
constexpr auto begin() const
Definition elements_view.h:99
constexpr auto size() const
Definition elements_view.h:130
constexpr ElementsView(View base)
Definition elements_view.h:84
constexpr auto end()
Definition elements_view.h:105
Definition iterator_extension.h:19
Definition sentinel_extension.h:10
constexpr auto base() const -> Sent
Definition sentinel_extension.h:16
Definition view_interface.h:26
Definition view.h:35
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition operations.h:43
Definition language.h:50
Definition simple_view.h:11
Definition sized_container.h:8
Definition tuple_like.h:38
Definition view.h:10
Definition elements_view.h:17
Definition any_storable.h:9
Definition sequence.h:13
Definition sequence.h:12
constexpr auto move
Definition move.h:38
constexpr auto size
Definition size.h:54
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
Definition merge_interfaces.h:6
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
RemoveConst< RemoveVolatile< T > > RemoveCV
Definition core.h:57
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
Definition vocab.h:96
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
Definition enable_borrowed_container.h:9