Iros
 
Loading...
Searching...
No Matches
erase.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/core.h"
6#include "di/types/integers.h"
7#include "di/util/declval.h"
8
10struct EraseIfFunction;
11template<typename Con, typename F>
13
14template<typename Con, typename F>
15concept MemberEraseIf = requires(Con& container, F&& function) {
16 { container.erase_if(di::forward<F>(function)) } -> SameAs<usize>;
17};
18
19struct EraseIfFunction : CurryBack<EraseIfFunction> {
20 template<typename Con, typename F>
22 constexpr auto operator()(Con& container, F&& function) const -> usize {
23 if constexpr (CustomEraseIf<Con, F>) {
24 static_assert(SameAs<usize, meta::TagInvokeResult<EraseIfFunction, Con&, F>>,
25 "Customizations of di::erase_if() must return usize.");
26 return tag_invoke(*this, container, di::forward<F>(function));
27 } else {
28 return container.erase_if(di::forward<F>(function));
29 }
30 }
31
32 using CurryBack<EraseIfFunction>::operator();
33 constexpr static auto max_arity = 2ZU;
34};
35
36template<typename Con, typename T>
38
39template<typename Con, typename T>
40concept MemberErase = requires(Con& container, T const& value) {
41 { container.erase(value) } -> SameAs<usize>;
42};
43
44template<typename Con, typename T>
45concept EraseIfErase = requires(Con& container) {
46 {
47 EraseIfFunction {}(container, [](auto const&) {
48 return true;
49 })
50 } -> SameAs<usize>;
51};
52
53struct EraseFunction : CurryBack<EraseFunction> {
54 template<typename Con, typename T>
56 constexpr auto operator()(Con& container, T const& value) const -> usize {
57 if constexpr (CustomErase<Con, T>) {
58 static_assert(SameAs<usize, meta::TagInvokeResult<EraseIfFunction, Con&, T const&>>,
59 "Customizations of di::erase() must return usize.");
60 return tag_invoke(*this, container, value);
61 } else if constexpr (MemberErase<Con, T>) {
62 return container.erase(value);
63 } else {
64 return EraseIfFunction {}(container, [&](auto const& element) {
65 return element == value;
66 });
67 }
68 }
69
70 using CurryBack<EraseFunction>::operator();
71 constexpr static auto max_arity = 2ZU;
72};
73}
74
75namespace di::container {
76constexpr inline auto erase = erase_ns::EraseFunction {};
77constexpr inline auto erase_if = erase_ns::EraseIfFunction {};
78}
79
80namespace di {
83}
Definition tag_invoke.h:33
Definition erase.h:9
Definition sequence.h:12
constexpr auto erase_if
Definition erase.h:77
constexpr auto erase
Definition erase.h:76
Definition as_bool.h:8
size_t usize
Definition integers.h:33
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
static constexpr auto max_arity
Definition erase.h:71
static constexpr auto max_arity
Definition erase.h:33
Definition curry_back.h:88