v2.0.0
Loading...
Searching...
No Matches
circularbuffer.h
Go to the documentation of this file.
1//=============================================================================================================
30
31#ifndef CIRCULARBUFFER_H
32#define CIRCULARBUFFER_H
33
34//=============================================================================================================
35// INCLUDES
36//=============================================================================================================
37
38#include "../utils_global.h"
39
40//=============================================================================================================
41// QT INCLUDES
42//=============================================================================================================
43
44#include <QPair>
45#include <QSemaphore>
46#include <QSharedPointer>
47
48//=============================================================================================================
49// EIGEN INCLUDES
50//=============================================================================================================
51
52#include <Eigen/Core>
53
54//=============================================================================================================
55// DEFINE NAMESPACE UTILSLIB
56//=============================================================================================================
57
58namespace UTILSLIB
59{
60
61//=============================================================================================================
67template<typename T>
69{
70public:
71 typedef QSharedPointer<CircularBuffer> SPtr;
72 typedef QSharedPointer<const CircularBuffer> ConstSPtr;
73
74 //=========================================================================================================
80 explicit CircularBuffer(unsigned int uiMaxNumElements);
81
82 //=========================================================================================================
87
88 //=========================================================================================================
95 inline bool push(const T* pArray, unsigned int size);
96
97 //=========================================================================================================
103 inline bool push(const T& newElement);
104
105 //=========================================================================================================
111 inline bool pop(T& element);
112
113 //=========================================================================================================
117 void clear();
118
119 //=========================================================================================================
123 inline void pause(bool);
124
125 //=========================================================================================================
130
131 //=========================================================================================================
136
137private:
138 //=========================================================================================================
145 inline unsigned int mapIndex(int& index);
146 unsigned int m_uiMaxNumElements;
147 T* m_pBuffer;
148 int m_iCurrentReadIndex;
149 int m_iCurrentWriteIndex;
150 QSemaphore* m_pFreeElements;
151 QSemaphore* m_pUsedElements;
152 int m_iTimeout;
153
154 bool m_bPause;
155};
156
157//=============================================================================================================
158// DEFINE MEMBER METHODS
159//=============================================================================================================
160
161template<typename T>
162CircularBuffer<T>::CircularBuffer(unsigned int uiMaxNumElements)
163: m_uiMaxNumElements(uiMaxNumElements)
164, m_pBuffer(new T[m_uiMaxNumElements])
165, m_iCurrentReadIndex(-1)
166, m_iCurrentWriteIndex(-1)
167, m_pFreeElements(new QSemaphore(m_uiMaxNumElements))
168, m_pUsedElements(new QSemaphore(0))
169, m_iTimeout(1000)
170, m_bPause(false)
171{
172}
173
174//=============================================================================================================
175
176template<typename T>
178{
179 delete m_pFreeElements;
180 delete m_pUsedElements;
181 delete [] m_pBuffer;
182}
183
184//=============================================================================================================
185
186template<typename T>
187inline bool CircularBuffer<T>::push(const T* pArray, unsigned int size)
188{
189 if(m_bPause) {
190 return false;
191 }
192
193 if(m_pFreeElements->tryAcquire(size, m_iTimeout)) {
194 for(unsigned int i = 0; i < size; ++i) {
195 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = pArray[i];
196 }
197 const QSemaphoreReleaser releaser(m_pUsedElements, size);
198 } else {
199 return false;
200 }
201
202 return true;
203}
204
205//=============================================================================================================
206
207template<typename T>
208inline bool CircularBuffer<T>::push(const T& newElement)
209{
210 if(m_bPause) {
211 return false;
212 }
213
214 if(m_pFreeElements->tryAcquire(1, m_iTimeout)) {
215 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = newElement;
216 const QSemaphoreReleaser releaser(m_pUsedElements, 1);
217 } else {
218 return false;
219 }
220
221 return true;
222}
223
224//=============================================================================================================
225
226template<typename T>
227inline bool CircularBuffer<T>::pop(T& element)
228{
229 if(m_bPause) {
230 return false;
231 }
232
233 if(m_pUsedElements->tryAcquire(1, m_iTimeout)) {
234 element = m_pBuffer[mapIndex(m_iCurrentReadIndex)];
235 const QSemaphoreReleaser releaser(m_pFreeElements, 1);
236 } else {
237 return false;
238 }
239
240 return true;
241}
242
243//=============================================================================================================
244
245template<typename T>
246inline unsigned int CircularBuffer<T>::mapIndex(int& index)
247{
248 int aux = index;
249 return index = ++aux % m_uiMaxNumElements;
250}
251
252//=============================================================================================================
253
254template<typename T>
256{
257 delete m_pFreeElements;
258 m_pFreeElements = new QSemaphore(m_uiMaxNumElements);
259 delete m_pUsedElements;
260 m_pUsedElements = new QSemaphore(0);
261
262 m_iCurrentReadIndex = -1;
263 m_iCurrentWriteIndex = -1;
264}
265
266//=============================================================================================================
267
268template<typename T>
269inline void CircularBuffer<T>::pause(bool bPause)
270{
271 m_bPause = bPause;
272}
273
274//=============================================================================================================
275
276template<typename T>
278{
279 return m_pUsedElements->available();
280}
281
282//=============================================================================================================
283
284template<typename T>
286{
287 return m_pFreeElements->available();
288}
289
290//=============================================================================================================
291// TYPEDEF
292//=============================================================================================================
293
302
303} // NAMESPACE
304
305#endif // CIRCULARBUFFER_H
Public umbrella header for UTILSLIB exposing the UTILSSHARED_EXPORT macro and build-info accessors.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
CircularBuffer< QPair< int, int > > CircularBuffer_pair_int_int
CircularBuffer< Eigen::MatrixXf > CircularBuffer_Matrix_float
CircularBuffer< QPair< double, double > > CircularBuffer_pair_double_double
CircularBuffer< short > CircularBuffer_short
CircularBuffer< Eigen::MatrixXd > CircularBuffer_Matrix_double
CircularBuffer< double > CircularBuffer_double
CircularBuffer< char > CircularBuffer_char
CircularBuffer< int > CircularBuffer_int
Thread-safe lock-free circular (ring) buffer for producer-consumer data exchange between threads.
CircularBuffer(unsigned int uiMaxNumElements)
QSharedPointer< const CircularBuffer > ConstSPtr
bool push(const T *pArray, unsigned int size)
QSharedPointer< CircularBuffer > SPtr
bool push(const T &newElement)