31#ifndef ETL_PRIORITY_QUEUE_INCLUDED
32#define ETL_PRIORITY_QUEUE_INCLUDED
42#include "static_assert.h"
66 priority_queue_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
67 :
exception(reason_, file_name_, line_number_)
80 priority_queue_full(string_type file_name_, numeric_type line_number_)
81 : priority_queue_exception(ETL_ERROR_TEXT(
"priority_queue:full", ETL_PRIORITY_QUEUE_FILE_ID
"A"), file_name_, line_number_)
94 priority_queue_iterator(string_type file_name_, numeric_type line_number_)
95 : priority_queue_exception(ETL_ERROR_TEXT(
"priority_queue:iterator", ETL_PRIORITY_QUEUE_FILE_ID
"B"), file_name_, line_number_)
108 priority_queue_empty(string_type file_name_, numeric_type line_number_)
109 : priority_queue_exception(ETL_ERROR_TEXT(
"priority_queue:empty", ETL_PRIORITY_QUEUE_FILE_ID
"C"), file_name_, line_number_)
118 template <
typename TContainer>
121 ETL_STATIC_ASSERT(
sizeof(TContainer) == 0,
"Unsupported container type for etl::ipriority_queue");
124 template <
typename T, const
size_t N>
130 template <
typename T, const
size_t N>
151 template <
typename T,
typename TContainerBase = etl::ivector<T>,
typename TCompare = etl::less<T> >
162 typedef T&& rvalue_reference;
165 typedef typename TContainerBase::difference_type difference_type;
176 return container.front();
188 return container.front();
202 container.push_back(value);
204 etl::push_heap(container.begin(), container.end(), compare);
214 void push(rvalue_reference value)
219 container.push_back(etl::move(value));
221 etl::push_heap(container.begin(), container.end(),
compare);
225#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_PRIORITY_QUEUE_FORCE_CPP03_IMPLEMENTATION)
232 template <
typename... Args>
238 container.emplace_back(etl::forward<Args>(args)...);
240 etl::push_heap(container.begin(), container.end(), compare);
254 container.emplace_back();
256 etl::push_heap(container.begin(), container.end(), compare);
265 template <
typename T1>
271 container.emplace_back(value1);
273 etl::push_heap(container.begin(), container.end(), compare);
282 template <
typename T1,
typename T2>
283 void emplace(
const T1& value1,
const T2& value2)
288 container.emplace_back(value1, value2);
290 etl::push_heap(container.begin(), container.end(), compare);
299 template <
typename T1,
typename T2,
typename T3>
300 void emplace(
const T1& value1,
const T2& value2,
const T3& value3)
305 container.emplace_back(value1, value2, value3);
307 etl::push_heap(container.begin(), container.end(), compare);
316 template <
typename T1,
typename T2,
typename T3,
typename T4>
317 void emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
322 container.emplace_back(value1, value2, value3, value4);
324 etl::push_heap(container.begin(), container.end(), compare);
337 template <
typename TIterator>
338 void assign(TIterator first, TIterator last)
340#if ETL_IS_DEBUG_BUILD
341 difference_type d = etl::distance(first, last);
347 container.assign(first, last);
348 etl::make_heap(container.begin(), container.end(), compare);
361 etl::pop_heap(container.begin(), container.end(), compare);
363 container.pop_back();
372 destination = ETL_MOVE(
top());
381 return container.size();
389 return container.max_size();
398 return container.empty();
408 return container.size() == container.max_size();
417 return container.max_size() - container.size();
450 move(etl::move(rhs));
460#if defined(ETL_POLYMORPHIC_PRIORITY_QUEUE) || defined(ETL_POLYMORPHIC_CONTAINERS)
480 assign(other.container.cbegin(), other.container.cend());
490 while (!other.empty())
492 push(etl::move(other.top()));
502 : container(container_)
512 TContainerBase& container;
524 template <
typename T, const
size_t SIZE,
typename TContainer = etl::vector<T, SIZE>,
525 typename TCompare = etl::less<
typename TContainer::value_type> >
534 typedef typename TContainer::size_type size_type;
535 typedef TContainer container_type;
537 static ETL_CONSTANT size_type MAX_SIZE =
size_type(SIZE);
563 base_t::move(etl::move(rhs));
573 template <
typename TIterator>
577 base_t::assign(first, last);
610 base_t::move(etl::move(rhs));
619 TContainer container;
622 template <
typename T, const
size_t SIZE,
typename TContainer,
typename TCompare>
623 ETL_CONSTANT
typename priority_queue<T, SIZE, TContainer, TCompare>::size_type priority_queue<T, SIZE, TContainer, TCompare>::MAX_SIZE;
Definition priority_queue.h:527
~priority_queue()
Destructor.
Definition priority_queue.h:583
priority_queue(const priority_queue &rhs)
Copy constructor.
Definition priority_queue.h:550
priority_queue & operator=(const priority_queue &rhs)
Assignment operator.
Definition priority_queue.h:591
priority_queue()
Default constructor.
Definition priority_queue.h:542
priority_queue(TIterator first, TIterator last)
Definition priority_queue.h:574
Make this a clone of the supplied priority queue.
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
reference top()
Definition priority_queue.h:173
ipriority_queue(TContainerBase &container_)
The constructor that is called from derived classes.
Definition priority_queue.h:501
ipriority_queue & operator=(const ipriority_queue &rhs)
Assignment operator.
Definition priority_queue.h:431
TContainerBase::size_type size_type
The type used for determining the size of the queue.
Definition priority_queue.h:164
TCompare compare_type
The comparison type.
Definition priority_queue.h:157
void emplace()
Definition priority_queue.h:249
TContainerBase container_base_type
The non-sized container base type.
Definition priority_queue.h:158
const_reference top() const
Definition priority_queue.h:185
T & reference
A reference to the type used in the queue.
Definition priority_queue.h:159
const T & const_reference
A const reference to the type used in the queue.
Definition priority_queue.h:160
bool full() const
Definition priority_queue.h:406
void push(const_reference value)
Definition priority_queue.h:197
~ipriority_queue()
Destructor.
Definition priority_queue.h:469
void pop_into(reference destination)
Definition priority_queue.h:370
size_type max_size() const
Returns the maximum number of items that can be queued.
Definition priority_queue.h:387
void clear()
Clears the queue to the empty state.
Definition priority_queue.h:423
T value_type
The type stored in the queue.
Definition priority_queue.h:156
void emplace(const T1 &value1, const T2 &value2)
Definition priority_queue.h:283
void emplace(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition priority_queue.h:317
void emplace(const T1 &value1)
Definition priority_queue.h:266
size_type available() const
Definition priority_queue.h:415
void pop()
Definition priority_queue.h:357
size_type size() const
Returns the current number of items in the priority queue.
Definition priority_queue.h:379
bool empty() const
Definition priority_queue.h:396
void assign(TIterator first, TIterator last)
Definition priority_queue.h:338
void emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Definition priority_queue.h:300
This is the base for all priority queues that contain a particular type.
Definition priority_queue.h:153
Definition priority_queue.h:105
Definition priority_queue.h:63
Definition priority_queue.h:77
Definition priority_queue.h:91
Definition priority_queue.h:120