Iros
 
Loading...
Searching...
No Matches
adjacent_transform_view.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/constexpr.h"
9
10namespace di::container {
11namespace detail {
12 template<typename F, typename P>
14
15 template<typename F, typename... Rs>
16 requires(concepts::Invocable<F, Rs...>)
18 using Type = meta::InvokeResult<F, Rs...>;
19 };
20
21 template<typename F, typename V, size_t N>
23
24 template<typename F, typename V, size_t N>
26}
27
28template<concepts::InputContainer View, concepts::MoveConstructible F, size_t N>
32private:
33 using InnerView = AdjacentView<View, N>;
34
35 template<bool is_const>
37
38 template<bool is_const>
40
41 template<bool is_const>
42 class Sentinel;
43
44 template<bool is_const>
45 class Iterator;
46
47 template<bool is_const>
48 class Sentinel
49 : public SentinelExtension<Sentinel<is_const>, InnerSentinel<is_const>, Iterator<is_const>,
50 InnerIterator<is_const>> {
51 private:
52 using Base =
53 SentinelExtension<Sentinel<is_const>, InnerSentinel<is_const>, Iterator<is_const>, InnerIterator<is_const>>;
54
55 friend class AdjacentTransformView;
56
57 constexpr explicit Sentinel(InnerSentinel<is_const> sentinel) : Base(sentinel) {}
58
59 public:
60 constexpr Sentinel() = default;
61
62 constexpr Sentinel(Sentinel<!is_const> other)
63 requires(is_const && concepts::ConvertibleTo<InnerSentinel<is_const>, InnerSentinel<!is_const>>)
64 : Base(other.base()) {}
65 };
66
67 template<bool is_const>
68 class Iterator
69 : public IteratorExtension<
70 Iterator<is_const>, InnerIterator<is_const>,
71 meta::RemoveCVRef<detail::InvokeRepeatResult<
72 meta::MaybeConst<is_const, F>&, meta::ContainerReference<meta::MaybeConst<is_const, View>>, N>>> {
73 using Base = IteratorExtension<
74 Iterator<is_const>, InnerIterator<is_const>,
77
78 friend class AdjacentTransformView;
79
80 constexpr explicit Iterator(meta::MaybeConst<is_const, AdjacentTransformView>& parent,
81 InnerIterator<is_const> iterator)
82 : Base(util::move(iterator)), m_parent(util::addressof(parent)) {}
83
84 public:
85 Iterator()
87 = default;
88
89 constexpr Iterator(Iterator<!is_const> other)
90 requires(is_const && concepts::ConvertibleTo<InnerIterator<is_const>, InnerIterator<!is_const>>)
91 : Base(util::move(other).base()), m_parent(other.m_parent) {}
92
93 constexpr auto operator*() const -> decltype(auto) {
94 return apply(
95 [&](auto const&... iters) -> decltype(auto) {
96 return function::invoke(m_parent->m_function.value(), *iters...);
97 },
98 this->base().iterators());
99 }
100
101 private:
102 template<bool>
103 friend class Iterator;
104
105 constexpr friend auto tag_invoke(types::Tag<iterator_move>, Iterator const& self) -> decltype(auto) {
106 if constexpr (concepts::LValueReference<decltype(*self)>) {
107 return util::move(*self);
108 } else {
109 return *self;
110 }
111 }
112
114 };
115
116public:
118
120 : m_inner(util::move(view)), m_function(util::move(function)) {}
121
122 constexpr auto begin() { return Iterator<false>(*this, m_inner.begin()); }
123
124 constexpr auto begin() const
125 requires(concepts::Container<InnerView const> &&
126 detail::CanInvokeRepeat<F const&, meta::ContainerReference<View const>, N>)
127 {
128 return Iterator<true>(*this, m_inner.begin());
129 }
130
131 constexpr auto end() {
133 return Iterator<false>(*this, m_inner.end());
134 } else {
135 return Sentinel<false>(m_inner.end());
136 }
137 }
138
139 constexpr auto end() const
140 requires(concepts::Container<InnerView const> &&
141 detail::CanInvokeRepeat<F const&, meta::ContainerReference<View const>, N>)
142 {
144 return Iterator<true>(*this, m_inner.end());
145 } else {
146 return Sentinel<true>(m_inner.end());
147 }
148 }
149
150 constexpr auto size()
152 {
153 return m_inner.size();
154 }
155
156 constexpr auto size() const
157 requires(concepts::SizedContainer<InnerView const>)
158 {
159 return m_inner.size();
160 }
161
162private:
163 InnerView m_inner;
164 util::RebindableBox<F> m_function;
165};
166}
constexpr auto size()
Definition adjacent_transform_view.h:150
constexpr auto end() const
Definition adjacent_transform_view.h:139
constexpr AdjacentTransformView(View view, F function)
Definition adjacent_transform_view.h:119
constexpr auto begin() const
Definition adjacent_transform_view.h:124
constexpr auto begin()
Definition adjacent_transform_view.h:122
constexpr auto end()
Definition adjacent_transform_view.h:131
constexpr auto size() const
Definition adjacent_transform_view.h:156
Definition adjacent_view.h:20
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 rebindable_box.h:42
Definition operations.h:133
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition invoke.h:58
Definition language.h:30
Definition sized_container.h:8
Definition view.h:10
Definition adjacent_transform_view.h:22
Definition any_storable.h:9
Definition sequence.h:13
CanInvokeRepeatHelper< F, meta::Repeat< V, N > >::Type InvokeRepeatResult
Definition adjacent_transform_view.h:25
Definition adjacent.h:8
Definition sequence.h:12
constexpr auto move
Definition move.h:38
auto tag_invoke(types::Tag< util::deduce_create >, InPlaceTemplate< NodeHashMap >, Con &&) -> NodeHashMap< meta::TupleElement< T, 0 >, meta::TupleElement< T, 1 > >
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
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
IteratorReference< ContainerIterator< T > > ContainerReference
Definition container_reference.h:8
Conditional< is_const, T const, T > MaybeConst
Definition util.h:9
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
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
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
Definition adjacent_transform_view.h:13
meta::InvokeResult< F, Rs... > Type
Definition adjacent_transform_view.h:18
A wrapper for a constexpr value.
Definition core.h:77
Definition core.h:5