Iros
Loading...
Searching...
No Matches
erase.h
Go to the documentation of this file.
1
#pragma once
2
3
#include "
di/function/curry_back.h
"
4
#include "
di/function/tag_invoke.h
"
5
#include "
di/meta/core.h
"
6
#include "
di/types/integers.h
"
7
#include "
di/util/declval.h
"
8
9
namespace
di::container::erase_ns
{
10
struct
EraseIfFunction
;
11
template
<
typename
Con,
typename
F>
12
concept
CustomEraseIf
=
concepts::TagInvocable<EraseIfFunction, Con&, F>
;
13
14
template
<
typename
Con,
typename
F>
15
concept
MemberEraseIf
=
requires
(Con&
container
, F&&
function
) {
16
{
container
.erase_if(di::forward<F>(
function
)) } -> SameAs<usize>;
17
};
18
19
struct
EraseIfFunction
:
CurryBack
<EraseIfFunction> {
20
template
<
typename
Con,
typename
F>
21
requires
(
CustomEraseIf<Con, F>
||
MemberEraseIf<Con, 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
36
template
<
typename
Con,
typename
T>
37
concept
CustomErase
=
concepts::TagInvocable<EraseIfFunction, Con&, T const&>
;
38
39
template
<
typename
Con,
typename
T>
40
concept
MemberErase
=
requires
(Con&
container
, T
const
& value) {
41
{
container
.erase(value) } -> SameAs<usize>;
42
};
43
44
template
<
typename
Con,
typename
T>
45
concept
EraseIfErase
=
requires
(Con&
container
) {
46
{
47
EraseIfFunction
{}(
container
, [](
auto
const
&) {
48
return
true
;
49
})
50
} -> SameAs<usize>;
51
};
52
53
struct
EraseFunction
:
CurryBack
<EraseFunction> {
54
template
<
typename
Con,
typename
T>
55
requires
(
CustomErase<Con, T>
||
MemberErase<Con, T>
||
EraseIfErase<Con, 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
75
namespace
di::container
{
76
constexpr
inline
auto
erase
=
erase_ns::EraseFunction
{};
77
constexpr
inline
auto
erase_if
=
erase_ns::EraseIfFunction
{};
78
}
79
80
namespace
di
{
81
using
container::erase
;
82
using
container::erase_if
;
83
}
di::concepts::TagInvocable
Definition
tag_invoke.h:33
di::container::erase_ns::CustomEraseIf
Definition
erase.h:12
di::container::erase_ns::CustomErase
Definition
erase.h:37
di::container::erase_ns::EraseIfErase
Definition
erase.h:45
di::container::erase_ns::MemberEraseIf
Definition
erase.h:15
di::container::erase_ns::MemberErase
Definition
erase.h:40
core.h
curry_back.h
declval.h
integers.h
di::container::erase_ns
Definition
erase.h:9
di::container
Definition
sequence.h:12
di::container::erase_if
constexpr auto erase_if
Definition
erase.h:77
di::container::erase
constexpr auto erase
Definition
erase.h:76
di::function
Definition
as_bool.h:8
di::types::usize
size_t usize
Definition
integers.h:33
di
Definition
zstring_parser.h:9
di::tag_invoke
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition
tag_invoke.h:22
di::container::erase_ns::EraseFunction
Definition
erase.h:53
di::container::erase_ns::EraseFunction::max_arity
static constexpr auto max_arity
Definition
erase.h:71
di::container::erase_ns::EraseIfFunction
Definition
erase.h:19
di::container::erase_ns::EraseIfFunction::max_arity
static constexpr auto max_arity
Definition
erase.h:33
di::function::curry_back_ns::CurryBack
Definition
curry_back.h:88
di::function::curry_back_ns::CurryBack::CurryBack
CurryBack()=default
tag_invoke.h
libs
di
include
di
container
interface
erase.h
Generated by
1.13.0