17 template<
typename Con,
typename Value>
23 container.emplace_back(util::move(value));
29template<
typename Value, detail::PriorityQueueCompatible<Value> Con = container::Vector<Value>,
30 concepts::StrictWeakOrder<Value> Comp = function::Compare>
33 template<concepts::InputContainer Other>
36 Comp
const& comp = {}) {
42 struct Iterator :
public IteratorBase<Iterator, InputIteratorTag, Value, meta::ContainerSSizeType<Con>> {
51 constexpr auto operator*() const -> Value& {
return *m_base->top(); }
53 constexpr void advance_one() { m_base->pop(); }
56 constexpr friend auto operator==(Iterator
const& a, DefaultSentinel
const&) ->
bool {
57 return a.m_base->empty();
60 PriorityQueue* m_base {
nullptr };
74 constexpr auto top() const ->
Optional<Value const&> {
return m_container.front(); }
76 constexpr auto empty() const ->
bool {
return size() == 0U; }
77 constexpr auto size()
const {
return m_container.size(); }
79 constexpr auto push(Value
const& value) ->
decltype(
auto)
84 constexpr auto push(Value&& value) ->
decltype(
auto) {
return emplace(util::move(value)); }
86 template<
typename... Args>
88 constexpr auto emplace(Args&&... args) ->
decltype(
auto) {
89 return as_fallible(m_container.emplace_back(util::forward<Args>(args)...)) |
if_success([&](
auto&&...) {
95 template<concepts::ContainerCompatible<Value> Other>
97 auto old_size =
size();
99 return m_container.append_container(util::forward<Other>(
container));
101 for (
auto i = old_size + 1U; i <=
size(); i++) {
111 auto value = util::move(m_container[0]);
113 m_container.pop_back();
117 constexpr auto begin() {
return Iterator(*
this); }
120 constexpr auto base() const -> Con const& {
return m_container; }
121 constexpr auto comparator() const -> Comp const& {
return m_comp; }
123 constexpr void clear() { m_container.clear(); }
136 [[no_unique_address]] Comp m_comp {};
139template<concepts::Container Con,
typename T = meta::ContainerValue<Con>, concepts::StrictWeakOrder<T> Comp>
143template<concepts::InputContainer Con,
typename T = meta::ContainerValue<Con>>
146template<concepts::InputContainer Con,
typename T = meta::ContainerValue<Con>, concepts::StrictWeakOrder<T> Comp>
Definition priority_queue.h:31
constexpr auto end()
Definition priority_queue.h:118
constexpr friend auto tag_invoke(types::Tag< util::clone >, PriorityQueue const &self)
Definition priority_queue.h:129
constexpr auto emplace(Args &&... args) -> decltype(auto)
Definition priority_queue.h:88
constexpr PriorityQueue(Comp const &compare)
Definition priority_queue.h:66
constexpr auto push(Value &&value) -> decltype(auto)
Definition priority_queue.h:84
constexpr auto begin()
Definition priority_queue.h:117
constexpr auto push(Value const &value) -> decltype(auto) requires(concepts::CopyConstructible< Value >)
Definition priority_queue.h:79
constexpr auto base() const -> Con const &
Definition priority_queue.h:120
constexpr auto push_container(Other &&container)
Definition priority_queue.h:96
constexpr void clear()
Definition priority_queue.h:123
constexpr auto pop() -> Optional< Value >
Definition priority_queue.h:107
constexpr auto top() const -> Optional< Value const & >
Definition priority_queue.h:74
constexpr auto comparator() const -> Comp const &
Definition priority_queue.h:121
constexpr auto empty() const -> bool
Definition priority_queue.h:76
constexpr PriorityQueue(Comp const &compare, Con &&container)
Definition priority_queue.h:68
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< PriorityQueue >, Other &&other, Comp const &comp={})
Definition priority_queue.h:35
constexpr auto size() const
Definition priority_queue.h:77
constexpr auto top() -> Optional< Value & >
Definition priority_queue.h:73
Definition optional_forward_declaration.h:5
Definition operations.h:11
Definition container_compatible.h:9
Definition operations.h:34
Definition permutable.h:9
Definition random_access_container.h:8
Definition language.h:244
Definition priority_queue.h:18
PriorityQueue(Comp, Con) -> PriorityQueue< T, Con, Comp >
constexpr auto move
Definition move.h:38
constexpr auto make_heap
Definition make_heap.h:34
constexpr auto to(Con &&container, Args &&... args)
Definition to.h:25
constexpr auto push_heap
Definition push_heap.h:44
constexpr auto default_sentinel
Definition default_sentinel.h:6
constexpr auto compare
Definition compare.h:40
constexpr auto pop_heap
Definition pop_heap.h:83
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto clone
Definition clone.h:39
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto invoke_as_fallible
Definition invoke_as_fallible.h:37
constexpr auto as_fallible
Definition as_fallible.h:26
constexpr auto try_infallible
Definition try_infallible.h:31
constexpr auto nullopt
Definition nullopt.h:15
constexpr auto if_success
Definition if_success.h:31
constexpr auto in_place
Definition in_place.h:8
Definition in_place_template.h:5
Definition in_place_type.h:5