4#ifndef _Stroika_Foundation_Containers_PriorityQueue_h_
5#define _Stroika_Foundation_Containers_PriorityQueue_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
9#include "Stroika/Foundation/Common/Common.h"
10#include "Stroika/Foundation/Containers/Common.h"
42 using Traversal::Iterable;
43 using Traversal::Iterator;
46 const Priority kMinPriority = kMinUInt16;
47 const Priority kMaxPriority = kMaxUInt16;
53 PQEntry (T item, Priority p);
59 Boolean operator== (
const PQEntry<T>& lhs,
const PQEntry<T>& rhs);
83 class [[nodiscard]] PriorityQueue :
public Iterable<pair<T, Priority>> {
91 using ArchetypeContainerType = PriorityQueue;
97 PriorityQueue (
const PriorityQueue& src) =
default;
100 explicit PriorityQueue (
const shared_ptr<_IRep>& rep);
102#if qStroika_Foundation_Debug_AssertionsChecked
110 nonvirtual PriorityQueue<T>& operator= (
const PriorityQueue<T>& src);
111 nonvirtual PriorityQueue<T>& operator= (PriorityQueue<T>&& rhs) =
default;
114 nonvirtual
void RemoveAll ();
117 nonvirtual Iterable<T> Elements ()
const;
120 nonvirtual
void Enqueue (T item, Priority priority);
123 nonvirtual T Dequeue ();
126 nonvirtual T Head ()
const;
129 nonvirtual
Priority TopPriority ()
const;
132 nonvirtual
void RemoveHead ();
135 nonvirtual PriorityQueue<T>& operator+= (T item);
136 nonvirtual PriorityQueue<T>& operator+= (IteratorRep<PQEntry<T>>* it);
137 nonvirtual PriorityQueue<T>& operator-- ();
140 nonvirtual
const _IRep& _ConstGetRep ()
const;
143 nonvirtual
const _IRep& _GetRep ()
const;
144 nonvirtual _IRep& _GetRep ();
153 template <
typename T>
162 virtual shared_ptr<_IRep> CloneEmpty ()
const = 0;
163 virtual void Enqueue (T item, Priority priority) = 0;
164 virtual T Dequeue () = 0;
165 virtual T Head ()
const = 0;
176#include "PriorityQueue.inl"
Implementation detail for PriorityQueue<T> implementors.
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.