36 #ifndef CIRCULARBUFFER_H
37 #define CIRCULARBUFFER_H
55 #include <QSharedPointer>
79 template<
typename _Tp>
83 typedef QSharedPointer<CircularBuffer>
SPtr;
84 typedef QSharedPointer<const CircularBuffer>
ConstSPtr;
107 inline void push(
const _Tp* pArray,
unsigned int size);
115 inline void push(
const _Tp& newElement);
135 inline void pause(
bool);
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;
176 template<
typename _Tp>
178 : m_uiMaxNumElements(uiMaxNumElements)
179 , m_pBuffer(new _Tp[m_uiMaxNumElements])
180 , m_iCurrentReadIndex(-1)
181 , m_iCurrentWriteIndex(-1)
182 , m_pFreeElements(new QSemaphore(m_uiMaxNumElements))
183 , m_pUsedElements(new QSemaphore(0))
192 template<
typename _Tp>
195 delete m_pFreeElements;
196 delete m_pUsedElements;
203 template<
typename _Tp>
208 m_pFreeElements->acquire(size);
209 for(
unsigned int i = 0; i < size; ++i)
210 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = pArray[i];
211 m_pUsedElements->release(size);
218 template<
typename _Tp>
221 m_pFreeElements->acquire();
222 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = newElement;
223 m_pUsedElements->release();
229 template<
typename _Tp>
235 m_pUsedElements->acquire();
236 element = m_pBuffer[mapIndex(m_iCurrentReadIndex)];
237 m_pFreeElements->release();
248 template<
typename _Tp>
252 return index = ++aux % m_uiMaxNumElements;
258 template<
typename _Tp>
261 delete m_pFreeElements;
262 m_pFreeElements =
new QSemaphore(m_uiMaxNumElements);
263 delete m_pUsedElements;
264 m_pUsedElements =
new QSemaphore(0);
266 m_iCurrentReadIndex = -1;
267 m_iCurrentWriteIndex = -1;
273 template<
typename _Tp>
282 template<
typename _Tp>
285 if((uint)m_pUsedElements->available() < 1)
288 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = 0;
291 m_pUsedElements->release(1);
302 template<
typename _Tp>
305 if((uint)m_pFreeElements->available() < 1)
308 m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = 0;
311 m_pFreeElements->release(1);
341 #endif // CIRCULARBUFFER_H
QSharedPointer< CircularBuffer > SPtr
#define GENERICSSHARED_EXPORT
generics library export/import macros.
CircularBuffer(unsigned int uiMaxNumElements)
void push(const _Tp *pArray, unsigned int size)
The TEMPLATE CIRCULAR BUFFER provides a template for thread safe circular buffers.
QSharedPointer< const CircularBuffer > ConstSPtr