An implementation of a circular array allowing direct write and read.
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Thu Sep 1 2022 12:04:03 by
1.7.2