46#ifndef DOXYGEN_SHOULD_SKIP_THIS
51 template <
typename Val,
typename Priority,
typename Cmp >
53 _nodes_(capacity, true, true), _tree_cmp_(compare) {
54 GUM_CONSTRUCTOR(SortedPriorityQueue);
58 template <
typename Val,
typename Priority,
typename Cmp >
59 SortedPriorityQueue< Val, Priority, Cmp >::SortedPriorityQueue(
60 std::initializer_list< std::pair< Val, Priority > > list) :
61 _nodes_(Size(list.size()) / 2, true, true) {
63 for (
const auto& elt: list) {
64 insert(elt.first, elt.second);
67 GUM_CONSTRUCTOR(SortedPriorityQueue);
71 template <
typename Val,
typename Priority,
typename Cmp >
72 SortedPriorityQueue< Val, Priority, Cmp >::SortedPriorityQueue(
73 const SortedPriorityQueue< Val, Priority, Cmp >& from) :
74 _nodes_(from._nodes_), _tree_cmp_(from._tree_cmp_) {
76 for (
const auto& node_prio: _nodes_) {
77 _tree_.insert(&node_prio.first);
80 GUM_CONS_CPY(SortedPriorityQueue);
84 template <
typename Val,
typename Priority,
typename Cmp >
85 SortedPriorityQueue< Val, Priority, Cmp >::SortedPriorityQueue(
86 SortedPriorityQueue< Val, Priority, Cmp >&& from) noexcept :
87 _tree_(std::move(from._tree_)), _nodes_(std::move(from._nodes_)),
88 _tree_cmp_(std::move(from._tree_cmp_)) {
89 GUM_CONS_MOV(SortedPriorityQueue)
93 template <
typename Val,
typename Priority,
typename Cmp >
94 SortedPriorityQueue< Val, Priority, Cmp >::~SortedPriorityQueue() {
95 GUM_DESTRUCTOR(SortedPriorityQueue);
99 template <
typename Val,
typename Priority,
typename Cmp >
100 SortedPriorityQueue< Val, Priority, Cmp >& SortedPriorityQueue< Val, Priority, Cmp >::operator=(
101 const SortedPriorityQueue< Val, Priority, Cmp >& from) {
104 GUM_OP_CPY(SortedPriorityQueue)
108 _tree_cmp_ = from._tree_cmp_;
111 _nodes_ = from._nodes_;
114 for (
const auto& node_prio: _nodes_)
115 _tree_.insert(&node_prio.first);
127 template <
typename Val,
typename Priority,
typename Cmp >
128 SortedPriorityQueue< Val, Priority, Cmp >& SortedPriorityQueue< Val, Priority, Cmp >::operator=(
129 SortedPriorityQueue< Val, Priority, Cmp >&& from)
noexcept {
132 GUM_OP_MOV(SortedPriorityQueue)
134 _nodes_ = std::move(from._nodes_);
135 _tree_ = std::move(from._tree_);
136 _tree_cmp_ = std::move(from._tree_cmp_);
143 template <
typename Val,
typename Priority,
typename Cmp >
144 Size SortedPriorityQueue< Val, Priority, Cmp >::size() const noexcept {
145 return _tree_.size();
149 template <
typename Val,
typename Priority,
typename Cmp >
150 bool SortedPriorityQueue< Val, Priority, Cmp >::empty() const noexcept {
151 return (_tree_.empty());
155 template <
typename Val,
typename Priority,
typename Cmp >
156 bool SortedPriorityQueue< Val, Priority, Cmp >::contains(
const Val& val)
const noexcept {
157 if constexpr (std::is_scalar_v< Val >) {
158 return _nodes_.exists(AVLTreeNode< Val >(val));
160 AVLTreeNode< Val > xval(std::move(
const_cast< Val&
>(val)));
161 bool res = _nodes_.exists(xval);
162 const_cast< Val&
>(val) = std::move(xval.value);
168 template <
typename Val,
typename Priority,
typename Cmp >
169 const Val& SortedPriorityQueue< Val, Priority, Cmp >::top()
const {
170 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty sorted priority queue has no top element") }
172 return _tree_.highestNode()->value;
176 template <
typename Val,
typename Priority,
typename Cmp >
177 const Val& SortedPriorityQueue< Val, Priority, Cmp >::bottom()
const {
178 if (_tree_.empty()) {
182 return _tree_.lowestNode()->value;
186 template <
typename Val,
typename Priority,
typename Cmp >
187 const Priority& SortedPriorityQueue< Val, Priority, Cmp >::topPriority()
const {
188 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty priority queue has no top priority") }
190 return _tree_cmp_.getPriority(_tree_.highestNode()->value);
194 template <
typename Val,
typename Priority,
typename Cmp >
195 const Priority& SortedPriorityQueue< Val, Priority, Cmp >::bottomPriority()
const {
196 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty priority queue has no bottom priority") }
198 return _tree_cmp_.getPriority(_tree_.lowestNode()->value);
202 template <
typename Val,
typename Priority,
typename Cmp >
203 Val SortedPriorityQueue< Val, Priority, Cmp >::popTop() {
204 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty sorted priority queue has no top element") }
207 AVLNode* node = _tree_.highestNode();
211 Val v = std::move(node->value);
212 _nodes_.erase(*node);
218 template <
typename Val,
typename Priority,
typename Cmp >
219 Val SortedPriorityQueue< Val, Priority, Cmp >::pop() {
224 template <
typename Val,
typename Priority,
typename Cmp >
225 Val SortedPriorityQueue< Val, Priority, Cmp >::popBottom() {
226 if (_tree_.empty()) {
231 AVLNode* node = _tree_.lowestNode();
235 Val v = std::move(node->value);
236 _nodes_.erase(*node);
242 template <
typename Val,
typename Priority,
typename Cmp >
243 typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
244 SortedPriorityQueue< Val, Priority, Cmp >::insert(
const Val& val,
const Priority& priority) {
247 Priority new_priority(priority);
248 const auto& new_elt = _nodes_.insert(AVLNode(val), std::move(new_priority));
251 _tree_.insert(
const_cast< AVLTreeNode< Val >*
>(&new_elt.first));
253 return new_elt.first.value;
257 template <
typename Val,
typename Priority,
typename Cmp >
258 typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
259 SortedPriorityQueue< Val, Priority, Cmp >::insert(Val&& val, Priority&& priority) {
260 if constexpr (std::is_move_constructible_v< Val >) {
263 const auto& new_elt = _nodes_.insert(AVLNode(std::move(val)), std::move(priority));
266 _tree_.insert(
const_cast< AVLTreeNode< Val >*
>(&new_elt.first));
267 return new_elt.first.value;
269 return insert(val, priority);
274 template <
typename Val,
typename Priority,
typename Cmp >
275 template <
typename... Args >
276 typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
277 SortedPriorityQueue< Val, Priority, Cmp >::emplace(Args&&... args) {
278 auto new_elt = std::make_pair< Val, Priority >(std::forward< Args >(args)...);
279 return insert(std::move(new_elt.first), std::move(new_elt.second));
283 template <
typename Val,
typename Priority,
typename Cmp >
284 void SortedPriorityQueue< Val, Priority, Cmp >::eraseTop() {
285 if (_tree_.empty())
return;
286 AVLNode* node = _tree_.highestNode();
288 _nodes_.erase(*node);
292 template <
typename Val,
typename Priority,
typename Cmp >
293 void SortedPriorityQueue< Val, Priority, Cmp >::eraseBottom() {
294 if (_tree_.empty()) {
return; }
295 AVLNode* node = _tree_.lowestNode();
297 _nodes_.erase(*node);
301 template <
typename Val,
typename Priority,
typename Cmp >
303 SortedPriorityQueue< Val, Priority, Cmp >::getNodeFromExternalValue_(
const Val& val)
const {
306 if constexpr (std::is_scalar_v< Val > || std::is_base_of_v< GraphChange, Val >) {
307 return const_cast< AVLTreeNode< Val >&
>(_nodes_.key(AVLTreeNode< Val >(val)));
309 AVLTreeNode< Val > xval(std::move(
const_cast< Val&
>(val)));
310 const bool found = _nodes_.exists(xval);
312 auto& node =
const_cast< AVLTreeNode< Val >&
>(_nodes_.key(xval));
313 const_cast< Val&
>(val) = std::move(xval.value);
316 const_cast< Val&
>(val) = std::move(xval.value);
323 template <
typename Val,
typename Priority,
typename Cmp >
324 optional_ref< AVLTreeNode< Val > >
325 SortedPriorityQueue< Val, Priority, Cmp >::tryGetNodeFromExternalValue_(
326 const Val& val)
const {
329 if constexpr (std::is_scalar_v< Val > || std::is_base_of_v< GraphChange, Val >) {
330 auto key = _nodes_.tryGetKey(AVLTreeNode< Val >(val));
331 return key.has_value() ? optional_ref{
const_cast< AVLTreeNode< Val >&
>(key.value())}
332 : optional_ref< AVLTreeNode< Val > >{};
334 AVLTreeNode< Val > xval(std::move(
const_cast< Val&
>(val)));
335 auto key = _nodes_.tryGetKey(xval);
336 const_cast< Val&
>(val) = std::move(xval.value);
337 return key.has_value() ? optional_ref{
const_cast< AVLTreeNode< Val >&
>(key.value())}
338 : optional_ref< AVLTreeNode< Val > >{};
343 template <
typename Val,
typename Priority,
typename Cmp >
345 SortedPriorityQueue< Val, Priority, Cmp >::getNodeFromInternalValue_(
const Val& val)
const {
349 if constexpr (!is_basic_string< Val >::value) {
350 return const_cast< AVLTreeNode< Val >&
>(_nodes_.key(*(_tree_cmp_.getNode(val))));
352 return getNodeFromExternalValue_(val);
357 template <
typename Val,
typename Priority,
typename Cmp >
358 typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
359 SortedPriorityQueue< Val, Priority, Cmp >::operator[](
const Val& val)
const {
361 return getNodeFromExternalValue_(val).value;
365 template <
typename Val,
typename Priority,
typename Cmp >
366 optional_ref< const Val >
367 SortedPriorityQueue< Val, Priority, Cmp >::tryGet(
const Val& val)
const {
369 auto node = tryGetNodeFromExternalValue_(val);
370 return node.has_value() ? optional_ref< const Val >{node->value} : optional_ref< const Val >{};
374 template <
typename Val,
typename Priority,
typename Cmp >
375 void SortedPriorityQueue< Val, Priority, Cmp >::erase(
const Val& val,
bool internal_val) {
378 = internal_val ? getNodeFromInternalValue_(val) : getNodeFromExternalValue_(val);
385 template <
typename Val,
typename Priority,
typename Cmp >
386 void SortedPriorityQueue< Val, Priority, Cmp >::setPriority(
const Val& elt,
387 const Priority& new_priority,
391 "The sorted priority queue does not contain"
392 << elt <<
". Hence it is not possible to change its priority")
394 AVLNode& node = internal_val ? getNodeFromInternalValue_(elt) : getNodeFromExternalValue_(elt);
396 _nodes_[node] = new_priority;
397 _tree_.insert(&node);
401 template <
typename Val,
typename Priority,
typename Cmp >
402 void SortedPriorityQueue< Val, Priority, Cmp >::setPriority(
const Val& elt,
403 Priority&& new_priority,
407 "The sorted priority queue does not contain"
408 << elt <<
". Hence it is not possible to change its priority")
410 AVLNode& node = internal_val ? getNodeFromInternalValue_(elt) : getNodeFromExternalValue_(elt);
412 _nodes_[node] = std::move(new_priority);
413 _tree_.insert(&node);
417 template <
typename Val,
typename Priority,
typename Cmp >
418 const Priority& SortedPriorityQueue< Val, Priority, Cmp >::priority(
const Val& elt,
419 bool internal_val)
const {
420 return _nodes_[internal_val ? getNodeFromInternalValue_(elt) : getNodeFromExternalValue_(elt)];
424 template <
typename Val,
typename Priority,
typename Cmp >
425 void SortedPriorityQueue< Val, Priority, Cmp >::clear() {
431 template <
typename Val,
typename Priority,
typename Cmp >
432 std::string SortedPriorityQueue< Val, Priority, Cmp >::toString()
const {
434 std::stringstream stream;
438 for (
auto iter = _tree_.rbegin(); iter != _tree_.rend(); ++iter) {
439 if (deja) stream <<
" ; ";
442 stream <<
"(" << iter->value <<
", " << _tree_cmp_.getPriority(iter->value) <<
")";
451 template <
typename Val,
typename Priority,
typename Cmp >
452 typename SortedPriorityQueue< Val, Priority, Cmp >::iterator
453 SortedPriorityQueue< Val, Priority, Cmp >::begin()
const {
454 return iterator(*
this);
458 template <
typename Val,
typename Priority,
typename Cmp >
459 constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::iterator&
460 SortedPriorityQueue< Val, Priority, Cmp >::end()
const {
461 return *(
reinterpret_cast< const iterator*
>(_SortedPriorityQueue_end_));
465 template <
typename Val,
typename Priority,
typename Cmp >
466 typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator
467 SortedPriorityQueue< Val, Priority, Cmp >::rbegin()
const {
468 return reverse_iterator(*
this,
true);
472 template <
typename Val,
typename Priority,
typename Cmp >
473 constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator&
474 SortedPriorityQueue< Val, Priority, Cmp >::rend()
const {
475 return *(
reinterpret_cast< const reverse_iterator*
>(_SortedPriorityQueue_rend_));
479 template <
typename Val,
typename Priority,
typename Cmp >
480 typename SortedPriorityQueue< Val, Priority, Cmp >::iterator_safe
481 SortedPriorityQueue< Val, Priority, Cmp >::beginSafe() {
482 return iterator_safe(*
this);
486 template <
typename Val,
typename Priority,
typename Cmp >
487 constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::iterator_safe&
488 SortedPriorityQueue< Val, Priority, Cmp >::endSafe()
const {
489 return *(
reinterpret_cast< const iterator_safe*
>(_SortedPriorityQueue_end_safe_));
493 template <
typename Val,
typename Priority,
typename Cmp >
494 typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator_safe
495 SortedPriorityQueue< Val, Priority, Cmp >::rbeginSafe() {
496 return reverse_iterator_safe(*
this,
true);
500 template <
typename Val,
typename Priority,
typename Cmp >
501 constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator_safe&
502 SortedPriorityQueue< Val, Priority, Cmp >::rendSafe()
const {
503 return *(
reinterpret_cast< const reverse_iterator_safe*
>(_SortedPriorityQueue_rend_safe_));
507 template <
typename Val,
typename Priority,
typename Cmp >
508 Size SortedPriorityQueue< Val, Priority, Cmp >::capacity() const noexcept {
509 return Size(_nodes_.capacity());
513 template <
typename Val,
typename Priority,
typename Cmp >
514 void SortedPriorityQueue< Val, Priority, Cmp >::resize(Size new_size) {
515 if (new_size < _tree_.size() / 2)
return;
516 _nodes_.resize(new_size);
522 template <
typename Val,
typename Priority,
typename Cmp >
523 SortedPriorityQueueIterator< Val, Priority, Cmp >::SortedPriorityQueueIterator(
524 const SortedPriorityQueue< Val, Priority, Cmp >& queue,
525 const bool begin) noexcept :
526 SharedAVLTreeReverseIterator< Val, TreeCmp >(queue._tree_, begin) {
527 GUM_CONSTRUCTOR(SortedPriorityQueueIterator)
531 template <
typename Val,
typename Priority,
typename Cmp >
532 SortedPriorityQueueIterator< Val, Priority, Cmp >::SortedPriorityQueueIterator(
533 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from) noexcept :
534 SharedAVLTreeReverseIterator< Val, TreeCmp >(from) {
535 GUM_CONS_CPY(SortedPriorityQueueIterator)
539 template <
typename Val,
typename Priority,
typename Cmp >
540 SortedPriorityQueueIterator< Val, Priority, Cmp >::SortedPriorityQueueIterator(
541 SortedPriorityQueueIterator< Val, Priority, Cmp >&& from) noexcept :
542 SharedAVLTreeReverseIterator< Val, TreeCmp >(std::move(from)) {
543 GUM_CONS_MOV(SortedPriorityQueueIterator)
547 template <
typename Val,
typename Priority,
typename Cmp >
548 SortedPriorityQueueIterator< Val, Priority, Cmp >::~SortedPriorityQueueIterator() noexcept {
549 GUM_DESTRUCTOR(SortedPriorityQueueIterator)
553 template <
typename Val,
typename Priority,
typename Cmp >
554 SortedPriorityQueueIterator< Val, Priority, Cmp >&
555 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator=(
556 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from)
noexcept {
557 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator=(from);
562 template <
typename Val,
typename Priority,
typename Cmp >
563 SortedPriorityQueueIterator< Val, Priority, Cmp >&
564 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator=(
565 SortedPriorityQueueIterator< Val, Priority, Cmp >&& from)
noexcept {
566 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator=(std::move(from));
571 template <
typename Val,
typename Priority,
typename Cmp >
572 bool SortedPriorityQueueIterator< Val, Priority, Cmp >::operator==(
573 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from)
const {
574 return SharedAVLTreeReverseIterator< Val, TreeCmp >::operator==(from);
578 template <
typename Val,
typename Priority,
typename Cmp >
579 bool SortedPriorityQueueIterator< Val, Priority, Cmp >::operator!=(
580 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from)
const {
585 template <
typename Val,
typename Priority,
typename Cmp >
586 SortedPriorityQueueIterator< Val, Priority, Cmp >&
587 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator++() noexcept {
588 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator++();
593 template <
typename Val,
typename Priority,
typename Cmp >
594 SortedPriorityQueueIterator< Val, Priority, Cmp >&
595 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator+=(
const Size k)
noexcept {
596 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator+=(k);
601 template <
typename Val,
typename Priority,
typename Cmp >
602 SortedPriorityQueueIterator< Val, Priority, Cmp >&
603 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator--() noexcept {
604 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator--();
609 template <
typename Val,
typename Priority,
typename Cmp >
610 SortedPriorityQueueIterator< Val, Priority, Cmp >&
611 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator-=(
const Size k)
noexcept {
612 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator-=(k);
617 template <
typename Val,
typename Priority,
typename Cmp >
618 typename SortedPriorityQueueIterator< Val, Priority, Cmp >::const_reference
619 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator*()
const {
620 return SharedAVLTreeReverseIterator< Val, TreeCmp >::operator*().value;
624 template <
typename Val,
typename Priority,
typename Cmp >
625 typename SortedPriorityQueueIterator< Val, Priority, Cmp >::const_pointer
626 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator->()
const {
627 auto node = SharedAVLTreeReverseIterator< Val, TreeCmp >::operator->();
628 if (node !=
nullptr)
return &(node->value);
629 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
634 template <
typename Val,
typename Priority,
typename Cmp >
635 typename SortedPriorityQueueIterator< Val, Priority, Cmp >::const_reference
636 SortedPriorityQueueIterator< Val, Priority, Cmp >::value()
const {
642 template <
typename Val,
typename Priority,
typename Cmp >
643 const Priority& SortedPriorityQueueIterator< Val, Priority, Cmp >::priority()
const {
644 auto node = SharedAVLTreeReverseIterator< Val, TreeCmp >::operator->();
645 if (node !=
nullptr)
return TreeIterator::tree().compare().getPriority(node->value);
646 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
652 template <
typename Val,
typename Priority,
typename Cmp >
653 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::SortedPriorityQueueIteratorSafe(
654 SortedPriorityQueue< Val, Priority, Cmp >& queue,
655 const bool rbegin) : SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >(queue._tree_, rbegin) {
656 GUM_CONSTRUCTOR(SortedPriorityQueueIteratorSafe)
660 template <
typename Val,
typename Priority,
typename Cmp >
661 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::SortedPriorityQueueIteratorSafe(
662 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from) :
663 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >(from) {
664 GUM_CONS_CPY(SortedPriorityQueueIteratorSafe)
668 template <
typename Val,
typename Priority,
typename Cmp >
669 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::SortedPriorityQueueIteratorSafe(
670 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&& from) :
671 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >(
std::move(from)) {
672 GUM_CONS_CPY(SortedPriorityQueueIteratorSafe)
676 template <
typename Val,
typename Priority,
typename Cmp >
677 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::
678 ~SortedPriorityQueueIteratorSafe() noexcept {
679 GUM_DESTRUCTOR(SortedPriorityQueueIteratorSafe)
683 template <
typename Val,
typename Priority,
typename Cmp >
684 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
685 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator=(
686 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from) {
687 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator=(from);
692 template <
typename Val,
typename Priority,
typename Cmp >
693 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
694 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator=(
695 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&& from) {
696 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator=(std::move(from));
701 template <
typename Val,
typename Priority,
typename Cmp >
702 bool SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator==(
703 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from)
const {
704 return SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator==(from);
708 template <
typename Val,
typename Priority,
typename Cmp >
709 bool SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator!=(
710 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from)
const {
715 template <
typename Val,
typename Priority,
typename Cmp >
716 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
717 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator++() noexcept {
718 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator++();
723 template <
typename Val,
typename Priority,
typename Cmp >
724 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
725 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator+=(
const Size k)
noexcept {
726 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator+=(k);
731 template <
typename Val,
typename Priority,
typename Cmp >
732 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
733 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator--() noexcept {
734 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator--();
739 template <
typename Val,
typename Priority,
typename Cmp >
740 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
741 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator-=(
const Size k)
noexcept {
742 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator-=(k);
747 template <
typename Val,
typename Priority,
typename Cmp >
748 typename SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::const_reference
749 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator*()
const {
750 return SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator*().value;
754 template <
typename Val,
typename Priority,
typename Cmp >
755 typename SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::const_pointer
756 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator->()
const {
757 auto node = SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator->();
758 if (node !=
nullptr)
return &(node->value);
759 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
764 template <
typename Val,
typename Priority,
typename Cmp >
765 typename SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::const_reference
766 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::value()
const {
772 template <
typename Val,
typename Priority,
typename Cmp >
773 const Priority& SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::priority()
const {
774 auto node = SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator->();
775 if (node !=
nullptr)
return TreeIterator::tree().compare().getPriority(node->value);
776 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
782 template <
typename Val,
typename Priority,
typename Cmp >
783 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::SortedPriorityQueueReverseIterator(
784 const SortedPriorityQueue< Val, Priority, Cmp >& queue,
785 const bool rbegin) noexcept : SharedAVLTreeIterator< Val, TreeCmp >(queue._tree_, rbegin) {
786 GUM_CONSTRUCTOR(SortedPriorityQueueReverseIterator)
790 template <
typename Val,
typename Priority,
typename Cmp >
791 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::SortedPriorityQueueReverseIterator(
792 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from) noexcept :
793 SharedAVLTreeIterator< Val, TreeCmp >(from) {
794 GUM_CONS_CPY(SortedPriorityQueueReverseIterator)
798 template <
typename Val,
typename Priority,
typename Cmp >
799 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::SortedPriorityQueueReverseIterator(
800 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&& from) noexcept :
801 SharedAVLTreeIterator< Val, TreeCmp >(std::move(from)) {
802 GUM_CONS_MOV(SortedPriorityQueueReverseIterator)
806 template <
typename Val,
typename Priority,
typename Cmp >
807 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::
808 ~SortedPriorityQueueReverseIterator() noexcept {
809 GUM_DESTRUCTOR(SortedPriorityQueueReverseIterator)
813 template <
typename Val,
typename Priority,
typename Cmp >
814 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
815 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator=(
816 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from)
noexcept {
817 SharedAVLTreeIterator< Val, TreeCmp >::operator=(from);
822 template <
typename Val,
typename Priority,
typename Cmp >
823 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
824 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator=(
825 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&& from)
noexcept {
826 SharedAVLTreeIterator< Val, TreeCmp >::operator=(std::move(from));
831 template <
typename Val,
typename Priority,
typename Cmp >
832 bool SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator==(
833 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from)
const {
834 return SharedAVLTreeIterator< Val, TreeCmp >::operator==(from);
838 template <
typename Val,
typename Priority,
typename Cmp >
839 bool SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator!=(
840 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from)
const {
845 template <
typename Val,
typename Priority,
typename Cmp >
846 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
847 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator++() noexcept {
848 SharedAVLTreeIterator< Val, TreeCmp >::operator++();
853 template <
typename Val,
typename Priority,
typename Cmp >
854 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
855 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator+=(
const Size k)
noexcept {
856 SharedAVLTreeIterator< Val, TreeCmp >::operator+=(k);
861 template <
typename Val,
typename Priority,
typename Cmp >
862 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
863 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator--() noexcept {
864 SharedAVLTreeIterator< Val, TreeCmp >::operator--();
869 template <
typename Val,
typename Priority,
typename Cmp >
870 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
871 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator-=(
const Size k)
noexcept {
872 SharedAVLTreeIterator< Val, TreeCmp >::operator-=(k);
877 template <
typename Val,
typename Priority,
typename Cmp >
878 typename SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::const_reference
879 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator*()
const {
880 return SharedAVLTreeIterator< Val, TreeCmp >::operator*().value;
884 template <
typename Val,
typename Priority,
typename Cmp >
885 typename SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::const_pointer
886 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator->()
const {
887 auto node = SharedAVLTreeIterator< Val, TreeCmp >::operator->();
888 if (node !=
nullptr)
return &(node->value);
889 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
894 template <
typename Val,
typename Priority,
typename Cmp >
895 typename SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::const_reference
896 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::value()
const {
902 template <
typename Val,
typename Priority,
typename Cmp >
903 const Priority& SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::priority()
const {
904 auto node = SharedAVLTreeIterator< Val, TreeCmp >::operator->();
905 if (node !=
nullptr)
return TreeIterator::tree().compare().getPriority(node->value);
906 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
912 template <
typename Val,
typename Priority,
typename Cmp >
913 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
914 SortedPriorityQueueReverseIteratorSafe(SortedPriorityQueue< Val, Priority, Cmp >& queue,
916 SharedAVLTreeIteratorSafe< Val, TreeCmp >(queue._tree_, rbegin) {
917 GUM_CONSTRUCTOR(SortedPriorityQueueReverseIteratorSafe)
921 template <
typename Val,
typename Priority,
typename Cmp >
922 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
923 SortedPriorityQueueReverseIteratorSafe(
924 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from) :
925 SharedAVLTreeIteratorSafe< Val, TreeCmp >(from) {
926 GUM_CONS_CPY(SortedPriorityQueueReverseIteratorSafe)
930 template <
typename Val,
typename Priority,
typename Cmp >
931 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
932 SortedPriorityQueueReverseIteratorSafe(
933 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&& from) :
934 SharedAVLTreeIteratorSafe< Val, TreeCmp >(
std::move(from)) {
935 GUM_CONS_MOV(SortedPriorityQueueReverseIteratorSafe)
939 template <
typename Val,
typename Priority,
typename Cmp >
940 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
941 ~SortedPriorityQueueReverseIteratorSafe() noexcept {
942 GUM_DESTRUCTOR(SortedPriorityQueueReverseIteratorSafe)
946 template <
typename Val,
typename Priority,
typename Cmp >
947 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
948 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator=(
949 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from) {
950 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator=(from);
955 template <
typename Val,
typename Priority,
typename Cmp >
956 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
957 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator=(
958 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&& from) {
959 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator=(std::move(from));
964 template <
typename Val,
typename Priority,
typename Cmp >
965 bool SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator==(
966 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from)
const {
967 return SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator==(from);
971 template <
typename Val,
typename Priority,
typename Cmp >
972 bool SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator!=(
973 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from)
const {
978 template <
typename Val,
typename Priority,
typename Cmp >
979 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
980 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator++() noexcept {
981 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator++();
986 template <
typename Val,
typename Priority,
typename Cmp >
987 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
988 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator+=(
989 const Size k)
noexcept {
990 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator+=(k);
995 template <
typename Val,
typename Priority,
typename Cmp >
996 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
997 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator--() noexcept {
998 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator--();
1003 template <
typename Val,
typename Priority,
typename Cmp >
1004 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
1005 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator-=(
1006 const Size k)
noexcept {
1007 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator-=(k);
1012 template <
typename Val,
typename Priority,
typename Cmp >
1013 typename SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::const_reference
1014 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator*()
const {
1015 return SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator*().value;
1019 template <
typename Val,
typename Priority,
typename Cmp >
1020 typename SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::const_pointer
1021 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator->()
const {
1022 auto node = SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator->();
1023 if (node !=
nullptr)
return &(node->value);
1024 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
1029 template <
typename Val,
typename Priority,
typename Cmp >
1030 typename SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::const_reference
1031 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::value()
const {
1037 template <
typename Val,
typename Priority,
typename Cmp >
1038 const Priority& SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::priority()
const {
1039 auto node = SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator->();
1040 if (node !=
nullptr)
return TreeIterator::tree().compare().getPriority(node->value);
1041 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
1048 template <
typename Val,
typename Priority,
typename Cmp >
1049 SortedPriorityQueue< Val, Priority, Cmp >::TreeCmp::TreeCmp(
const Cmp& cmp) : _cmp_(cmp) {}
1051 template <
typename Val,
typename Priority,
typename Cmp >
1052 SortedPriorityQueue< Val, Priority, Cmp >::TreeCmp::TreeCmp(
Cmp&& cmp) : _cmp_(
std::move(cmp)) {}
1054 template <
typename Val,
typename Priority,
typename Cmp >
1056 SortedPriorityQueue< Val, Priority, Cmp >::TreeCmp::getPriority(
const Val& v)
const {
1057 return *((Priority*)((
char*)&v + offset_from_value_to_priority));
1060 template <
typename Val,
typename Priority,
typename Cmp >
1062 SortedPriorityQueue< Val, Priority, Cmp >::TreeCmp::getNode(
const Val& v)
const {
1063 return (AVLTreeNode< Val >*)((
char*)&v - offset_to_value);
1066 template <
typename Val,
typename Priority,
typename Cmp >
1067 bool SortedPriorityQueue< Val, Priority, Cmp >::TreeCmp::operator()(
const Val& x,
1068 const Val& y)
const {
1069 return _cmp_(getPriority(x), getPriority(y));
1079 template <
typename Val,
typename Priority,
typename Cmp >
Exception : the element we looked for cannot be found.
A priority queue in which we can iterate over the elements from the top to bottom or conversely.
SortedPriorityQueue(Cmp compare=Cmp(), Size capacity=GUM_PRIORITY_QUEUE_DEFAULT_CAPACITY)
Basic constructor.
std::string toString() const
Displays the content of the queue.
#define GUM_ERROR(type, msg)
std::size_t Size
In aGrUM, hashed values are unsigned long int.
bool contains(std::string_view s, std::string_view needle)
true if needle in s
gum is the global namespace for all aGrUM entities
value_type & operator*()
Returns the value pointed to by the iterator.
std::ostream & operator<<(std::ostream &stream, const AVLTree< Val, Cmp > &tree)
display the content of a tree
Priority queues which can be parsed using iterators.
bool operator==(const TiXmlString &a, const TiXmlString &b)