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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CircularArray.cpp Source File

CircularArray.cpp

00001 #include "CircularArray.h"
00002 #include <string.h>
00003 
00004 CircularArray::CircularArray(unsigned int capacity)
00005 {
00006     data = new uint8_t[capacity];
00007     m_capacity=capacity;
00008     m_full=false;
00009     m_empty=true;
00010     w=0;
00011     r=0;
00012     sizeRB=0;
00013     sizeWB=0;
00014     readerBuffer=0;
00015     writerBuffer=0;
00016 }
00017 CircularArray::~CircularArray()
00018 {
00019     delete[] data;
00020 }  
00021 
00022 
00023 void volatile_memcpy(volatile uint8_t * dest, volatile uint8_t * src, uint16_t num)
00024 {
00025     for(int i =0; i<num;i++)
00026     {
00027         dest[i]=src[i];
00028     }
00029 }
00030 
00031 uint8_t * CircularArray::getWritePointer()
00032 {
00033     return (uint8_t *)data+w;
00034 }
00035 
00036 
00037 uint8_t * CircularArray::getReadPointer(uint16_t num)
00038 {
00039     if(num <=readable())
00040     {
00041         return (uint8_t *)data+r;
00042     }
00043     else
00044     {
00045         if(sizeRB<num)
00046         {
00047             if(readerBuffer!=0) delete[] readerBuffer;
00048             readerBuffer = new uint8_t[num];
00049         }
00050         volatile_memcpy(readerBuffer,(uint8_t *)(data+r),readable());
00051         volatile_memcpy(readerBuffer+readable(),data,num-readable());
00052         return (uint8_t *)readerBuffer;
00053     }
00054 }
00055 
00056 
00057 void CircularArray::writeElements(unsigned int num)
00058 {
00059     w=(w+num)%m_capacity;
00060     m_full=r==w;
00061 }
00062 void CircularArray::readElements(unsigned int num)
00063 {
00064     r=(r+num)%m_capacity;
00065     m_empty=r==w;
00066     
00067 }
00068 unsigned int CircularArray::fillCapacity()
00069 {
00070     if(w>r || m_empty)
00071     {
00072         return m_capacity-w;
00073     }
00074     else
00075     {
00076         return r-w;
00077     }
00078 }
00079 unsigned int CircularArray::freeSpace()
00080 {
00081     if(w>r || m_empty)
00082     {
00083         return fillCapacity()+r;
00084     }
00085     else
00086     {
00087         return fillCapacity();
00088     }
00089     
00090 }
00091 unsigned int CircularArray::readable()
00092 {
00093     if(w<r || m_full)
00094     {
00095         return m_capacity-r;
00096     }
00097     else
00098     {
00099         return w-r;
00100     }
00101     
00102 }
00103 unsigned int CircularArray::size()
00104 {
00105     if(w<r || m_full)
00106     {
00107         return readable()+w;
00108     }
00109     else
00110     {
00111         return readable();
00112     }
00113     
00114 }
00115 bool CircularArray::full()
00116 {
00117     return m_full;
00118     
00119 }
00120 bool CircularArray::empty()
00121 {
00122     return m_empty;
00123 }