Iros
 
Loading...
Searching...
No Matches
transform.h
Go to the documentation of this file.
1#pragma once
2
8
9namespace di::container {
10namespace detail {
12 template<concepts::InputIterator It, concepts::SentinelFor<It> Sent, concepts::WeaklyIncrementable Out,
13 concepts::CopyConstructible F, typename Proj = function::Identity>
15 constexpr auto operator()(It first, Sent last, Out output, F op, Proj proj = {}) const -> InOutResult<It, Out> {
16 for (; first != last; ++first, ++output) {
17 *output = function::invoke(op, function::invoke(proj, *first));
18 }
19 return { util::move(first), util::move(output) };
20 }
21
22 template<concepts::InputContainer Con, concepts::WeaklyIncrementable Out, concepts::CopyConstructible F,
23 typename Proj = function::Identity>
24 requires(concepts::IndirectlyWritable<
26 constexpr auto operator()(Con&& container, Out output, F op, Proj proj = {}) const
28 return (*this)(container::begin(container), container::end(container), util::move(output), util::ref(op),
30 }
31
32 template<concepts::InputIterator It1, concepts::SentinelFor<It1> Sent1, concepts::InputIterator It2,
33 concepts::SentinelFor<It2> Sent2, concepts::WeaklyIncrementable Out, concepts::CopyConstructible F,
34 typename Proj1 = function::Identity, typename Proj2 = function::Identity>
37 constexpr auto operator()(It1 first1, Sent1 last1, It2 first2, Sent2 last2, Out output, F op, Proj1 proj1 = {},
38 Proj2 proj2 = {}) const -> InInOutResult<It1, It2, Out> {
39 for (; first1 != last1 && first2 != last2; ++first1, ++first2, ++output) {
40 *output = function::invoke(op, function::invoke(proj1, *first1), function::invoke(proj2, *first2));
41 }
42 return { util::move(first1), util::move(first2), util::move(output) };
43 }
44
45 template<concepts::InputContainer Con1, concepts::InputContainer Con2, concepts::WeaklyIncrementable Out,
46 concepts::CopyConstructible F, typename Proj1 = function::Identity,
47 typename Proj2 = function::Identity>
48 requires(concepts::IndirectlyWritable<
50 meta::Projected<meta::ContainerIterator<Con2>, Proj2>>>)
51 constexpr auto transform(Con1&& r1, Con2&& r2, Out output, F op, Proj1 proj1 = {}, Proj2 proj2 = {})
53 return (*this)(container::begin(r1), container::end(r1), container::begin(r2), container::end(r2),
54 util::move(output), util::ref(op), util::ref(proj1), util::ref(proj2));
55 }
56 };
57}
58
59constexpr inline auto transform = detail::TransformFunction {};
60}
Definition indirectly_writable.h:8
Definition sequence.h:13
concept F
Definition zip_transform.h:12
Definition sequence.h:12
constexpr auto end
Definition end.h:47
constexpr auto transform
Definition transform.h:59
constexpr auto begin
Definition begin.h:44
constexpr auto invoke
Definition invoke.h:100
Conditional< concepts::BorrowedContainer< Con >, ContainerIterator< Con >, container::Dangling > BorrowedIterator
Definition borrowed_iterator.h:11
InvokeResult< F, meta::IteratorReference< Its >... > IndirectResult
Definition indirect_result.h:10
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto proj
Definition proj.h:59
Definition in_in_out_result.h:8
Definition in_out_result.h:8
constexpr auto transform(Con1 &&r1, Con2 &&r2, Out output, F op, Proj1 proj1={}, Proj2 proj2={}) -> InInOutResult< meta::BorrowedIterator< Con1 >, meta::BorrowedIterator< Con2 >, Out >
Definition transform.h:51
Definition projected.h:16