31#ifndef CIRCULARBUFFER_H
32#define CIRCULARBUFFER_H
46#include <QSharedPointer>
73 typedef QSharedPointer<CircularBuffer>
SPtr;
74 typedef QSharedPointer<const CircularBuffer>
ConstSPtr;
99 inline bool push(
const T* pArray,
unsigned int size);
109 inline bool push(
const T& newElement);
119 inline bool pop(T& element);
159 inline unsigned int mapIndex(
int& index);
160 unsigned int m_uiMaxNumElements;
162 int m_iCurrentReadIndex;
163 int m_iCurrentWriteIndex;
164 QSemaphore* m_pFreeElements;
165 QSemaphore* m_pUsedElements;
177: m_uiMaxNumElements(uiMaxNumElements)
178, m_pBuffer(new T[m_uiMaxNumElements])
179, m_iCurrentReadIndex(-1)
180, m_iCurrentWriteIndex(-1)
181, m_pFreeElements(new QSemaphore(m_uiMaxNumElements))
182, m_pUsedElements(new QSemaphore(0))
193 delete m_pFreeElements;
194 delete m_pUsedElements;
207 if (m_pFreeElements->tryAcquire(size, m_iTimeout)) {
208 for (
unsigned int i = 0; i < size; ++i) {
209 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = pArray[i];
211 const QSemaphoreReleaser releaser(m_pUsedElements, size);
228 if (m_pFreeElements->tryAcquire(1, m_iTimeout)) {
229 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = newElement;
230 const QSemaphoreReleaser releaser(m_pUsedElements, 1);
247 if (m_pUsedElements->tryAcquire(1, m_iTimeout)) {
248 element = m_pBuffer[mapIndex(m_iCurrentReadIndex)];
249 const QSemaphoreReleaser releaser(m_pFreeElements, 1);
260inline unsigned int CircularBuffer<T>::mapIndex(
int& index)
263 return index = ++aux % m_uiMaxNumElements;
271 delete m_pFreeElements;
272 m_pFreeElements =
new QSemaphore(m_uiMaxNumElements);
273 delete m_pUsedElements;
274 m_pUsedElements =
new QSemaphore(0);
276 m_iCurrentReadIndex = -1;
277 m_iCurrentWriteIndex = -1;
293 return m_pUsedElements->available();
301 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< QPair< double, double > > CircularBuffer_pair_double_double
CircularBuffer< short > CircularBuffer_short
CircularBuffer< double > CircularBuffer_double
CircularBuffer< Eigen::MatrixXd > CircularBuffer_Matrix_double
CircularBuffer< char > CircularBuffer_char
CircularBuffer< Eigen::MatrixXf > CircularBuffer_Matrix_float
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)