31#ifndef CIRCULARBUFFER_H
32#define CIRCULARBUFFER_H
46#include <QSharedPointer>
71 typedef QSharedPointer<CircularBuffer>
SPtr;
72 typedef QSharedPointer<const CircularBuffer>
ConstSPtr;
95 inline bool push(
const T* pArray,
unsigned int size);
103 inline bool push(
const T& newElement);
111 inline bool pop(T& element);
145 inline unsigned int mapIndex(
int& index);
146 unsigned int m_uiMaxNumElements;
148 int m_iCurrentReadIndex;
149 int m_iCurrentWriteIndex;
150 QSemaphore* m_pFreeElements;
151 QSemaphore* m_pUsedElements;
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))
179 delete m_pFreeElements;
180 delete m_pUsedElements;
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];
197 const QSemaphoreReleaser releaser(m_pUsedElements, size);
214 if(m_pFreeElements->tryAcquire(1, m_iTimeout)) {
215 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = newElement;
216 const QSemaphoreReleaser releaser(m_pUsedElements, 1);
233 if(m_pUsedElements->tryAcquire(1, m_iTimeout)) {
234 element = m_pBuffer[mapIndex(m_iCurrentReadIndex)];
235 const QSemaphoreReleaser releaser(m_pFreeElements, 1);
246inline unsigned int CircularBuffer<T>::mapIndex(
int& index)
249 return index = ++aux % m_uiMaxNumElements;
257 delete m_pFreeElements;
258 m_pFreeElements =
new QSemaphore(m_uiMaxNumElements);
259 delete m_pUsedElements;
260 m_pUsedElements =
new QSemaphore(0);
262 m_iCurrentReadIndex = -1;
263 m_iCurrentWriteIndex = -1;
279 return m_pUsedElements->available();
287 return m_pFreeElements->available();
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
int getFreeElementsWrite()
bool push(const T *pArray, unsigned int size)
QSharedPointer< CircularBuffer > SPtr
int getFreeElementsRead()
bool push(const T &newElement)