An implementation of a circular array allowing direct write and read.

Committer:
GLemasson
Date:
Tue Feb 11 18:41:26 2014 +0000
Revision:
0:28766f5a758e
Child:
1:5036a532fe62
An implementation of a circular array allowing drirect read and write

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GLemasson 0:28766f5a758e 1 #include "CircularArray.h"
GLemasson 0:28766f5a758e 2 #include <cstring>
GLemasson 0:28766f5a758e 3
GLemasson 0:28766f5a758e 4 template <typename T> CircularArray<T>::CircularArray(unsigned int capacity)
GLemasson 0:28766f5a758e 5 {
GLemasson 0:28766f5a758e 6 data = new T[capacity];
GLemasson 0:28766f5a758e 7 m_capacity=capacity
GLemasson 0:28766f5a758e 8 m_full=false;
GLemasson 0:28766f5a758e 9 m_empty=true;
GLemasson 0:28766f5a758e 10 w=0;
GLemasson 0:28766f5a758e 11 r=0;
GLemasson 0:28766f5a758e 12 }
GLemasson 0:28766f5a758e 13 template <typename T>CircularArray<T>::~CircularArray()
GLemasson 0:28766f5a758e 14 {
GLemasson 0:28766f5a758e 15 delete data[];
GLemasson 0:28766f5a758e 16 }
GLemasson 0:28766f5a758e 17 template <typename T> T * CircularArray<T>::getWritePointer()
GLemasson 0:28766f5a758e 18 {
GLemasson 0:28766f5a758e 19 return data+w;
GLemasson 0:28766f5a758e 20 }
GLemasson 0:28766f5a758e 21
GLemasson 0:28766f5a758e 22 template <typename T> T * CircularArray<T>::getReadPointer(T * buffer,unsigned int num)
GLemasson 0:28766f5a758e 23 {
GLemasson 0:28766f5a758e 24 if(buffer==0 || num <=readable())
GLemasson 0:28766f5a758e 25 {
GLemasson 0:28766f5a758e 26 return data+r;
GLemasson 0:28766f5a758e 27 }
GLemasson 0:28766f5a758e 28 else
GLemasson 0:28766f5a758e 29 {
GLemasson 0:28766f5a758e 30 memcpy(buffer,data+r,readable());
GLemasson 0:28766f5a758e 31 memcpy(buffer+readable(),data,num-readable());
GLemasson 0:28766f5a758e 32 return buffer;
GLemasson 0:28766f5a758e 33 }
GLemasson 0:28766f5a758e 34 }
GLemasson 0:28766f5a758e 35
GLemasson 0:28766f5a758e 36
GLemasson 0:28766f5a758e 37 template <typename T> void CircularArray<T>::writeElements(unsigned int num)
GLemasson 0:28766f5a758e 38 {
GLemasson 0:28766f5a758e 39 w=(w+num)%m_capacity;
GLemasson 0:28766f5a758e 40 m_full=r==w;
GLemasson 0:28766f5a758e 41 }
GLemasson 0:28766f5a758e 42 template <typename T> void CircularArray<T>::readElements(unsigned int num)
GLemasson 0:28766f5a758e 43 {
GLemasson 0:28766f5a758e 44 r=(r+num)%m_capacity;
GLemasson 0:28766f5a758e 45 m_empty=r==w;
GLemasson 0:28766f5a758e 46
GLemasson 0:28766f5a758e 47 }
GLemasson 0:28766f5a758e 48 template <typename T> unsigned int CircularArray<T>::fillCapacity()
GLemasson 0:28766f5a758e 49 {
GLemasson 0:28766f5a758e 50 if(w>r || m_empty)
GLemasson 0:28766f5a758e 51 {
GLemasson 0:28766f5a758e 52 return m_capacity-w;
GLemasson 0:28766f5a758e 53 }
GLemasson 0:28766f5a758e 54 else
GLemasson 0:28766f5a758e 55 {
GLemasson 0:28766f5a758e 56 return r-w;
GLemasson 0:28766f5a758e 57 }
GLemasson 0:28766f5a758e 58 }
GLemasson 0:28766f5a758e 59 template <typename T> unsigned int CircularArray<T>::freeSpace()
GLemasson 0:28766f5a758e 60 {
GLemasson 0:28766f5a758e 61 if(w>r || m_empty)
GLemasson 0:28766f5a758e 62 {
GLemasson 0:28766f5a758e 63 return fillCapacity()+r;
GLemasson 0:28766f5a758e 64 }
GLemasson 0:28766f5a758e 65 else
GLemasson 0:28766f5a758e 66 {
GLemasson 0:28766f5a758e 67 return fillCapacity();
GLemasson 0:28766f5a758e 68 }
GLemasson 0:28766f5a758e 69
GLemasson 0:28766f5a758e 70 }
GLemasson 0:28766f5a758e 71 template <typename T> unsigned int CircularArray<T>::readable()
GLemasson 0:28766f5a758e 72 {
GLemasson 0:28766f5a758e 73 if(w<r || m_full)
GLemasson 0:28766f5a758e 74 {
GLemasson 0:28766f5a758e 75 return m_capacity-r;
GLemasson 0:28766f5a758e 76 }
GLemasson 0:28766f5a758e 77 else
GLemasson 0:28766f5a758e 78 {
GLemasson 0:28766f5a758e 79 return w-r;
GLemasson 0:28766f5a758e 80 }
GLemasson 0:28766f5a758e 81
GLemasson 0:28766f5a758e 82 }
GLemasson 0:28766f5a758e 83 template <typename T> unsigned int CircularArray<T>::size()
GLemasson 0:28766f5a758e 84 {
GLemasson 0:28766f5a758e 85 if(w<r || m_full)
GLemasson 0:28766f5a758e 86 {
GLemasson 0:28766f5a758e 87 return readable()+w;
GLemasson 0:28766f5a758e 88 }
GLemasson 0:28766f5a758e 89 else
GLemasson 0:28766f5a758e 90 {
GLemasson 0:28766f5a758e 91 return readable();
GLemasson 0:28766f5a758e 92 }
GLemasson 0:28766f5a758e 93
GLemasson 0:28766f5a758e 94 }
GLemasson 0:28766f5a758e 95 template <typename T> bool CircularArray<T>::full()
GLemasson 0:28766f5a758e 96 {
GLemasson 0:28766f5a758e 97 return m_full;
GLemasson 0:28766f5a758e 98
GLemasson 0:28766f5a758e 99 }
GLemasson 0:28766f5a758e 100 template <typename T> bool CircularArray<T>::empty()
GLemasson 0:28766f5a758e 101 {
GLemasson 0:28766f5a758e 102 return m_empty;
GLemasson 0:28766f5a758e 103 }