45#ifndef DOXYGEN_SHOULD_SKIP_THIS
50 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 INLINE SortedPriorityQueue< Val, Priority, Cmp >&
129 SortedPriorityQueue< Val, Priority, Cmp >::operator=(
130 SortedPriorityQueue< Val, Priority, Cmp >&& from)
noexcept {
133 GUM_OP_MOV(SortedPriorityQueue)
135 _nodes_ = std::move(from._nodes_);
136 _tree_ = std::move(from._tree_);
137 _tree_cmp_ = std::move(from._tree_cmp_);
144 template <
typename Val,
typename Priority,
typename Cmp >
145 INLINE Size SortedPriorityQueue< Val, Priority, Cmp >::size() const noexcept {
146 return _tree_.size();
150 template <
typename Val,
typename Priority,
typename Cmp >
151 INLINE
bool SortedPriorityQueue< Val, Priority, Cmp >::empty() const noexcept {
152 return (_tree_.empty());
156 template <
typename Val,
typename Priority,
typename Cmp >
157 INLINE
bool SortedPriorityQueue< Val, Priority, Cmp >::contains(
const Val& val)
const noexcept {
158 if constexpr (std::is_scalar_v< Val >) {
159 return _nodes_.exists(AVLTreeNode< Val >(val));
161 AVLTreeNode< Val > xval(std::move(
const_cast< Val&
>(val)));
162 bool res = _nodes_.exists(xval);
163 const_cast< Val&
>(val) = std::move(xval.value);
169 template <
typename Val,
typename Priority,
typename Cmp >
170 INLINE
const Val& SortedPriorityQueue< Val, Priority, Cmp >::top()
const {
171 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty sorted priority queue has no top element") }
173 return _tree_.highestNode()->value;
177 template <
typename Val,
typename Priority,
typename Cmp >
178 INLINE
const Val& SortedPriorityQueue< Val, Priority, Cmp >::bottom()
const {
179 if (_tree_.empty()) {
183 return _tree_.lowestNode()->value;
187 template <
typename Val,
typename Priority,
typename Cmp >
188 INLINE
const Priority& SortedPriorityQueue< Val, Priority, Cmp >::topPriority()
const {
189 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty priority queue has no top priority") }
191 return _tree_cmp_.getPriority(_tree_.highestNode()->value);
195 template <
typename Val,
typename Priority,
typename Cmp >
196 INLINE
const Priority& SortedPriorityQueue< Val, Priority, Cmp >::bottomPriority()
const {
197 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty priority queue has no bottom priority") }
199 return _tree_cmp_.getPriority(_tree_.lowestNode()->value);
203 template <
typename Val,
typename Priority,
typename Cmp >
204 INLINE Val SortedPriorityQueue< Val, Priority, Cmp >::popTop() {
205 if (_tree_.empty()) {
GUM_ERROR(
NotFound,
"An empty sorted priority queue has no top element") }
208 AVLNode* node = _tree_.highestNode();
212 Val v = std::move(node->value);
213 _nodes_.erase(*node);
219 template <
typename Val,
typename Priority,
typename Cmp >
220 INLINE Val SortedPriorityQueue< Val, Priority, Cmp >::pop() {
225 template <
typename Val,
typename Priority,
typename Cmp >
226 INLINE Val SortedPriorityQueue< Val, Priority, Cmp >::popBottom() {
227 if (_tree_.empty()) {
232 AVLNode* node = _tree_.lowestNode();
236 Val v = std::move(node->value);
237 _nodes_.erase(*node);
243 template <
typename Val,
typename Priority,
typename Cmp >
244 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
245 SortedPriorityQueue< Val, Priority, Cmp >::insert(
const Val& val,
const Priority& priority) {
248 Priority new_priority(priority);
249 const auto& new_elt = _nodes_.insert(AVLNode(val), std::move(new_priority));
252 _tree_.insert(
const_cast< AVLTreeNode< Val >*
>(&new_elt.first));
254 return new_elt.first.value;
258 template <
typename Val,
typename Priority,
typename Cmp >
259 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
260 SortedPriorityQueue< Val, Priority, Cmp >::insert(Val&& val, Priority&& priority) {
263 const auto& new_elt = _nodes_.insert(AVLNode(std::move(val)), std::move(priority));
266 _tree_.insert(
const_cast< AVLTreeNode< Val >*
>(&new_elt.first));
268 return new_elt.first.value;
272 template <
typename Val,
typename Priority,
typename Cmp >
273 template <
typename... Args >
274 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::const_reference
275 SortedPriorityQueue< Val, Priority, Cmp >::emplace(Args&&... args) {
276 auto new_elt = std::make_pair< Val, Priority >(std::forward< Args >(args)...);
277 return insert(std::move(new_elt.first), std::move(new_elt.second));
281 template <
typename Val,
typename Priority,
typename Cmp >
282 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::eraseTop() {
283 if (_tree_.empty())
return;
284 AVLNode* node = _tree_.highestNode();
286 _nodes_.erase(*node);
290 template <
typename Val,
typename Priority,
typename Cmp >
291 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::eraseBottom() {
292 if (_tree_.empty())
return;
293 AVLNode* node = _tree_.lowestNode();
295 _nodes_.erase(*node);
299 template <
typename Val,
typename Priority,
typename Cmp >
300 INLINE AVLTreeNode< Val >&
301 SortedPriorityQueue< Val, Priority, Cmp >::getNode_(
const Val& val)
const {
305 if constexpr (!is_basic_string< Val >::value)
306 return const_cast< AVLTreeNode< Val >&
>(_nodes_.key(*(_tree_cmp_.getNode(val))));
308 AVLTreeNode< Val > xval(std::move(
const_cast< Val&
>(val)));
310 auto& node =
const_cast< AVLTreeNode< Val >&
>(_nodes_.key(xval));
311 const_cast< Val&
>(val) = std::move(xval.value);
315 const_cast< Val&
>(val) = std::move(xval.value);
322 template <
typename Val,
typename Priority,
typename Cmp >
323 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::erase(
const Val& val) {
325 AVLNode& node = getNode_(val);
332 template <
typename Val,
typename Priority,
typename Cmp >
333 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::setPriority(
const Val& elt,
334 const Priority& new_priority) {
336 AVLNode& node = getNode_(elt);
338 _nodes_[node] = new_priority;
339 _tree_.insert(&node);
342 "The sorted priority queue does not contain"
343 << elt <<
". Hence it is not possible to change its priority")
348 template <
typename Val,
typename Priority,
typename Cmp >
349 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::setPriority(
const Val& elt,
350 Priority&& new_priority) {
352 AVLNode& node = getNode_(elt);
354 _nodes_[node] = std::move(new_priority);
355 _tree_.insert(&node);
358 "The sorted priority queue does not contain"
359 << elt <<
". Hence it is not possible to change its priority")
364 template <
typename Val,
typename Priority,
typename Cmp >
365 INLINE
const Priority& SortedPriorityQueue< Val, Priority, Cmp >::priority(
const Val& elt)
const {
366 return _nodes_[getNode_(elt)];
370 template <
typename Val,
typename Priority,
typename Cmp >
371 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::clear() {
377 template <
typename Val,
typename Priority,
typename Cmp >
378 std::string SortedPriorityQueue< Val, Priority, Cmp >::toString()
const {
380 std::stringstream stream;
384 for (
auto iter = _tree_.rbegin(); iter != _tree_.rend(); ++iter) {
385 if (deja) stream <<
" ; ";
388 stream <<
"(" << iter->value <<
", " << _tree_cmp_.getPriority(iter->value) <<
")";
397 template <
typename Val,
typename Priority,
typename Cmp >
398 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::iterator
399 SortedPriorityQueue< Val, Priority, Cmp >::begin()
const {
400 return iterator(*
this);
404 template <
typename Val,
typename Priority,
typename Cmp >
405 INLINE
constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::iterator&
406 SortedPriorityQueue< Val, Priority, Cmp >::end()
const {
407 return *(
reinterpret_cast< const iterator*
>(_SortedPriorityQueue_end_));
411 template <
typename Val,
typename Priority,
typename Cmp >
412 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator
413 SortedPriorityQueue< Val, Priority, Cmp >::rbegin()
const {
414 return reverse_iterator(*
this,
true);
418 template <
typename Val,
typename Priority,
typename Cmp >
419 INLINE
constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator&
420 SortedPriorityQueue< Val, Priority, Cmp >::rend()
const {
421 return *(
reinterpret_cast< const reverse_iterator*
>(_SortedPriorityQueue_rend_));
425 template <
typename Val,
typename Priority,
typename Cmp >
426 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::iterator_safe
427 SortedPriorityQueue< Val, Priority, Cmp >::beginSafe() {
428 return iterator_safe(*
this);
432 template <
typename Val,
typename Priority,
typename Cmp >
433 INLINE
constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::iterator_safe&
434 SortedPriorityQueue< Val, Priority, Cmp >::endSafe()
const {
435 return *(
reinterpret_cast< const iterator_safe*
>(_SortedPriorityQueue_end_safe_));
439 template <
typename Val,
typename Priority,
typename Cmp >
440 INLINE
typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator_safe
441 SortedPriorityQueue< Val, Priority, Cmp >::rbeginSafe() {
442 return reverse_iterator_safe(*
this,
true);
446 template <
typename Val,
typename Priority,
typename Cmp >
447 INLINE
constexpr const typename SortedPriorityQueue< Val, Priority, Cmp >::reverse_iterator_safe&
448 SortedPriorityQueue< Val, Priority, Cmp >::rendSafe()
const {
449 return *(
reinterpret_cast< const reverse_iterator_safe*
>(_SortedPriorityQueue_rend_safe_));
453 template <
typename Val,
typename Priority,
typename Cmp >
454 INLINE Size SortedPriorityQueue< Val, Priority, Cmp >::capacity() const noexcept {
455 return Size(_nodes_.capacity());
459 template <
typename Val,
typename Priority,
typename Cmp >
460 INLINE
void SortedPriorityQueue< Val, Priority, Cmp >::resize(Size new_size) {
461 if (new_size < _tree_.size() / 2)
return;
462 _nodes_.resize(new_size);
468 template <
typename Val,
typename Priority,
typename Cmp >
469 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >::SortedPriorityQueueIterator(
470 const SortedPriorityQueue< Val, Priority, Cmp >& queue,
471 const bool begin) noexcept :
472 SharedAVLTreeReverseIterator< Val, TreeCmp >(queue._tree_, begin) {
473 GUM_CONSTRUCTOR(SortedPriorityQueueIterator)
477 template <
typename Val,
typename Priority,
typename Cmp >
478 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >::SortedPriorityQueueIterator(
479 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from) noexcept :
480 SharedAVLTreeReverseIterator< Val, TreeCmp >(from) {
481 GUM_CONS_CPY(SortedPriorityQueueIterator)
485 template <
typename Val,
typename Priority,
typename Cmp >
486 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >::SortedPriorityQueueIterator(
487 SortedPriorityQueueIterator< Val, Priority, Cmp >&& from) noexcept :
488 SharedAVLTreeReverseIterator< Val, TreeCmp >(std::move(from)) {
489 GUM_CONS_MOV(SortedPriorityQueueIterator)
493 template <
typename Val,
typename Priority,
typename Cmp >
495 SortedPriorityQueueIterator< Val, Priority, Cmp >::~SortedPriorityQueueIterator() noexcept {
496 GUM_DESTRUCTOR(SortedPriorityQueueIterator)
500 template <
typename Val,
typename Priority,
typename Cmp >
501 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >&
502 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator=(
503 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from)
noexcept {
504 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator=(from);
509 template <
typename Val,
typename Priority,
typename Cmp >
510 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >&
511 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator=(
512 SortedPriorityQueueIterator< Val, Priority, Cmp >&& from)
noexcept {
513 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator=(std::move(from));
518 template <
typename Val,
typename Priority,
typename Cmp >
519 INLINE
bool SortedPriorityQueueIterator< Val, Priority, Cmp >::operator==(
520 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from)
const {
521 return SharedAVLTreeReverseIterator< Val, TreeCmp >::operator==(from);
525 template <
typename Val,
typename Priority,
typename Cmp >
526 INLINE
bool SortedPriorityQueueIterator< Val, Priority, Cmp >::operator!=(
527 const SortedPriorityQueueIterator< Val, Priority, Cmp >& from)
const {
532 template <
typename Val,
typename Priority,
typename Cmp >
533 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >&
534 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator++() noexcept {
535 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator++();
540 template <
typename Val,
typename Priority,
typename Cmp >
541 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >&
542 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator+=(
const Size k)
noexcept {
543 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator+=(k);
548 template <
typename Val,
typename Priority,
typename Cmp >
549 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >&
550 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator--() noexcept {
551 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator--();
556 template <
typename Val,
typename Priority,
typename Cmp >
557 INLINE SortedPriorityQueueIterator< Val, Priority, Cmp >&
558 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator-=(
const Size k)
noexcept {
559 SharedAVLTreeReverseIterator< Val, TreeCmp >::operator-=(k);
564 template <
typename Val,
typename Priority,
typename Cmp >
565 INLINE
typename SortedPriorityQueueIterator< Val, Priority, Cmp >::const_reference
566 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator*()
const {
567 return SharedAVLTreeReverseIterator< Val, TreeCmp >::operator*().value;
571 template <
typename Val,
typename Priority,
typename Cmp >
572 INLINE
typename SortedPriorityQueueIterator< Val, Priority, Cmp >::const_pointer
573 SortedPriorityQueueIterator< Val, Priority, Cmp >::operator->()
const {
574 auto node = SharedAVLTreeReverseIterator< Val, TreeCmp >::operator->();
575 if (node !=
nullptr)
return &(node->value);
576 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
582 template <
typename Val,
typename Priority,
typename Cmp >
583 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::SortedPriorityQueueIteratorSafe(
584 SortedPriorityQueue< Val, Priority, Cmp >& queue,
585 const bool rbegin) : SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >(queue._tree_, rbegin) {
586 GUM_CONSTRUCTOR(SortedPriorityQueueIteratorSafe)
590 template <
typename Val,
typename Priority,
typename Cmp >
591 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::SortedPriorityQueueIteratorSafe(
592 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from) :
593 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >(from) {
594 GUM_CONS_CPY(SortedPriorityQueueIteratorSafe)
598 template <
typename Val,
typename Priority,
typename Cmp >
599 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::SortedPriorityQueueIteratorSafe(
600 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&& from) :
601 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >(
std::move(from)) {
602 GUM_CONS_CPY(SortedPriorityQueueIteratorSafe)
606 template <
typename Val,
typename Priority,
typename Cmp >
607 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::
608 ~SortedPriorityQueueIteratorSafe() noexcept {
609 GUM_DESTRUCTOR(SortedPriorityQueueIteratorSafe)
613 template <
typename Val,
typename Priority,
typename Cmp >
614 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
615 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator=(
616 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from) {
617 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator=(from);
622 template <
typename Val,
typename Priority,
typename Cmp >
623 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
624 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator=(
625 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&& from) {
626 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator=(std::move(from));
631 template <
typename Val,
typename Priority,
typename Cmp >
632 INLINE
bool SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator==(
633 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from)
const {
634 return SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator==(from);
638 template <
typename Val,
typename Priority,
typename Cmp >
639 INLINE
bool SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator!=(
640 const SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >& from)
const {
645 template <
typename Val,
typename Priority,
typename Cmp >
646 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
647 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator++() noexcept {
648 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator++();
653 template <
typename Val,
typename Priority,
typename Cmp >
654 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
655 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator+=(
const Size k)
noexcept {
656 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator+=(k);
661 template <
typename Val,
typename Priority,
typename Cmp >
662 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
663 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator--() noexcept {
664 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator--();
669 template <
typename Val,
typename Priority,
typename Cmp >
670 INLINE SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >&
671 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator-=(
const Size k)
noexcept {
672 SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator-=(k);
677 template <
typename Val,
typename Priority,
typename Cmp >
678 INLINE
typename SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::const_reference
679 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator*()
const {
680 return SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator*().value;
684 template <
typename Val,
typename Priority,
typename Cmp >
685 INLINE
typename SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::const_pointer
686 SortedPriorityQueueIteratorSafe< Val, Priority, Cmp >::operator->()
const {
687 auto node = SharedAVLTreeReverseIteratorSafe< Val, TreeCmp >::operator->();
688 if (node !=
nullptr)
return &(node->value);
689 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
695 template <
typename Val,
typename Priority,
typename Cmp >
697 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::SortedPriorityQueueReverseIterator(
698 const SortedPriorityQueue< Val, Priority, Cmp >& queue,
699 const bool rbegin) noexcept :
700 SharedAVLTreeIterator< Val, TreeCmp >(queue._tree_, rbegin) {
701 GUM_CONSTRUCTOR(SortedPriorityQueueReverseIterator)
705 template <
typename Val,
typename Priority,
typename Cmp >
707 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::SortedPriorityQueueReverseIterator(
708 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from) noexcept :
709 SharedAVLTreeIterator< Val, TreeCmp >(from) {
710 GUM_CONS_CPY(SortedPriorityQueueReverseIterator)
714 template <
typename Val,
typename Priority,
typename Cmp >
716 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::SortedPriorityQueueReverseIterator(
717 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&& from) noexcept :
718 SharedAVLTreeIterator< Val, TreeCmp >(std::move(from)) {
719 GUM_CONS_MOV(SortedPriorityQueueReverseIterator)
723 template <
typename Val,
typename Priority,
typename Cmp >
724 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::
725 ~SortedPriorityQueueReverseIterator() noexcept {
726 GUM_DESTRUCTOR(SortedPriorityQueueReverseIterator)
730 template <
typename Val,
typename Priority,
typename Cmp >
731 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
732 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator=(
733 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from)
noexcept {
734 SharedAVLTreeIterator< Val, TreeCmp >::operator=(from);
739 template <
typename Val,
typename Priority,
typename Cmp >
740 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
741 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator=(
742 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&& from)
noexcept {
743 SharedAVLTreeIterator< Val, TreeCmp >::operator=(std::move(from));
748 template <
typename Val,
typename Priority,
typename Cmp >
749 INLINE
bool SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator==(
750 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from)
const {
751 return SharedAVLTreeIterator< Val, TreeCmp >::operator==(from);
755 template <
typename Val,
typename Priority,
typename Cmp >
756 INLINE
bool SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator!=(
757 const SortedPriorityQueueReverseIterator< Val, Priority, Cmp >& from)
const {
762 template <
typename Val,
typename Priority,
typename Cmp >
763 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
764 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator++() noexcept {
765 SharedAVLTreeIterator< Val, TreeCmp >::operator++();
770 template <
typename Val,
typename Priority,
typename Cmp >
771 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
772 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator+=(
const Size k)
noexcept {
773 SharedAVLTreeIterator< Val, TreeCmp >::operator+=(k);
778 template <
typename Val,
typename Priority,
typename Cmp >
779 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
780 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator--() noexcept {
781 SharedAVLTreeIterator< Val, TreeCmp >::operator--();
786 template <
typename Val,
typename Priority,
typename Cmp >
787 INLINE SortedPriorityQueueReverseIterator< Val, Priority, Cmp >&
788 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator-=(
const Size k)
noexcept {
789 SharedAVLTreeIterator< Val, TreeCmp >::operator-=(k);
794 template <
typename Val,
typename Priority,
typename Cmp >
795 INLINE
typename SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::const_reference
796 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator*()
const {
797 return SharedAVLTreeIterator< Val, TreeCmp >::operator*().value;
801 template <
typename Val,
typename Priority,
typename Cmp >
802 INLINE
typename SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::const_pointer
803 SortedPriorityQueueReverseIterator< Val, Priority, Cmp >::operator->()
const {
804 auto node = SharedAVLTreeIterator< Val, TreeCmp >::operator->();
805 if (node !=
nullptr)
return &(node->value);
806 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
812 template <
typename Val,
typename Priority,
typename Cmp >
813 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
814 SortedPriorityQueueReverseIteratorSafe(SortedPriorityQueue< Val, Priority, Cmp >& queue,
816 SharedAVLTreeIteratorSafe< Val, TreeCmp >(queue._tree_, rbegin) {
817 GUM_CONSTRUCTOR(SortedPriorityQueueReverseIteratorSafe)
821 template <
typename Val,
typename Priority,
typename Cmp >
822 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
823 SortedPriorityQueueReverseIteratorSafe(
824 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from) :
825 SharedAVLTreeIteratorSafe< Val, TreeCmp >(from) {
826 GUM_CONS_CPY(SortedPriorityQueueReverseIteratorSafe)
830 template <
typename Val,
typename Priority,
typename Cmp >
831 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
832 SortedPriorityQueueReverseIteratorSafe(
833 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&& from) :
834 SharedAVLTreeIteratorSafe< Val, TreeCmp >(
std::move(from)) {
835 GUM_CONS_MOV(SortedPriorityQueueReverseIteratorSafe)
839 template <
typename Val,
typename Priority,
typename Cmp >
840 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::
841 ~SortedPriorityQueueReverseIteratorSafe() noexcept {
842 GUM_DESTRUCTOR(SortedPriorityQueueReverseIteratorSafe)
846 template <
typename Val,
typename Priority,
typename Cmp >
847 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
848 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator=(
849 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from) {
850 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator=(from);
855 template <
typename Val,
typename Priority,
typename Cmp >
856 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
857 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator=(
858 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&& from) {
859 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator=(std::move(from));
864 template <
typename Val,
typename Priority,
typename Cmp >
865 INLINE
bool SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator==(
866 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from)
const {
867 return SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator==(from);
871 template <
typename Val,
typename Priority,
typename Cmp >
872 INLINE
bool SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator!=(
873 const SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >& from)
const {
878 template <
typename Val,
typename Priority,
typename Cmp >
879 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
880 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator++() noexcept {
881 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator++();
886 template <
typename Val,
typename Priority,
typename Cmp >
887 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
888 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator+=(
889 const Size k)
noexcept {
890 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator+=(k);
895 template <
typename Val,
typename Priority,
typename Cmp >
896 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
897 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator--() noexcept {
898 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator--();
903 template <
typename Val,
typename Priority,
typename Cmp >
904 INLINE SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >&
905 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator-=(
906 const Size k)
noexcept {
907 SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator-=(k);
912 template <
typename Val,
typename Priority,
typename Cmp >
913 INLINE
typename SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::const_reference
914 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator*()
const {
915 return SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator*().value;
919 template <
typename Val,
typename Priority,
typename Cmp >
920 INLINE
typename SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::const_pointer
921 SortedPriorityQueueReverseIteratorSafe< Val, Priority, Cmp >::operator->()
const {
922 auto node = SharedAVLTreeIteratorSafe< Val, TreeCmp >::operator->();
923 if (node !=
nullptr)
return &(node->value);
924 else {
GUM_ERROR(
NotFound,
"The sorted priority queue iterator does not point on any value") }
Exception : the element we looked for cannot be found.
SortedPriorityQueue(Cmp compare=Cmp(), Size capacity=GUM_PRIORITY_QUEUE_DEFAULT_CAPACITY)
Basic constructor.
#define GUM_ERROR(type, msg)
std::size_t Size
In aGrUM, hashed values are unsigned long int.
gum is the global namespace for all aGrUM entities
Priority queues which can be parsed using iterators.
bool operator==(const TiXmlString &a, const TiXmlString &b)