Iros
 
Loading...
Searching...
No Matches
transform_view.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/function/invoke.h"
11#include "di/meta/core.h"
12#include "di/meta/language.h"
13#include "di/meta/operations.h"
14#include "di/meta/util.h"
15#include "di/util/move.h"
17
18namespace di::container {
19template<concepts::InputContainer View, concepts::MoveConstructible F>
20requires(concepts::View<View> && concepts::Object<F> && concepts::Invocable<F&, meta::ContainerReference<View>> &&
21 concepts::CanReference<meta::InvokeResult<F&, meta::ContainerReference<View>>>)
23private:
24 template<bool is_const>
26
27 template<bool is_const>
29
30 template<bool is_const>
32
33 template<bool is_const>
35
36 template<bool is_const>
38
39 template<bool is_const>
40 class Sentinel;
41
42 template<bool is_const>
43 class Iterator;
44
45 template<bool is_const>
46 class Sentinel : public SentinelExtension<Sentinel<is_const>, Sent<is_const>, Iterator<is_const>, Iter<is_const>> {
47 private:
48 using Base = SentinelExtension<Sentinel<is_const>, Sent<is_const>, Iterator<is_const>, Iter<is_const>>;
49
50 public:
51 constexpr Sentinel() = default;
52
53 constexpr explicit Sentinel(Sent<is_const> sentinel) : Base(sentinel) {}
54
55 constexpr Sentinel(Sentinel<!is_const> other)
56 requires(is_const && concepts::ConvertibleTo<Sent<is_const>, Sent<!is_const>>)
57 : Base(other.base()) {}
58 };
59
60 template<bool is_const>
61 class Iterator
62 : public IteratorExtension<Iterator<is_const>, Iter<is_const>,
63 meta::RemoveCVRef<meta::InvokeResult<meta::MaybeConst<is_const, F>&,
64 meta::IteratorReference<Iter<is_const>>>>> {
65 using Base = IteratorExtension<Iterator<is_const>, Iter<is_const>,
68
69 public:
70 Iterator()
72 = default;
73
74 constexpr explicit Iterator(Parent<is_const>& parent, Iter<is_const> iterator)
75 : Base(util::move(iterator)), m_parent(util::addressof(parent)) {}
76
77 constexpr Iterator(Iterator<!is_const> other)
78 requires(is_const && concepts::ConvertibleTo<Iter<is_const>, Iter<!is_const>>)
79 : Base(util::move(other.base())), m_parent(other.m_parent) {}
80
81 constexpr auto operator*() const -> decltype(auto) {
82 return function::invoke(m_parent->m_function.value(), *this->base());
83 }
84
85 private:
86 template<bool>
87 friend class Iterator;
88
89 constexpr friend auto tag_invoke(types::Tag<iterator_move>, Iterator const& self) -> decltype(auto) {
90 if constexpr (concepts::LValueReference<decltype(*self)>) {
91 return util::move(*self);
92 } else {
93 return *self;
94 }
95 }
96
97 Parent<is_const>* m_parent { nullptr };
98 };
99
100public:
101 constexpr TransformView()
103 = default;
104
105 constexpr TransformView(View base, F function) : m_base(util::move(base)), m_function(util::move(function)) {}
106
107 constexpr auto base() const& -> View
108 requires(concepts::CopyConstructible<View>)
109 {
110 return m_base;
111 }
112
113 constexpr auto base() && -> View { return util::move(m_base); }
114
115 constexpr auto begin() { return Iterator<false>(*this, container::begin(m_base)); }
116
117 constexpr auto begin() const
118 requires(concepts::Container<View const> && concepts::Invocable<F const&, meta::ContainerReference<View const>>)
119 {
120 return Iterator<true>(*this, container::begin(m_base));
121 }
122
123 constexpr auto end() { return Sentinel<false>(container::end(m_base)); }
124 constexpr auto end()
126 {
127 return Iterator<false>(*this, container::end(m_base));
128 }
129
130 constexpr auto end() const
131 requires(concepts::Container<View const> && concepts::Invocable<F const&, meta::ContainerReference<View const>>)
132 {
133 return Sentinel<true>(container::end(m_base));
134 }
135
136 constexpr auto end() const
137 requires(concepts::CommonContainer<View> && concepts::Container<View const> &&
138 concepts::Invocable<F const&, meta::ContainerReference<View const>>)
139 {
140 return Iterator<true>(*this, container::end(m_base));
141 }
142
143 constexpr auto size()
145 {
146 return container::size(m_base);
147 }
148
149 constexpr auto size() const
150 requires(concepts::SizedContainer<View const>)
151 {
152 return container::size(m_base);
153 }
154
155private:
156 View m_base {};
157 util::RebindableBox<F> m_function {};
158};
159
160template<typename Con, typename F>
162}
Definition iterator_extension.h:19
constexpr auto base() const &-> Iter const &
Definition iterator_extension.h:30
Definition sentinel_extension.h:10
constexpr auto base() const -> Sent
Definition sentinel_extension.h:16
Definition transform_view.h:22
constexpr auto size()
Definition transform_view.h:143
constexpr auto size() const
Definition transform_view.h:149
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition transform_view.h:107
constexpr auto end()
Definition transform_view.h:123
constexpr auto end()
Definition transform_view.h:124
constexpr auto end() const
Definition transform_view.h:136
constexpr TransformView(View base, F function)
Definition transform_view.h:105
constexpr TransformView()=default
constexpr auto begin() const
Definition transform_view.h:117
constexpr auto begin()
Definition transform_view.h:115
constexpr auto base() &&-> View
Definition transform_view.h:113
constexpr auto end() const
Definition transform_view.h:130
Definition view_interface.h:26
Definition view.h:35
Definition rebindable_box.h:42
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition language.h:30
Definition sized_container.h:8
Definition any_storable.h:9
Definition sequence.h:12
TransformView(Con &&, F) -> TransformView< meta::AsView< Con >, F >
constexpr auto move
Definition move.h:38
constexpr auto size
Definition size.h:54
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
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
Definition merge_interfaces.h:6
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition container_ssize_type.h:8
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
Conditional< is_const, T const, T > MaybeConst
Definition util.h:9
decltype(*util::declval< T const & >()) IteratorReference
Definition iterator_reference.h:7
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96