An implementation of a circular array allowing direct write and read.
CircularArray.cpp
- Committer:
- GLemasson
- Date:
- 2014-02-11
- Revision:
- 0:28766f5a758e
- Child:
- 1:5036a532fe62
File content as of revision 0:28766f5a758e:
#include "CircularArray.h" #include <cstring> template <typename T> CircularArray<T>::CircularArray(unsigned int capacity) { data = new T[capacity]; m_capacity=capacity m_full=false; m_empty=true; w=0; r=0; } template <typename T>CircularArray<T>::~CircularArray() { delete data[]; } template <typename T> T * CircularArray<T>::getWritePointer() { return data+w; } template <typename T> T * CircularArray<T>::getReadPointer(T * buffer,unsigned int num) { if(buffer==0 || num <=readable()) { return data+r; } else { memcpy(buffer,data+r,readable()); memcpy(buffer+readable(),data,num-readable()); return buffer; } } template <typename T> void CircularArray<T>::writeElements(unsigned int num) { w=(w+num)%m_capacity; m_full=r==w; } template <typename T> void CircularArray<T>::readElements(unsigned int num) { r=(r+num)%m_capacity; m_empty=r==w; } template <typename T> unsigned int CircularArray<T>::fillCapacity() { if(w>r || m_empty) { return m_capacity-w; } else { return r-w; } } template <typename T> unsigned int CircularArray<T>::freeSpace() { if(w>r || m_empty) { return fillCapacity()+r; } else { return fillCapacity(); } } template <typename T> unsigned int CircularArray<T>::readable() { if(w<r || m_full) { return m_capacity-r; } else { return w-r; } } template <typename T> unsigned int CircularArray<T>::size() { if(w<r || m_full) { return readable()+w; } else { return readable(); } } template <typename T> bool CircularArray<T>::full() { return m_full; } template <typename T> bool CircularArray<T>::empty() { return m_empty; }