RecoSim  1.0
 All Classes Files Functions Variables Enumerations
my_priority_queue.h
Go to the documentation of this file.
1 
22 #ifndef MY_PRIORITY_QUEUE_H
23 #define MY_PRIORITY_QUEUE_H
24 
25 #include <vector>
26 using namespace std;
27 
28 
29 template <class T, class Compare>
31 
32 private:
33  vector<T> waiting_queue;
35  int current_pos;
36 
37 public:
38  /* Typical priority queue functions (see priority queue in STL) */
39  T top(void);
40  void pop(void);
41  int push(const T& elt);
42  int size(void) const;
43  bool empty(void) const;
44 
45  /* Additionnal functions for debug/scheduling purposes */
46  T& at(int pos);
47  const T& at(int pos) const;
48 
49  /* Look into the vector with current_pos variable (used by scheduling) */
50  void resetCurrentPosition();
51  T next_element(void);
52  const T& current_element() const;
53  T& current_element();
54  void erase_current_element();
55  const int current_position() const;
56  bool last_element() const;
57 
58  void update_queue(void);
59 };
60 
64 template <class T, class Compare>
66  return waiting_queue.front();
67 }
68 
72 template <class T, class Compare>
74  waiting_queue.erase(waiting_queue.begin());
75  current_pos -= 1;
76 }
77 
84 template <class T, class Compare>
86  // Version 1: basic FIFO, Always put the element at the end
87  //waiting_queue.push_back(T(elt));
88 
89  // Version 2: real priority queue coupled with FIFO when comp is equal
90  typename vector<T>::iterator it;
91  Compare comp;
92  bool inserted = false;
93  int position = 0;
94  for(it = waiting_queue.begin(); it < waiting_queue.end(); it++) {
95  if(comp(elt, *it)) {
96  // Insert element
97  waiting_queue.insert(it, T(elt));
98  inserted = true;
99  break;
100  }
101  position++;
102  }
103 
104  if(!inserted) waiting_queue.push_back(T(elt)); // Insert at the end
105 
106  return position;
107 }
108 
113 template <class T, class Compare>
115  return (int) waiting_queue.size();
116 }
117 
122 template <class T, class Compare>
124  return waiting_queue.empty();
125 }
126 
132 template <class T, class Compare>
134  return waiting_queue.at(pos);
135 }
136 
142 template <class T, class Compare>
143 const T& MyPriorityQueue<T, Compare>::at(int pos) const {
144  return waiting_queue.at(pos);
145 }
146 
150 template <class T, class Compare>
152  vector<T> waiting_queue_copy(waiting_queue);
153 
154  waiting_queue.clear();
155  for(int i = 0; i < (int) waiting_queue_copy.size(); i++) push(waiting_queue_copy.at(i));
156 }
157 
161 template <class T, class Compare>
163  current_pos = -1;
164 }
165 
170 template <class T, class Compare>
172  current_pos += 1;
173  return waiting_queue.at(current_pos);
174 }
175 
180 template <class T, class Compare>
182  return waiting_queue.at(current_pos);
183 }
184 
189 template <class T, class Compare>
191  return waiting_queue.at(current_pos);
192 }
193 
198 template <class T, class Compare>
200  waiting_queue.erase(waiting_queue.begin() + current_pos);
201  current_pos -= 1;
202 }
203 
208 template <class T, class Compare>
210  return current_pos;
211 }
212 
217 template <class T, class Compare>
219  return (current_pos >= (int)(waiting_queue.size()-1));
220 }
221 
222 #endif
bool empty(void) const
Definition: my_priority_queue.h:123
T top(void)
Definition: my_priority_queue.h:65
const T & current_element() const
Definition: my_priority_queue.h:181
bool last_element() const
Definition: my_priority_queue.h:218
void update_queue(void)
Definition: my_priority_queue.h:151
T & at(int pos)
Definition: my_priority_queue.h:133
void pop(void)
Definition: my_priority_queue.h:73
const int current_position() const
Definition: my_priority_queue.h:209
int size(void) const
Definition: my_priority_queue.h:114
int push(const T &elt)
Definition: my_priority_queue.h:85
T next_element(void)
Definition: my_priority_queue.h:171
Definition: my_priority_queue.h:30
void resetCurrentPosition()
Definition: my_priority_queue.h:162
void erase_current_element()
Definition: my_priority_queue.h:199