Iros
 
Loading...
Searching...
No Matches
copy_backward.h
Go to the documentation of this file.
1#pragma once
2
7
8namespace di::container {
9namespace detail {
11 template<concepts::BidirectionalIterator It, concepts::SentinelFor<It> Sent,
12 concepts::BidirectionalIterator Out>
14 constexpr auto operator()(It first, Sent last, Out output) const -> InOutResult<It, Out> {
15 // FIXME: use vectorized byte copy (::memcpy_backwards) when provided contiguous
16 // iterators to trivially copyable types.
17 auto last_it = container::next(first, last);
18 for (auto it = last_it; it != first;) {
19 *--output = *--it;
20 }
21 return { util::move(last_it), util::move(output) };
22 }
23
24 template<concepts::BidirectionalContainer Con, concepts::BidirectionalIterator Out>
26 constexpr auto operator()(Con&& container, Out output) const -> InOutResult<meta::BorrowedIterator<Con>, Out> {
27 return (*this)(container::begin(container), container::end(container), util::move(output));
28 }
29 };
30}
31
33}
34
35namespace di {
37}
Definition indirectly_copyable.h:9
Definition sequence.h:13
Definition sequence.h:12
constexpr auto next
Definition next.h:35
constexpr auto copy_backward
Definition copy_backward.h:32
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
Conditional< concepts::BorrowedContainer< Con >, ContainerIterator< Con >, container::Dangling > BorrowedIterator
Definition borrowed_iterator.h:11
Definition zstring_parser.h:9
Definition in_out_result.h:8
Definition copy_backward.h:10