You.i Engine
YiPriorityQueue.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_PRIORITY_QUEUE_H_
3 #define _YI_PRIORITY_QUEUE_H_
4 
5 #include "framework/YiPredef.h"
6 
16 {
27 
30 };
31 
43 template<typename YI_PRIORITY_QUEUE_ITEM, class YI_PRIORITY_QUEUE_ALLOCATOR = std::allocator<std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> > >
45 {
46 public:
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;
49  typedef typename YI_PRIORITY_QUEUE_CLASS::const_iterator const_iterator;
50  typedef typename YI_PRIORITY_QUEUE_CLASS::reverse_iterator reverse_iterator ;
51  typedef typename YI_PRIORITY_QUEUE_CLASS::const_reverse_iterator const_reverse_iterator ;
52 
54  {
55  }
56 
58  {
59  }
60 
61  /*******************************************************************************************
62  * Iterators
63  *******************************************************************************************/
64 
68  iterator Begin()
69  {
70  return m_priorityQueue.begin();
71  }
72 
76  const_iterator Begin() const
77  {
78  return m_priorityQueue.begin();
79  }
80 
84  reverse_iterator ReverseBegin()
85  {
86  return m_priorityQueue.rbegin();
87  }
88 
92  const_reverse_iterator ReverseBegin() const
93  {
94  return m_priorityQueue.rbegin();
95  }
96 
100  iterator End()
101  {
102  return m_priorityQueue.end();
103  }
104 
108  const_iterator End() const
109  {
110  return m_priorityQueue.end();
111  }
112 
116  reverse_iterator ReverseEnd()
117  {
118  return m_priorityQueue.rend();
119  }
120 
124  const_reverse_iterator ReverseEnd() const
125  {
126  return m_priorityQueue.rend();
127  }
128 
129  /*******************************************************************************************
130  * Capacity
131  *******************************************************************************************/
132 
136  int32_t Count(YI_PRIORITY_QUEUE_PRIORITY ePriority) const
137  {
138  int32_t nCount = 0;
139  const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
140  while(it != end)
141  {
142  if((*it).first == ePriority)
143  {
144  ++nCount;
145  }
146  ++it;
147  }
148  return nCount;
149  }
150 
154  int32_t Count(const YI_PRIORITY_QUEUE_ITEM &item) const
155  {
156  int32_t nCount = 0;
157  const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
158  while(it != end)
159  {
160  if((*it).second == item)
161  {
162  ++nCount;
163  }
164  ++it;
165  }
166  return nCount;
167  }
168 
172  int32_t Count(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority) const
173  {
174  int32_t nCount = 0;
175  const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
176  while(it != end)
177  {
178  if(it->first == ePriority && it->second == item)
179  {
180  ++nCount;
181  }
182  ++it;
183  }
184  return nCount;
185  }
186 
190  int32_t Count() const
191  {
192  return (int32_t)m_priorityQueue.size();
193  }
194 
198  bool IsEmpty() const
199  {
200  return m_priorityQueue.empty();
201  }
202 
203  /*******************************************************************************************
204  * Element Access
205  *******************************************************************************************/
206 
210  iterator Find(YI_PRIORITY_QUEUE_PRIORITY ePriority)
211  {
212  iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
213  while(it != end && (*it).first != ePriority)
214  {
215  ++it;
216  }
217  return it;
218  }
219 
223  const_iterator Find(YI_PRIORITY_QUEUE_PRIORITY ePriority) const
224  {
225  const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
226  while(it != end && (*it).first != ePriority)
227  {
228  ++it;
229  }
230  return it;
231  }
232 
236  iterator Find(const YI_PRIORITY_QUEUE_ITEM &item)
237  {
238  iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
239  while(it != end && (*it).second != item)
240  {
241  ++it;
242  }
243  return it;
244  }
245 
249  const_iterator Find(const YI_PRIORITY_QUEUE_ITEM &item) const
250  {
251  const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
252  while(it != end && (*it).second != item)
253  {
254  ++it;
255  }
256  return it;
257  }
258 
262  iterator Find(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority)
263  {
264  return std::find(m_priorityQueue.begin(), m_priorityQueue.end(), std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, item));
265  }
266 
270  const_iterator Find(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority) const
271  {
272  return std::find(m_priorityQueue.begin(), m_priorityQueue.end(), std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, item));
273  }
274 
278  template<class YI_PREDICATE>
279  iterator Find(YI_PREDICATE predicate)
280  {
281  iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
282  while(it != end)
283  {
284  const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &item = (*it);
285  if(predicate(item.second, item.first))
286  {
287  break;
288  }
289  else
290  {
291  ++it;
292  }
293  }
294  return it;
295  }
296 
300  template<class YI_PREDICATE>
301  const_iterator Find(YI_PREDICATE predicate) const
302  {
303  const_iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
304  while(it != end)
305  {
306  const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &item = (*it);
307  if(predicate(item.second, item.first))
308  {
309  break;
310  }
311  else
312  {
313  ++it;
314  }
315  }
316  return it;
317  }
318 
322  bool Contains(YI_PRIORITY_QUEUE_PRIORITY ePriority) const
323  {
324  return Find(ePriority) != m_priorityQueue.end();
325  }
326 
330  bool Contains(const YI_PRIORITY_QUEUE_ITEM &item) const
331  {
332  return Find(item) != m_priorityQueue.end();
333  }
334 
338  bool Contains(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority) const
339  {
340  return Find(item, ePriority) != m_priorityQueue.end();
341  }
342 
346  template<class YI_PREDICATE>
347  bool Contains(YI_PREDICATE predicate) const
348  {
349  return Find(predicate) != m_priorityQueue.end();
350  }
351 
355  YI_PRIORITY_QUEUE_ITEM &Head()
356  {
357  return m_priorityQueue.front().second;
358  }
359 
363  const YI_PRIORITY_QUEUE_ITEM &Head() const
364  {
365  return m_priorityQueue.front().second;
366  }
367 
368  /*******************************************************************************************
369  * Modifiers
370  *******************************************************************************************/
371 
377  void Clear()
378  {
379  m_priorityQueue.clear();
380  }
381 
387  YI_PRIORITY_QUEUE_ITEM Dequeue()
388  {
389  YI_PRIORITY_QUEUE_ITEM item(std::move(m_priorityQueue.front().second));
390  m_priorityQueue.pop_front();
391  return item;
392  }
393 
399  void Enqueue(YI_PRIORITY_QUEUE_ITEM item, YI_PRIORITY_QUEUE_PRIORITY ePriority = YI_PRIORITY_QUEUE_DEFAULT)
400  {
401  iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
402  while(it != end && (*it).first >= ePriority)
403  {
404  ++it;
405  }
406 
407  if(it == end)
408  {
409  m_priorityQueue.push_back(std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
410  }
411  else
412  {
413  m_priorityQueue.insert(it, std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
414  }
415  }
416 
422  void Push(YI_PRIORITY_QUEUE_ITEM item, YI_PRIORITY_QUEUE_PRIORITY ePriority = YI_PRIORITY_QUEUE_DEFAULT)
423  {
424  iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
425  while(it != end && (*it).first > ePriority)
426  {
427  ++it;
428  }
429 
430  if(it == end)
431  {
432  m_priorityQueue.push_back(std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
433  }
434  else
435  {
436  m_priorityQueue.insert(it, std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, std::move(item)));
437  }
438  }
439 
447  iterator Remove(iterator it)
448  {
449  return m_priorityQueue.erase(it);
450  }
451 
458  {
459  iterator it = Find(ePriority);
460  bool bFound = it != m_priorityQueue.end();
461  if(bFound)
462  {
463  m_priorityQueue.erase(it);
464  }
465  return bFound;
466  }
467 
468 
474  bool Remove(const YI_PRIORITY_QUEUE_ITEM &item)
475  {
476  iterator it = Find(item);
477  bool bFound = it != m_priorityQueue.end();
478  if(bFound)
479  {
480  m_priorityQueue.erase(it);
481  }
482  return bFound;
483  }
484 
490  bool Remove(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority)
491  {
492  iterator it = Find(item, ePriority);
493  bool bFound = it != m_priorityQueue.end();
494  if(bFound)
495  {
496  m_priorityQueue.erase(it);
497  }
498  return bFound;
499  }
500 
507  {
508  m_priorityQueue.remove_if(IsPriority(ePriority));
509  }
510 
516  void RemoveAll(const YI_PRIORITY_QUEUE_ITEM &item)
517  {
518  m_priorityQueue.remove_if(IsItem(item));
519  }
520 
526  void RemoveAll(const YI_PRIORITY_QUEUE_ITEM &item, YI_PRIORITY_QUEUE_PRIORITY ePriority)
527  {
528  m_priorityQueue.remove(std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM>(ePriority, item));
529  }
530 
536  template<class YI_PREDICATE>
537  void RemoveAll(YI_PREDICATE predicate)
538  {
539  iterator it(m_priorityQueue.begin()), end(m_priorityQueue.end());
540  while(it != end)
541  {
542  std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> item = (*it);
543  if(predicate(item.second, item.first))
544  {
545  it = Remove(it);
546  }
547  else
548  {
549  ++it;
550  }
551  }
552 
553  }
554 
563  {
564  m_priorityQueue.merge(rOther.m_priorityQueue, IsLessThan());
565  }
566 
573  {
574  m_priorityQueue.swap(rOther.m_priorityQueue);
575  }
576 
577 private:
578  /* STL Predicate Functor */
579  class IsPriority
580  {
581  YI_PRIORITY_QUEUE_PRIORITY m_priority;
582  public:
583  IsPriority(YI_PRIORITY_QUEUE_PRIORITY priority) : m_priority(priority)
584  {
585  }
586  bool operator()(const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &rValue)
587  {
588  return m_priority == rValue.first;
589  }
590  };
591 
592  /* STL Predicate Functor */
593  class IsItem
594  {
595  const YI_PRIORITY_QUEUE_ITEM &m_rItem;
596  public:
597  IsItem(const YI_PRIORITY_QUEUE_ITEM &rItem) : m_rItem(rItem)
598  {
599  }
600  bool operator()(const std::pair<YI_PRIORITY_QUEUE_PRIORITY, YI_PRIORITY_QUEUE_ITEM> &rValue)
601  {
602  return m_rItem == rValue.second;
603  }
604  };
605 
606  /* STL Compare Functor */
607  class IsLessThan
608  {
609  public:
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)
611  {
612  // we use a "greater than" comparison because higher priority enum values are assigned higher numbers
613  return rLHS.first > rRHS.first;
614  }
615  };
616 
617  YI_PRIORITY_QUEUE_CLASS m_priorityQueue;
618 };
619 
622 #endif /* _YI_PRIORITY_QUEUE_H_ */
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