Iros
 
Loading...
Searching...
No Matches
priority_queue.h
Go to the documentation of this file.
1#pragma once
2
14
15namespace di::container {
16namespace detail {
17 template<typename Con, typename Value>
27}
28
29template<typename Value, detail::PriorityQueueCompatible<Value> Con = container::Vector<Value>,
30 concepts::StrictWeakOrder<Value> Comp = function::Compare>
32private:
33 template<concepts::InputContainer Other>
36 Comp const& comp = {}) {
37 return as_fallible(util::forward<Other>(other) | container::to<Con>()) % [&](Con&& container) {
38 return PriorityQueue(comp, util::move(container));
40 }
41
42 struct Iterator : public IteratorBase<Iterator, InputIteratorTag, Value, meta::ContainerSSizeType<Con>> {
43 private:
44 friend class PriorityQueue;
45
46 constexpr explicit Iterator(PriorityQueue& base) : m_base(util::addressof(base)) {}
47
48 public:
49 Iterator() = default;
50
51 constexpr auto operator*() const -> Value& { return *m_base->top(); }
52
53 constexpr void advance_one() { m_base->pop(); }
54
55 private:
56 constexpr friend auto operator==(Iterator const& a, DefaultSentinel const&) -> bool {
57 return a.m_base->empty();
58 }
59
60 PriorityQueue* m_base { nullptr };
61 };
62
63public:
64 PriorityQueue() = default;
65
66 constexpr explicit PriorityQueue(Comp const& compare) : m_comp(compare) {}
67
68 constexpr explicit PriorityQueue(Comp const& compare, Con&& container)
69 : m_container(util::move(container)), m_comp(compare) {
70 container::make_heap(m_container, util::ref(m_comp));
71 }
72
73 constexpr auto top() -> Optional<Value&> { return m_container.front(); }
74 constexpr auto top() const -> Optional<Value const&> { return m_container.front(); }
75
76 constexpr auto empty() const -> bool { return size() == 0U; }
77 constexpr auto size() const { return m_container.size(); }
78
79 constexpr auto push(Value const& value) -> decltype(auto)
81 {
82 return emplace(value);
83 }
84 constexpr auto push(Value&& value) -> decltype(auto) { return emplace(util::move(value)); }
85
86 template<typename... Args>
87 requires(concepts::ConstructibleFrom<Value, Args...>)
88 constexpr auto emplace(Args&&... args) -> decltype(auto) {
89 return as_fallible(m_container.emplace_back(util::forward<Args>(args)...)) | if_success([&](auto&&...) {
90 container::push_heap(m_container, util::ref(m_comp));
91 }) |
93 }
94
95 template<concepts::ContainerCompatible<Value> Other>
96 constexpr auto push_container(Other&& container) {
97 auto old_size = size();
98 return invoke_as_fallible([&] {
99 return m_container.append_container(util::forward<Other>(container));
100 }) % [&] {
101 for (auto i = old_size + 1U; i <= size(); i++) {
102 container::push_heap(m_container.begin(), m_container.begin() + i, util::ref(m_comp));
103 }
104 } | try_infallible;
105 }
106
107 constexpr auto pop() -> Optional<Value> {
108 if (empty()) {
109 return nullopt;
110 }
111 auto value = util::move(m_container[0]);
112 container::pop_heap(m_container, util::ref(m_comp));
113 m_container.pop_back();
114 return value;
115 }
116
117 constexpr auto begin() { return Iterator(*this); }
118 constexpr auto end() { return default_sentinel; }
119
120 constexpr auto base() const -> Con const& { return m_container; }
121 constexpr auto comparator() const -> Comp const& { return m_comp; }
122
123 constexpr void clear() { m_container.clear(); }
124
125private:
126 constexpr explicit PriorityQueue(InPlace, Con&& container, Comp const& comp)
127 : m_container(util::move(container)), m_comp(comp) {}
128
129 constexpr friend auto tag_invoke(types::Tag<util::clone>, PriorityQueue const& self) {
130 return as_fallible(util::clone(self.m_container)) % [&](Con&& container) {
131 return PriorityQueue(in_place, util::move(container), self.m_comp);
132 } | try_infallible;
133 }
134
135 Con m_container {};
136 [[no_unique_address]] Comp m_comp {};
137};
138
139template<concepts::Container Con, typename T = meta::ContainerValue<Con>, concepts::StrictWeakOrder<T> Comp>
142
143template<concepts::InputContainer Con, typename T = meta::ContainerValue<Con>>
145
146template<concepts::InputContainer Con, typename T = meta::ContainerValue<Con>, concepts::StrictWeakOrder<T> Comp>
149}
150
151namespace di {
153}
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 core.h:114
Definition language.h:244
Definition sequence.h:13
Definition sequence.h:12
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
Definition vocab.h:96
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
Definition in_place.h:4