31#ifndef FENNEC_CONTAINERS_PRIORITY_QUEUE_H
32#define FENNEC_CONTAINERS_PRIORITY_QUEUE_H
35#include <fennec/lang/compare.h>
56template<
typename ValueT,
class CompareT = less<ValueT>,
class AllocT = allocator<ValueT>>
57struct priority_queue {
61 using value_t = ValueT;
62 using compare_t = CompareT;
63 using alloc_t = allocation<value_t, AllocT>;
65 static constexpr size_t npos = -1;
68 constexpr size_t left(
size_t n)
const {
70 return n >= _size ? npos : n;
73 constexpr size_t right(
size_t n)
const {
75 return n >= _size ? npos : n;
78 constexpr size_t parent(
size_t n)
const {
79 return n == 0 ? npos : (n - 1) / 2;
85 constexpr priority_queue()
89 constexpr ~priority_queue() {
92 fennec::destruct(&_table[_size]);
99 constexpr size_t size()
const {
103 constexpr size_t capacity()
const {
104 return _table.capacity();
107 constexpr bool empty()
const {
114 constexpr const value_t& front()
const {
121 constexpr void push(
const value_t& key) {
125 constexpr void push(value_t&& key) {
126 this->_insert(fennec::forward<value_t>(key));
129 template<
typename...ArgsT>
130 constexpr void emplace(ArgsT&&...args) {
131 this->_insert(fennec::forward<ArgsT>(args)...);
134 constexpr void pop() {
136 fennec::destruct(&_table[_size]);
149 template<
typename...ArgsT>
150 constexpr void _insert(ArgsT&&...args) {
151 if (_size == _table.capacity()) {
154 fennec::construct(&_table[_size], fennec::forward<ArgsT>(args)...);
155 _fix_insert(_size++);
158 constexpr void _expand() {
159 _table.reallocate((_table.capacity() + 1) * 2 - 1);
162 constexpr size_t _min(
size_t a,
size_t b) {
163 if (a == npos) {
return b; }
164 if (b == npos) {
return a; }
165 return _compare(_table[a], _table[b]) ? a : b;
168 void _fix_insert(
size_t n) {
169 size_t p = parent(n);
170 while (p != npos && _compare(_table[n], _table[p])) {
177 void _fix_erase(
size_t n) {
178 size_t c = _min(left(n), right(n));
179 while (n != npos && c != npos && _compare(_table[c], _table[n])) {
182 c = _min(left(n), right(n));
This header contains structures and classes related to allocating blocks of memory.
A header containing the definition for a pool of objects associated by ids.
constexpr void swap(T &x, T &y) noexcept
Swaps x and y.
Definition utility.h:114