Iros
Loading...
Searching...
No Matches
count.h
Go to the documentation of this file.
1
#pragma once
2
3
#include "
di/container/concepts/prelude.h
"
4
#include "
di/container/meta/prelude.h
"
5
#include "
di/function/equal.h
"
6
#include "
di/function/identity.h
"
7
#include "
di/function/invoke.h
"
8
#include "
di/util/reference_wrapper.h
"
9
10
namespace
di::container
{
11
namespace
detail
{
12
struct
CountFunction
{
13
template
<concepts::InputIterator Iter, concepts::SentinelFor<Iter> Sent,
typename
T,
14
typename
Proj = function::Identity>
15
requires
(
concepts::IndirectBinaryPredicate<function::Equal, meta::Projected<Iter, Proj>
, T
const
*>)
16
constexpr
auto
operator
()(Iter first, Sent last, T
const
& needle, Proj
proj
= {})
const
17
->
meta::IteratorSSizeType<Iter>
{
18
auto
result =
meta::IteratorSSizeType<Iter>
{ 0 };
19
for
(; first != last; ++first) {
20
if
(
function::invoke
(
proj
, *first) == needle) {
21
result++;
22
}
23
}
24
return
result;
25
}
26
27
template
<concepts::InputContainer Con,
typename
T,
typename
Proj = function::Identity>
28
requires
(concepts::IndirectBinaryPredicate<function::Equal, meta::Projected<meta::ContainerIterator<Con>, Proj>,
29
T
const
*>)
30
constexpr
auto
operator
()(Con&&
container
, T
const
& needle, Proj
proj
= {})
const
31
->
meta::ContainerSSizeType<Con>
{
32
return
(*
this
)(
container::begin
(
container
),
container::end
(
container
), needle,
util::ref
(
proj
));
33
}
34
};
35
}
36
37
constexpr
inline
auto
count
=
detail::CountFunction
{};
38
}
39
40
namespace
di
{
41
using
container::count
;
42
}
di::concepts::IndirectBinaryPredicate
Definition
indirect_binary_predicate.h:12
equal.h
identity.h
prelude.h
prelude.h
invoke.h
di::container::detail
Definition
sequence.h:13
di::container
Definition
sequence.h:12
di::container::count
constexpr auto count
Definition
count.h:37
di::container::end
constexpr auto end
Definition
end.h:47
di::container::begin
constexpr auto begin
Definition
begin.h:44
di::function::invoke
constexpr auto invoke
Definition
invoke.h:100
di::meta::ContainerSSizeType
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition
container_ssize_type.h:8
di::meta::IteratorSSizeType
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition
iterator_ssize_type.h:8
di::util::ref
constexpr auto ref
Definition
reference_wrapper.h:98
di
Definition
zstring_parser.h:9
di::proj
constexpr auto proj
Definition
proj.h:59
ttx::Key::T
@ T
Definition
key.h:29
reference_wrapper.h
di::container::detail::CountFunction
Definition
count.h:12
libs
di
include
di
container
algorithm
count.h
Generated by
1.13.0