MNE-CPP  beta 1.0
circularbuffer_old.h
Go to the documentation of this file.
1 //=============================================================================================================
36 #ifndef CIRCULARBUFFEROLD_H
37 #define CIRCULARBUFFEROLD_H
38 
39 
40 //*************************************************************************************************************
41 //=============================================================================================================
42 // INCLUDES
43 //=============================================================================================================
44 
45 #include "generics_global.h"
46 #include "buffer.h"
47 
48 #include <typeinfo>
49 
50 
51 //*************************************************************************************************************
52 //=============================================================================================================
53 // QT STL INCLUDES
54 //=============================================================================================================
55 
56 //#include <utility> -> use instead QPair
57 #include <QPair>
58 #include <QVector>
59 #include <QDebug>
60 
61 
62 //*************************************************************************************************************
63 //=============================================================================================================
64 // QT INCLUDES
65 //=============================================================================================================
66 
67 #include <QSemaphore>
68 
69 
70 //*************************************************************************************************************
71 //=============================================================================================================
72 // DEFINE NAMESPACE IOBuffer
73 //=============================================================================================================
74 
75 namespace IOBuffer
76 {
77 
78 
79 //*************************************************************************************************************
80 //=============================================================================================================
81 // USED NAMESPACES
82 //=============================================================================================================
83 
84 
85 //=============================================================================================================
91 template<typename _Tp>
92 class CircularBuffer_old : public Buffer
93 {
94 public:
95  typedef QSharedPointer<CircularBuffer_old> SPtr;
96  typedef QSharedPointer<const CircularBuffer_old> ConstSPtr;
98  //=========================================================================================================
104  CircularBuffer_old(unsigned int uiMaxNumElements);
105 
106  //=========================================================================================================
111 
112  //=========================================================================================================
119  inline void push(const _Tp* pArray, unsigned int size);
120  //=========================================================================================================
126  inline void push(const _Tp& newElement);
127  //=========================================================================================================
133  inline _Tp pop();
134  //=========================================================================================================
138  void clear();
139 
140 private:
141  //=========================================================================================================
148  inline unsigned int mapIndex(int& index);
149  unsigned int m_uiMaxNumElements;
150  _Tp* m_pBuffer;
151  int m_iCurrentReadIndex;
152  int m_iCurrentWriteIndex;
153  QSemaphore* m_pFreeElements;
154  QSemaphore* m_pUsedElements;
155 };
156 
157 
158 //*************************************************************************************************************
159 //=============================================================================================================
160 // DEFINE MEMBER METHODS
161 //=============================================================================================================
162 
163 template<typename _Tp>
164 CircularBuffer_old<_Tp>::CircularBuffer_old(unsigned int uiMaxNumElements)
165 : Buffer(typeid(_Tp).name())
166 , m_uiMaxNumElements(uiMaxNumElements)
167 , m_pBuffer(new _Tp[m_uiMaxNumElements])
168 , m_iCurrentReadIndex(-1)
169 , m_iCurrentWriteIndex(-1)
170 , m_pFreeElements(new QSemaphore(m_uiMaxNumElements))
171 , m_pUsedElements(new QSemaphore(0))
172 {
173 
174 }
175 
176 
177 //*************************************************************************************************************
178 
179 template<typename _Tp>
181 {
182  delete m_pFreeElements;
183  delete m_pUsedElements;
184  delete [] m_pBuffer;
185 }
186 
187 
188 //*************************************************************************************************************
189 
190 template<typename _Tp>
191 inline void CircularBuffer_old<_Tp>::push(const _Tp* pArray, unsigned int size)
192 {
193  m_pFreeElements->acquire(size);
194  for(unsigned int i = 0; i < size; ++i)
195  m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = pArray[i];
196  m_pUsedElements->release(size);
197 }
198 
199 
200 //*************************************************************************************************************
201 
202 template<typename _Tp>
203 inline void CircularBuffer_old<_Tp>::push(const _Tp& newElement)
204 {
205  m_pFreeElements->acquire();
206  m_pBuffer[mapIndex(m_iCurrentWriteIndex)] = newElement;
207  m_pUsedElements->release();
208 }
209 
210 
211 //*************************************************************************************************************
212 
213 template<typename _Tp>
215 {
216  m_pUsedElements->acquire();
217  _Tp element = m_pBuffer[mapIndex(m_iCurrentReadIndex)];
218  m_pFreeElements->release();
219 
220  return element;
221 }
222 
223 
224 //*************************************************************************************************************
225 
226 template<typename _Tp>
227 inline unsigned int CircularBuffer_old<_Tp>::mapIndex(int& index)
228 {
229  return index = ++index % m_uiMaxNumElements;
230 }
231 
232 
233 //*************************************************************************************************************
234 
235 template<typename _Tp>
237 {
238  delete m_pFreeElements;
239  m_pFreeElements = new QSemaphore(m_uiMaxNumElements);
240  delete m_pUsedElements;
241  m_pUsedElements = new QSemaphore(0);
242 
243  m_iCurrentReadIndex = -1;
244  m_iCurrentWriteIndex = -1;
245 }
246 
247 
248 //*************************************************************************************************************
249 //=============================================================================================================
250 // TYPEDEF
251 //=============================================================================================================
252 
253 //ToDo Typedef -> warning visibility ignored -> dllexport/dllimport problem
254 
255 typedef GENERICSSHARED_EXPORT CircularBuffer_old<int> _int_CircularBuffer_old;
256 typedef GENERICSSHARED_EXPORT CircularBuffer_old<short> _short_CircularBuffer_old;
257 typedef GENERICSSHARED_EXPORT CircularBuffer_old<short*> _pShort_CircularBuffer_old;
258 typedef GENERICSSHARED_EXPORT CircularBuffer_old<char> _char_CircularBuffer_old;
259 typedef GENERICSSHARED_EXPORT CircularBuffer_old<double> _double_CircularBuffer_old;
260 typedef GENERICSSHARED_EXPORT CircularBuffer_old< QPair<int, int> > _int_int_pair_CircularBuffer_old;
261 typedef GENERICSSHARED_EXPORT CircularBuffer_old< QPair<double, double> > _double_double_pair_CircularBuffer_old;
263 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old dBuffer_old;
264 typedef GENERICSSHARED_EXPORT _int_CircularBuffer_old iBuffer_old;
265 typedef GENERICSSHARED_EXPORT _char_CircularBuffer_old cBuffer_old;
266 typedef GENERICSSHARED_EXPORT _pShort_CircularBuffer_old pShortBuffer_old;
267 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old MEGBuffer_old;
268 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old ECGBuffer_old;
269 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old RTServerBuffer_old;
270 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old DummyBuffer_old;
271 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old WaveletBuffer_old;
272 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old FilterBuffer_old;
273 typedef GENERICSSHARED_EXPORT _double_CircularBuffer_old GaborParticleBuffer_old;
275 } // NAMESPACE
276 
277 #endif // CIRCULARBUFFEROLD_H
QSharedPointer< CircularBuffer_old > SPtr
#define GENERICSSHARED_EXPORT
QSharedPointer< const CircularBuffer_old > ConstSPtr
generics library export/import macros.
CircularBuffer_old(unsigned int uiMaxNumElements)
The TEMPLATE CIRCULAR BUFFER provides a template for thread safe circular buffers.
Contains the declaration of the Buffer base class.
The Buffer class provides a base class for buffers.
Definition: buffer.h:63
void push(const _Tp *pArray, unsigned int size)