Iros
 
Loading...
Searching...
No Matches
find_end.h
Go to the documentation of this file.
1#pragma once
2
8
9namespace di::container {
10namespace detail {
12 template<concepts::ForwardIterator It, concepts::SentinelFor<It> Sent, concepts::ForwardIterator Jt,
13 concepts::SentinelFor<Jt> Jent, typename Pred = function::Equal, typename Proj = function::Identity,
14 typename Jroj = function::Identity>
16 constexpr auto operator()(It it, Sent ed, Jt jt, Jent fd, Pred pred = {}, Proj proj = {}, Jroj jroj = {}) const
17 -> View<It> {
18 if (jt == fd) {
19 auto last = container::next(it, ed);
20 return { last, last };
21 }
22 if constexpr (concepts::BidirectionalIterator<It> && concepts::SameAs<It, Sent> &&
23 concepts::BidirectionalIterator<Jt> && concepts::SameAs<Jt, Jent>) {
24 auto result =
27 if (!result) {
28 return { ed, ed };
29 }
30 auto [a, b] = result;
31 return { b.base(), a.base() };
32 } else {
33 auto r1 = It {};
34 auto r2 = It {};
35 for (; it != ed; ++it) {
36 auto result =
37 container::mismatch(it, ed, jt, fd, util::ref(pred), util::ref(proj), util::ref(jroj));
38 if (result.in2 == fd) {
39 r1 = it;
40 r2 = util::move(result.in1);
41 }
42 }
43 if (r1 == It {} && r2 == It {}) {
44 return { it, it };
45 }
46 return { util::move(r1), util::move(r2) };
47 }
48 }
49
50 template<concepts::InputContainer Con, concepts::InputContainer Jon, typename Pred = function::Equal,
51 typename Proj = function::Identity, typename Jroj = function::Identity>
52 requires(concepts::IndirectlyComparable<meta::ContainerIterator<Con>, meta::ContainerIterator<Jon>, Pred, Proj,
53 Jroj>)
54 constexpr auto operator()(Con&& con, Jon&& jon, Pred pred = {}, Proj proj = {}, Jroj jroj = {}) const
56 return (*this)(container::begin(con), container::end(con), container::begin(jon), container::end(jon),
57 util::ref(pred), util::ref(proj), util::ref(jroj));
58 }
59 };
60}
61
62constexpr inline auto find_end = detail::FindEndFunction {};
63}
64
65namespace di {
67}
Definition view.h:35
Definition indirectly_comparable.h:10
Definition sequence.h:13
Definition sequence.h:12
constexpr auto next
Definition next.h:35
constexpr auto search
Definition search.h:36
constexpr auto mismatch
Definition mismatch.h:40
constexpr auto make_reverse_iterator(Iter iter)
Definition reverse_iterator.h:110
constexpr auto end
Definition end.h:47
constexpr auto find_end
Definition find_end.h:62
constexpr auto begin
Definition begin.h:44
Conditional< concepts::BorrowedContainer< Con >, container::View< ContainerIterator< Con > >, container::Dangling > BorrowedView
Definition borrowed_view.h:12
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
constexpr auto ref
Definition reference_wrapper.h:98
Definition zstring_parser.h:9
constexpr auto proj
Definition proj.h:59