An implementation of a circular array allowing direct write and read.
CircularArray.cpp@0:28766f5a758e, 2014-02-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |