2 #ifndef _YI_PRIORITY_QUEUE_H_ 3 #define _YI_PRIORITY_QUEUE_H_ 43 template<
typename YI_PRIORITY_QUEUE_ITEM,
class YI_PRIORITY_QUEUE_ALLOCATOR = std::allocator<std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> > >
47 typedef std::list<std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>, YI_PRIORITY_QUEUE_ALLOCATOR>
YI_PRIORITY_QUEUE_CLASS;
48 typedef typename YI_PRIORITY_QUEUE_CLASS::iterator
iterator;
70 return m_priorityQueue.begin();
78 return m_priorityQueue.begin();
86 return m_priorityQueue.rbegin();
94 return m_priorityQueue.rbegin();
102 return m_priorityQueue.end();
108 const_iterator
End()
const 110 return m_priorityQueue.end();
118 return m_priorityQueue.rend();
126 return m_priorityQueue.rend();
139 const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
142 if((*it).first == ePriority)
154 int32_t
Count(
const YI_PRIORITY_QUEUE_ITEM &item)
const 157 const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
160 if((*it).second == item)
175 const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
178 if(it->first == ePriority && it->second == item)
192 return (int32_t)m_priorityQueue.size();
200 return m_priorityQueue.empty();
212 iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
213 while(it != end && (*it).first != ePriority)
225 const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
226 while(it != end && (*it).first != ePriority)
236 iterator
Find(
const YI_PRIORITY_QUEUE_ITEM &item)
238 iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
239 while(it != end && (*it).second != item)
249 const_iterator
Find(
const YI_PRIORITY_QUEUE_ITEM &item)
const 251 const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
252 while(it != end && (*it).second != item)
264 return std::find(m_priorityQueue.begin(), m_priorityQueue.end(), std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, item));
272 return std::find(m_priorityQueue.begin(), m_priorityQueue.end(), std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, item));
278 template<
class YI_PREDICATE>
279 iterator
Find(YI_PREDICATE predicate)
281 iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
284 const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &item = (*it);
285 if(predicate(item.second, item.first))
300 template<
class YI_PREDICATE>
301 const_iterator
Find(YI_PREDICATE predicate)
const 303 const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
306 const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &item = (*it);
307 if(predicate(item.second, item.first))
324 return Find(ePriority) != m_priorityQueue.end();
330 bool Contains(
const YI_PRIORITY_QUEUE_ITEM &item)
const 332 return Find(item) != m_priorityQueue.end();
340 return Find(item, ePriority) != m_priorityQueue.end();
346 template<
class YI_PREDICATE>
349 return Find(predicate) != m_priorityQueue.end();
357 return m_priorityQueue.front().second;
363 const YI_PRIORITY_QUEUE_ITEM &
Head()
const 365 return m_priorityQueue.front().second;
379 m_priorityQueue.clear();
389 YI_PRIORITY_QUEUE_ITEM item(std::move(m_priorityQueue.front().second));
390 m_priorityQueue.pop_front();
401 iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
402 while(it != end && (*it).first >= ePriority)
409 m_priorityQueue.push_back(std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
413 m_priorityQueue.insert(it, std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
424 iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
425 while(it != end && (*it).first > ePriority)
432 m_priorityQueue.push_back(std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
436 m_priorityQueue.insert(it, std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
449 return m_priorityQueue.erase(it);
459 iterator it =
Find(ePriority);
460 bool bFound = it != m_priorityQueue.end();
463 m_priorityQueue.erase(it);
474 bool Remove(
const YI_PRIORITY_QUEUE_ITEM &item)
476 iterator it =
Find(item);
477 bool bFound = it != m_priorityQueue.end();
480 m_priorityQueue.erase(it);
492 iterator it =
Find(item, ePriority);
493 bool bFound = it != m_priorityQueue.end();
496 m_priorityQueue.erase(it);
508 m_priorityQueue.remove_if(IsPriority(ePriority));
518 m_priorityQueue.remove_if(IsItem(item));
528 m_priorityQueue.remove(std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, item));
536 template<
class YI_PREDICATE>
539 iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
542 std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> item = (*it);
543 if(predicate(item.second, item.first))
564 m_priorityQueue.merge(rOther.m_priorityQueue, IsLessThan());
574 m_priorityQueue.swap(rOther.m_priorityQueue);
586 bool operator()(
const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &rValue)
588 return m_priority == rValue.first;
595 const YI_PRIORITY_QUEUE_ITEM &m_rItem;
597 IsItem(
const YI_PRIORITY_QUEUE_ITEM &rItem) : m_rItem(rItem)
600 bool operator()(
const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &rValue)
602 return m_rItem == rValue.second;
610 bool operator()(
const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &rLHS,
const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &rRHS)
613 return rLHS.first > rRHS.first;
617 YI_PRIORITY_QUEUE_CLASS m_priorityQueue;
void RemoveAll(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority)
Definition: YiPriorityQueue.h:526
const YI_PRIORITY_QUEUE_ITEM & Head() const
Definition: YiPriorityQueue.h:363
Definition: YiPriorityQueue.h:22
Definition: YiPriorityQueue.h:26
std::list< std::pair< YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM >, YI_PRIORITY_QUEUE_ALLOCATOR > YI_PRIORITY_QUEUE_CLASS
Definition: YiPriorityQueue.h:47
bool Contains(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority) const
Definition: YiPriorityQueue.h:338
bool Contains(const YI_PRIORITY_QUEUE_ITEM &item) const
Definition: YiPriorityQueue.h:330
const_iterator End() const
Definition: YiPriorityQueue.h:108
int32_t Count() const
Definition: YiPriorityQueue.h:190
reverse_iterator ReverseBegin()
Definition: YiPriorityQueue.h:84
iterator Find(YI_PRIORITY_QUEUE_PRIORITY ePriority)
Definition: YiPriorityQueue.h:210
bool Remove(YI_PRIORITY_QUEUE_PRIORITY ePriority)
Definition: YiPriorityQueue.h:457
bool IsEmpty() const
Definition: YiPriorityQueue.h:198
YI_PRIORITY_QUEUE_CLASS::const_reverse_iterator const_reverse_iterator
Definition: YiPriorityQueue.h:51
void Push(YI_PRIORITY_QUEUE_ITEM item, YI_PRIORITY_QUEUE_PRIORITY ePriority=YI_PRIORITY_QUEUE_DEFAULT)
Definition: YiPriorityQueue.h:422
void RemoveAll(const YI_PRIORITY_QUEUE_ITEM &item)
Definition: YiPriorityQueue.h:516
YI_PRIORITY_QUEUE_ITEM Dequeue()
Definition: YiPriorityQueue.h:387
iterator Find(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority)
Definition: YiPriorityQueue.h:262
const_reverse_iterator ReverseBegin() const
Definition: YiPriorityQueue.h:92
Definition: YiPriorityQueue.h:24
virtual ~CYIPriorityQueue()
Definition: YiPriorityQueue.h:57
int32_t Count(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority) const
Definition: YiPriorityQueue.h:172
void Clear()
Definition: YiPriorityQueue.h:377
iterator Remove(iterator it)
Definition: YiPriorityQueue.h:447
const_reverse_iterator ReverseEnd() const
Definition: YiPriorityQueue.h:124
const_iterator Find(YI_PRIORITY_QUEUE_PRIORITY ePriority) const
Definition: YiPriorityQueue.h:223
Definition: YiPriorityQueue.h:18
YI_PRIORITY_QUEUE_ITEM & Head()
Definition: YiPriorityQueue.h:355
YI_PRIORITY_QUEUE_CLASS::const_iterator const_iterator
Definition: YiPriorityQueue.h:49
A container class which maintains a queue of items within defined YI_PRIORITY_QUEUE_PRIORITY prioriti...
Definition: YiPriorityQueue.h:44
bool Remove(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority)
Definition: YiPriorityQueue.h:490
iterator Find(const YI_PRIORITY_QUEUE_ITEM &item)
Definition: YiPriorityQueue.h:236
void RemoveAll(YI_PRIORITY_QUEUE_PRIORITY ePriority)
Definition: YiPriorityQueue.h:506
int32_t Count(const YI_PRIORITY_QUEUE_ITEM &item) const
Definition: YiPriorityQueue.h:154
const_iterator Begin() const
Definition: YiPriorityQueue.h:76
void RemoveAll(YI_PREDICATE predicate)
Definition: YiPriorityQueue.h:537
const_iterator Find(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority) const
Definition: YiPriorityQueue.h:270
YI_PRIORITY_QUEUE_CLASS::reverse_iterator reverse_iterator
Definition: YiPriorityQueue.h:50
iterator Begin()
Definition: YiPriorityQueue.h:68
void Merge(CYIPriorityQueue< YI_PRIORITY_QUEUE_ITEM, YI_PRIORITY_QUEUE_ALLOCATOR > &rOther)
Definition: YiPriorityQueue.h:562
bool Contains(YI_PREDICATE predicate) const
Definition: YiPriorityQueue.h:347
YI_PRIORITY_QUEUE_PRIORITY
Definition: YiPriorityQueue.h:15
const_iterator Find(const YI_PRIORITY_QUEUE_ITEM &item) const
Definition: YiPriorityQueue.h:249
reverse_iterator ReverseEnd()
Definition: YiPriorityQueue.h:116
const_iterator Find(YI_PREDICATE predicate) const
Definition: YiPriorityQueue.h:301
void Swap(CYIPriorityQueue< YI_PRIORITY_QUEUE_ITEM, YI_PRIORITY_QUEUE_ALLOCATOR > &rOther)
Definition: YiPriorityQueue.h:572
Definition: YiPriorityQueue.h:20
bool Remove(const YI_PRIORITY_QUEUE_ITEM &item)
Definition: YiPriorityQueue.h:474
bool Contains(YI_PRIORITY_QUEUE_PRIORITY ePriority) const
Definition: YiPriorityQueue.h:322
int32_t Count(YI_PRIORITY_QUEUE_PRIORITY ePriority) const
Definition: YiPriorityQueue.h:136
YI_PRIORITY_QUEUE_CLASS::iterator iterator
Definition: YiPriorityQueue.h:48
void Enqueue(YI_PRIORITY_QUEUE_ITEM item, YI_PRIORITY_QUEUE_PRIORITY ePriority=YI_PRIORITY_QUEUE_DEFAULT)
Definition: YiPriorityQueue.h:399
CYIPriorityQueue()
Definition: YiPriorityQueue.h:53
Definition: YiPriorityQueue.h:29
iterator Find(YI_PREDICATE predicate)
Definition: YiPriorityQueue.h:279
iterator End()
Definition: YiPriorityQueue.h:100