Iros
Loading...
Searching...
No Matches
make_heap.h
Go to the documentation of this file.
1
#pragma once
2
3
#include "
di/container/algorithm/pop_heap.h
"
4
5
namespace
di::container
{
6
namespace
detail
{
7
struct
MakeHeapFunction
{
8
template
<concepts::RandomAccessIterator It, concepts::SentinelFor<It> Sent,
typename
Comp = function::Compare,
9
typename
Proj = function::Identity>
10
requires
(
concepts::Sortable<It, Comp, Proj>
)
11
constexpr
auto
operator
()(It first, Sent last, Comp comp = {}, Proj
proj
= {})
const
-> It {
12
auto
dist =
container::distance
(first, last);
13
return
impl(util::move(first),
util::ref
(comp),
util::ref
(
proj
), dist);
14
}
15
16
template
<
concepts::RandomAccessContainer
Con,
typename
Comp =
function::Compare
,
17
typename
Proj =
function::Identity
>
18
requires
(
concepts::Sortable<meta::ContainerIterator<Con>
, Comp, Proj>)
19
constexpr
auto
operator
()(Con&&
container
, Comp comp = {}, Proj
proj
= {})
const
20
->
meta::BorrowedIterator<Con>
{
21
return
impl(
container::begin
(
container
),
util::ref
(comp),
util::ref
(
proj
),
container::distance
(
container
));
22
}
23
24
private
:
25
constexpr
static
auto
impl(
auto
first,
auto
comp,
auto
proj
,
auto
size
) {
26
for
(
auto
index =
size
- 1; index >= 0; --index) {
27
PopHeapFunction::bubble_down(first,
util::ref
(comp),
util::ref
(
proj
),
size
, index);
28
}
29
return
first +
size
;
30
}
31
};
32
}
33
34
constexpr
inline
auto
make_heap
=
detail::MakeHeapFunction
{};
35
}
36
37
namespace
di
{
38
using
container::make_heap
;
39
}
di::concepts::RandomAccessContainer
Definition
random_access_container.h:8
di::concepts::Sortable
Definition
sortable.h:11
size
constexpr usize size
Definition
gfx_test.cpp:24
di::container::detail
Definition
sequence.h:13
di::container
Definition
sequence.h:12
di::container::make_heap
constexpr auto make_heap
Definition
make_heap.h:34
di::container::distance
constexpr auto distance
Definition
distance.h:44
di::container::begin
constexpr auto begin
Definition
begin.h:44
di::meta::BorrowedIterator
Conditional< concepts::BorrowedContainer< Con >, ContainerIterator< Con >, container::Dangling > BorrowedIterator
Definition
borrowed_iterator.h:11
di::util::ref
constexpr auto ref
Definition
reference_wrapper.h:98
di
Definition
zstring_parser.h:9
di::size
constexpr auto size
Definition
size.h:54
di::proj
constexpr auto proj
Definition
proj.h:59
pop_heap.h
di::container::detail::MakeHeapFunction
Definition
make_heap.h:7
di::function::Compare
Definition
compare.h:8
di::function::Identity
Definition
identity.h:7
libs
di
include
di
container
algorithm
make_heap.h
Generated by
1.13.0