31#ifndef CIRCULARBUFFER_H
32#define CIRCULARBUFFER_H
46#include <QSharedPointer>
75 typedef QSharedPointer<CircularBuffer>
SPtr;
76 typedef QSharedPointer<const CircularBuffer>
ConstSPtr;
101 inline bool push(
const T* pArray,
unsigned int size);
111 inline bool push(
const T& newElement);
121 inline bool pop(T& element);
161 inline unsigned int mapIndex(
int& index);
162 unsigned int m_uiMaxNumElements;
163 std::unique_ptr<T[]> m_pBuffer;
164 int m_iCurrentReadIndex;
165 int m_iCurrentWriteIndex;
166 std::unique_ptr<QSemaphore> m_pFreeElements;
167 std::unique_ptr<QSemaphore> m_pUsedElements;
179: m_uiMaxNumElements(uiMaxNumElements)
180, m_pBuffer(std::make_unique<T[]>(m_uiMaxNumElements))
181, m_iCurrentReadIndex(-1)
182, m_iCurrentWriteIndex(-1)
183, m_pFreeElements(std::make_unique<QSemaphore>(m_uiMaxNumElements))
184, m_pUsedElements(std::make_unique<QSemaphore>(0))
204 if (m_pFreeElements->tryAcquire(size, m_iTimeout)) {
205 for (
unsigned int i = 0; i < size; ++i) {
206 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = pArray[i];
208 const QSemaphoreReleaser releaser(m_pUsedElements.get(), size);
225 if (m_pFreeElements->tryAcquire(1, m_iTimeout)) {
226 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = newElement;
227 const QSemaphoreReleaser releaser(m_pUsedElements.get(), 1);
244 if (m_pUsedElements->tryAcquire(1, m_iTimeout)) {
245 element = m_pBuffer[mapIndex(m_iCurrentReadIndex)];
246 const QSemaphoreReleaser releaser(m_pFreeElements.get(), 1);
257inline unsigned int CircularBuffer<T>::mapIndex(
int& index)
260 return index = ++aux % m_uiMaxNumElements;
268 m_pFreeElements = std::make_unique<QSemaphore>(m_uiMaxNumElements);
269 m_pUsedElements = std::make_unique<QSemaphore>(0);
271 m_iCurrentReadIndex = -1;
272 m_iCurrentWriteIndex = -1;
288 return m_pUsedElements->available();
296 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)