xsens_imu
xsens_fifoqueue.h
Go to the documentation of this file.
1 #ifndef XSENS_MONOLITHIC
2 
25 #endif
26 #ifndef XSENS_FIFOQUEUE_H
27 #define XSENS_FIFOQUEUE_H
28 
29 
30 namespace xsens {
31 
33 
40 template <class T, bool E=true>
41 class FifoQueue {
42 protected:
43  size_t m_maxCount;
45  size_t m_first;
47 
48  T* m_list;
49 public:
50  typedef T value_type;
51  typedef size_t size_type;
52 
54  FifoQueue(size_type size=16, bool delOnOverwrite = true)
55  {
56  if (size > 0)
57  m_maxCount = size;
58  else
59  m_maxCount = 1;
60  m_list = new T[m_maxCount];
61  m_currentCount = 0;
62  m_first = 0;
63  m_deleteOnOverwrite = delOnOverwrite;
64  }
65 
67  template <bool E2>
69  {
71  m_list = new T[m_maxCount];
74  m_first = 0;
75  for (size_t i = 0;i<m_currentCount;++i)
76  m_list[i] = q.m_list[(i+q.m_first) % m_maxCount];
77  }
78 
79  void eraseAndClear(void)
80  {
81  for (size_t i = 0;i<m_currentCount;++i)
82  delete m_list[(i+m_first) % m_maxCount];
83  m_currentCount = 0;
84  m_first = 0;
85  }
86 
89  {
90  if (E)
91  eraseAndClear();
92  m_maxCount = 0;
93  delete[] m_list;
94  }
95 
97  template <bool E2>
99  {
100  if (m_maxCount != q.m_maxCount)
101  {
102  delete[] m_list;
104  m_list = new T[m_maxCount];
105  }
107  m_first = 0;
108  for (size_t i = 0;i<m_currentCount;++i)
109  m_list[i] = q.m_list[(i+q.m_first) % m_maxCount];
110 
111  return *this;
112  }
113 
115  void resize(const size_t size)
116  {
117  if (E)
118  eraseAndClear();
119  delete[] m_list;
120  if (size > 0)
121  m_maxCount = size;
122  else
123  m_maxCount = 1;
124  m_list = new T[m_maxCount];
125  m_currentCount = 0;
126  m_first = 0;
127  }
128 
130  bool empty() const
131  {
132  return (m_currentCount == 0);
133  }
134 
136  size_type size() const
137  {
138  return m_maxCount;
139  }
140 
143  {
144  return m_currentCount;
145  }
146 
149  {
150  return m_list[m_first];
151  }
152 
154  const value_type& front() const
155  {
156  return m_list[m_first];
157  }
158 
161  {
162  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
163  }
164 
166  const value_type& back() const
167  {
168  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
169  }
170 
172  void push(const value_type& x)
173  {
174  if (m_currentCount == m_maxCount)
175  {
177  delete m_list[m_first];
178 
179  m_list[m_first] = x;
180  m_first = (m_first+1) % m_maxCount;
181  }
182  else
183  {
185  }
186  }
187 
189  void pop(void)
190  {
191  m_first = (m_first+1) % m_maxCount;
192  --m_currentCount;
193  }
194 
196  void popBack(void)
197  {
198  --m_currentCount;
199  }
200 
202  const value_type& operator[] (size_t index) const
203  {
204  if (index >= m_currentCount)
205  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
206  else
207  return m_list[(m_first + index) % m_maxCount];
208  }
209 
211  value_type& operator[] (size_t index)
212  {
213  if (index >= m_currentCount)
214  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
215  else
216  return m_list[(m_first + index) % m_maxCount];
217  }
218 
219  void clear(void)
220  {
221  m_currentCount = 0;
222  m_first = 0;
223  }
224 
225  void remove(size_t index)
226  {
227  if (index >= m_currentCount)
228  return;
229  if (index == 0)
230  pop();
231  else
232  {
233  --m_currentCount;
234  for (size_t i=index;i<m_currentCount;++i)
235  m_list[(m_first + i) % m_maxCount] = m_list[(1 + m_first + i) % m_maxCount];
236  }
237  }
238 };
239 
240 
242 
249 template <class T>
251 protected:
252  size_t m_maxCount;
254  size_t m_first;
255 
256  T* m_list;
257 public:
258  typedef T value_type;
259  typedef size_t size_type;
260 
263  {
264  if (size > 0)
265  m_maxCount = size;
266  else
267  m_maxCount = 1;
268  m_list = new T[m_maxCount];
269  m_currentCount = 0;
270  m_first = 0;
271  }
272 
275  {
277  m_list = new T[m_maxCount];
279  m_first = 0;
280  for (size_t i = 0;i<m_currentCount;++i)
281  m_list[i] = q.m_list[(i+q.m_first) % m_maxCount];
282  }
283 
284  void eraseAndClear(void)
285  {
286  for (size_t i = 0;i<m_currentCount;++i)
287  delete m_list[(i+m_first) % m_maxCount];
288  m_currentCount = 0;
289  m_first = 0;
290  }
291 
294  {
295  m_maxCount = 0;
296  delete[] m_list;
297  }
298 
301  {
302  if (m_maxCount != q.m_maxCount)
303  {
304  delete[] m_list;
306  m_list = new T[m_maxCount];
307  }
309  m_first = 0;
310  for (size_t i = 0;i<m_currentCount;++i)
311  m_list[i] = q.m_list[(i+q.m_first) % m_maxCount];
312 
313  return *this;
314  }
315 
317  void resize(const size_t size)
318  {
319  delete[] m_list;
320  if (size > 0)
321  m_maxCount = size;
322  else
323  m_maxCount = 1;
324  m_list = new T[m_maxCount];
325  m_currentCount = 0;
326  m_first = 0;
327  }
328 
330  bool empty() const
331  {
332  return (m_currentCount == 0);
333  }
334 
336  size_type size() const
337  {
338  return m_maxCount;
339  }
340 
343  {
344  return m_currentCount;
345  }
346 
349  {
350  return m_list[m_first];
351  }
352 
354  const value_type& front() const
355  {
356  return m_list[m_first];
357  }
358 
361  {
362  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
363  }
364 
366  const value_type& back() const
367  {
368  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
369  }
370 
372  void push(const value_type& x)
373  {
374  if (m_currentCount == m_maxCount)
375  {
376  m_list[m_first] = x;
377  m_first = (m_first+1) % m_maxCount;
378  }
379  else
380  {
382  }
383  }
384 
386  void push_front(const value_type& x)
387  {
389  if (m_currentCount == 0)
390  m_first = 0;
391  m_list[m_first] = x;
393  ++m_currentCount;
394  }
395 
397  void pop(void)
398  {
399  if (m_currentCount > 0)
400  {
401  m_first = (m_first+1) % m_maxCount;
402  --m_currentCount;
403  }
404  }
405 
407  void popBack(void)
408  {
409  if (m_currentCount > 0)
410  --m_currentCount;
411  }
412 
414  const value_type& operator[] (size_t index) const
415  {
416  if (index >= m_currentCount)
417  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
418  else
419  return m_list[(m_first + index) % m_maxCount];
420  }
421 
423  value_type& operator[] (size_t index)
424  {
425  if (index >= m_currentCount)
426  return m_list[(m_first + m_currentCount - 1) % m_maxCount];
427  else
428  return m_list[(m_first + index) % m_maxCount];
429  }
430 
431  void clear(void)
432  {
433  m_currentCount = 0;
434  m_first = 0;
435  }
436 
437  void remove(size_t index)
438  {
439  if (index >= m_currentCount)
440  return;
441  if (index == 0)
442  pop();
443  else
444  {
445  --m_currentCount;
446  for (size_t i=index;i<m_currentCount;++i)
447  m_list[(m_first + i) % m_maxCount] = m_list[(1 + m_first + i) % m_maxCount];
448  }
449  }
450 };
451 
452 } // end of xsens namespace
453 
454 #endif // XSENS_FIFOQUEUE_H
value_type & front()
Return the oldest element in the queue.
Definition: xsens_fifoqueue.h:348
size_type length() const
Return the number of elements currently in the queue.
Definition: xsens_fifoqueue.h:342
void resize(const size_t size)
Resize the queue, note that this function clears the queue.
Definition: xsens_fifoqueue.h:317
void clear(void)
Definition: xsens_fifoqueue.h:219
size_t m_currentCount
Definition: xsens_fifoqueue.h:253
size_t m_currentCount
Definition: xsens_fifoqueue.h:44
void popBack(void)
Remove the element at the back of the queue.
Definition: xsens_fifoqueue.h:407
void eraseAndClear(void)
Definition: xsens_fifoqueue.h:284
T * m_list
Definition: xsens_fifoqueue.h:48
const value_type & back() const
Return the newest element in the queue.
Definition: xsens_fifoqueue.h:366
void push(const value_type &x)
Insert x at the back of the queue.
Definition: xsens_fifoqueue.h:172
value_type & back()
Return the newest element in the queue.
Definition: xsens_fifoqueue.h:360
FifoQueue(size_type size=16, bool delOnOverwrite=true)
Create an empty queue with capacity size.
Definition: xsens_fifoqueue.h:54
FifoQueueBasic(size_type size=16)
Create an empty queue with capacity 'size'.
Definition: xsens_fifoqueue.h:262
void push(const value_type &x)
Insert x at the back of the queue.
Definition: xsens_fifoqueue.h:372
const value_type & back() const
Return the newest element in the queue.
Definition: xsens_fifoqueue.h:166
size_t m_first
Definition: xsens_fifoqueue.h:254
const value_type & front() const
Return the oldest element in the queue.
Definition: xsens_fifoqueue.h:354
bool empty() const
Return true if the queue is empty.
Definition: xsens_fifoqueue.h:130
void clear(void)
Definition: xsens_fifoqueue.h:431
void eraseAndClear(void)
Definition: xsens_fifoqueue.h:79
size_t size_type
The type of a 'size' value.
Definition: xsens_fifoqueue.h:51
size_type length() const
Return the number of elements currnetly in the queue.
Definition: xsens_fifoqueue.h:142
size_t m_maxCount
Definition: xsens_fifoqueue.h:43
A FIFO queue with limited length (cyclic).
Definition: xsens_fifoqueue.h:41
size_t m_first
Definition: xsens_fifoqueue.h:45
void push_front(const value_type &x)
Insert x at the front of the queue (LIFO operation).
Definition: xsens_fifoqueue.h:386
T value_type
The type of the value stored in this queue.
Definition: xsens_fifoqueue.h:50
size_t m_maxCount
Definition: xsens_fifoqueue.h:252
void resize(const size_t size)
Resize the queue, note that this function clears the queue.
Definition: xsens_fifoqueue.h:115
FifoQueueBasic< T > & operator=(const FifoQueueBasic< T > &q)
The assignment operator.
Definition: xsens_fifoqueue.h:300
const value_type & operator[](size_t index) const
Return the index'th oldest item from the queue.
Definition: xsens_fifoqueue.h:414
const value_type & operator[](size_t index) const
Return the index'th oldest item from the queue.
Definition: xsens_fifoqueue.h:202
size_type size() const
Return the maximum number of elements in the queue.
Definition: xsens_fifoqueue.h:136
void popBack(void)
Remove the element at the back of the queue.
Definition: xsens_fifoqueue.h:196
size_t size_type
The type of a 'size' value.
Definition: xsens_fifoqueue.h:259
T * m_list
Definition: xsens_fifoqueue.h:256
A FIFO queue with limited length (cyclic).
Definition: xsens_fifoqueue.h:250
FifoQueue(const FifoQueue< T, E2 > &q)
The copy constructor.
Definition: xsens_fifoqueue.h:68
const value_type & front() const
Return the oldest element in the queue.
Definition: xsens_fifoqueue.h:154
void pop(void)
Remove the element at the front of the queue.
Definition: xsens_fifoqueue.h:189
~FifoQueue()
The destructor.
Definition: xsens_fifoqueue.h:88
bool m_deleteOnOverwrite
Definition: xsens_fifoqueue.h:46
bool empty() const
Return true if the queue is empty.
Definition: xsens_fifoqueue.h:330
FifoQueueBasic(const FifoQueueBasic< T > &q)
The copy constructor.
Definition: xsens_fifoqueue.h:274
value_type & back()
Return the newest element in the queue.
Definition: xsens_fifoqueue.h:160
FifoQueue< T, E > & operator=(const FifoQueue< T, E2 > &q)
The assignment operator.
Definition: xsens_fifoqueue.h:98
void pop(void)
Remove the element at the front of the queue.
Definition: xsens_fifoqueue.h:397
size_type size() const
Return the maximum number of elements in the queue.
Definition: xsens_fifoqueue.h:336
value_type & front()
Return the oldest element in the queue.
Definition: xsens_fifoqueue.h:148
~FifoQueueBasic()
The destructor.
Definition: xsens_fifoqueue.h:293
T value_type
The type of the value stored in this queue.
Definition: xsens_fifoqueue.h:258