Ringbuffer class

Committer:
chris215
Date:
Wed Jan 13 05:31:28 2016 +0000
Revision:
2:959aad917307
Parent:
1:fa4c2377a741
Removed templates usage and moved to byte pointers. This makes the ring buffer more generic and removes the requirement to know all templates in .cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris215 0:fed94e516719 1 #include "RingBuffer.h"
chris215 0:fed94e516719 2
chris215 2:959aad917307 3 RingBuffer::RingBuffer(uint32_t NumberOfElements,uint32_t SizeOfElement)
chris215 2:959aad917307 4 {
chris215 2:959aad917307 5 m_ElementSize = SizeOfElement;
chris215 2:959aad917307 6 m_size = NumberOfElements;
chris215 2:959aad917307 7 m_buf = new uint8_t[m_size*m_ElementSize];
chris215 2:959aad917307 8 m_latchingbuffer = new uint8_t[m_ElementSize];
chris215 2:959aad917307 9 clear();
chris215 2:959aad917307 10 }
chris215 2:959aad917307 11 RingBuffer::~RingBuffer()
chris215 2:959aad917307 12 {
chris215 2:959aad917307 13 delete [] m_buf;
chris215 2:959aad917307 14 delete [] m_latchingbuffer;
chris215 2:959aad917307 15 }
chris215 2:959aad917307 16 void RingBuffer::clear(void)
chris215 2:959aad917307 17 {
chris215 2:959aad917307 18 m_wloc = 0;
chris215 2:959aad917307 19 m_rloc = 0;
chris215 2:959aad917307 20 m_ActualCapacity = 0;
chris215 2:959aad917307 21 memset(m_buf, 0, m_size * m_ElementSize);
chris215 2:959aad917307 22 memset(m_latchingbuffer, 0, m_ElementSize);
chris215 2:959aad917307 23 return;
chris215 2:959aad917307 24 }
chris215 2:959aad917307 25 void RingBuffer::put(void* data)
chris215 2:959aad917307 26 {
chris215 2:959aad917307 27 uint8_t* srcData = (uint8_t*)data;
chris215 2:959aad917307 28 uint8_t* dstData = m_buf + (m_wloc*m_ElementSize);
chris215 2:959aad917307 29
chris215 2:959aad917307 30 memcpy(dstData,srcData,m_ElementSize);
chris215 2:959aad917307 31
chris215 2:959aad917307 32 m_wloc++;
chris215 2:959aad917307 33 m_wloc %= (m_size);
chris215 2:959aad917307 34 m_ActualCapacity++;
chris215 2:959aad917307 35 }
chris215 1:fa4c2377a741 36
chris215 2:959aad917307 37 int RingBuffer::get(void* data)
chris215 2:959aad917307 38 {
chris215 2:959aad917307 39 uint8_t* SrcData = m_buf + (m_rloc*m_ElementSize);
chris215 2:959aad917307 40 uint8_t* dstData = (uint8_t*)data;
chris215 2:959aad917307 41 memcpy(dstData,SrcData,m_ElementSize);
chris215 2:959aad917307 42 m_rloc++;
chris215 2:959aad917307 43 m_rloc %= (m_size);
chris215 2:959aad917307 44 m_ActualCapacity--;
chris215 2:959aad917307 45 return 1;
chris215 2:959aad917307 46 }
chris215 0:fed94e516719 47
chris215 2:959aad917307 48 void RingBuffer::LatchBuffer(void* DstBuffer)
chris215 2:959aad917307 49 {
chris215 2:959aad917307 50 uint8_t* src = (uint8_t*)DstBuffer;
chris215 2:959aad917307 51 do
chris215 2:959aad917307 52 {
chris215 2:959aad917307 53 get(src);
chris215 2:959aad917307 54 src++;
chris215 2:959aad917307 55 }
chris215 2:959aad917307 56 while(m_ActualCapacity > 0);
chris215 2:959aad917307 57 }
chris215 2:959aad917307 58 /*
chris215 0:fed94e516719 59 template <class T>
chris215 0:fed94e516719 60 RingBuffer<T>::RingBuffer(uint32_t size)
chris215 0:fed94e516719 61 {
chris215 0:fed94e516719 62 m_buf = new T[size];
chris215 0:fed94e516719 63 m_LatchedBuf = new T[size];
chris215 0:fed94e516719 64 m_size = size;
chris215 0:fed94e516719 65 clear();
chris215 0:fed94e516719 66
chris215 0:fed94e516719 67 return;
chris215 0:fed94e516719 68 }
chris215 0:fed94e516719 69
chris215 0:fed94e516719 70 template <class T>
chris215 0:fed94e516719 71 RingBuffer<T>::~RingBuffer()
chris215 0:fed94e516719 72 {
chris215 0:fed94e516719 73 delete [] m_buf;
chris215 0:fed94e516719 74
chris215 0:fed94e516719 75 return;
chris215 0:fed94e516719 76 }
chris215 0:fed94e516719 77
chris215 0:fed94e516719 78 template <class T>
chris215 0:fed94e516719 79 void RingBuffer<T>::clear(void)
chris215 0:fed94e516719 80 {
chris215 0:fed94e516719 81 m_SetBufferToReadOnly = false;
chris215 0:fed94e516719 82 m_wloc = 0;
chris215 0:fed94e516719 83 m_rloc = 0;
chris215 0:fed94e516719 84 m_ActualCapacity = 0;
chris215 0:fed94e516719 85 memset(m_buf, 0, m_size * sizeof(T));
chris215 0:fed94e516719 86 return;
chris215 0:fed94e516719 87 }
chris215 0:fed94e516719 88
chris215 0:fed94e516719 89 template <class T>
chris215 0:fed94e516719 90 uint32_t RingBuffer<T>::getSize()
chris215 0:fed94e516719 91 {
chris215 0:fed94e516719 92 return m_size;
chris215 0:fed94e516719 93 } //Return the size of the ring buffer
chris215 0:fed94e516719 94
chris215 0:fed94e516719 95 template <class T>
chris215 0:fed94e516719 96 uint32_t RingBuffer<T>::getCapacity()
chris215 0:fed94e516719 97 {
chris215 0:fed94e516719 98 return m_ActualCapacity;
chris215 0:fed94e516719 99 } //Return the number of elements stored in the buffer
chris215 0:fed94e516719 100
chris215 0:fed94e516719 101 template <class T>
chris215 0:fed94e516719 102 void RingBuffer<T>::put(T data)
chris215 0:fed94e516719 103 {
chris215 0:fed94e516719 104 if(!m_SetBufferToReadOnly)
chris215 0:fed94e516719 105 {
chris215 0:fed94e516719 106 m_buf[m_wloc++] = data;
chris215 0:fed94e516719 107 m_wloc %= (m_size);
chris215 0:fed94e516719 108 if(m_ActualCapacity >= m_size)
chris215 0:fed94e516719 109 {
chris215 0:fed94e516719 110 //we are overriding old data! lets increment the read pointer accordingly
chris215 0:fed94e516719 111 m_rloc++;
chris215 0:fed94e516719 112 m_rloc %= (m_size);
chris215 0:fed94e516719 113 }
chris215 0:fed94e516719 114 else
chris215 0:fed94e516719 115 m_ActualCapacity++;
chris215 0:fed94e516719 116
chris215 0:fed94e516719 117 }
chris215 0:fed94e516719 118 return;
chris215 0:fed94e516719 119 }
chris215 0:fed94e516719 120
chris215 0:fed94e516719 121 template <class T>
chris215 0:fed94e516719 122 T RingBuffer<T>::get(void)
chris215 0:fed94e516719 123 {
chris215 0:fed94e516719 124 T data_pos = 0;
chris215 0:fed94e516719 125 if(m_ActualCapacity > 0)
chris215 0:fed94e516719 126 {
chris215 0:fed94e516719 127 data_pos = m_buf[m_rloc++];
chris215 0:fed94e516719 128 m_rloc %= (m_size);
chris215 0:fed94e516719 129 m_ActualCapacity--;
chris215 0:fed94e516719 130 }
chris215 0:fed94e516719 131 else
chris215 1:fa4c2377a741 132 {
chris215 0:fed94e516719 133 m_SetBufferToReadOnly = false; //if we have and empty buffer ReadOnly is disabled automatically
chris215 1:fa4c2377a741 134 m_ActualCapacity = 0;
chris215 1:fa4c2377a741 135 }
chris215 0:fed94e516719 136 return data_pos;
chris215 0:fed94e516719 137 }
chris215 0:fed94e516719 138
chris215 0:fed94e516719 139 template <class T>
chris215 1:fa4c2377a741 140 void RingBuffer<T>::LatchBuffer(T* DstBuffer)
chris215 0:fed94e516719 141 {
chris215 1:fa4c2377a741 142 do
chris215 1:fa4c2377a741 143 {
chris215 1:fa4c2377a741 144 *DstBuffer++ = get();
chris215 1:fa4c2377a741 145 }
chris215 1:fa4c2377a741 146 while(m_ActualCapacity > 0);
chris215 0:fed94e516719 147 }
chris215 0:fed94e516719 148
chris215 1:fa4c2377a741 149 // make the linker aware of some possible types
chris215 1:fa4c2377a741 150 template class RingBuffer<uint8_t>;
chris215 1:fa4c2377a741 151 template class RingBuffer<int8_t>;
chris215 1:fa4c2377a741 152 template class RingBuffer<uint16_t>;
chris215 1:fa4c2377a741 153 template class RingBuffer<int16_t>;
chris215 1:fa4c2377a741 154 template class RingBuffer<uint32_t>;
chris215 1:fa4c2377a741 155 template class RingBuffer<int32_t>;
chris215 1:fa4c2377a741 156 template class RingBuffer<uint64_t>;
chris215 1:fa4c2377a741 157 template class RingBuffer<int64_t>;
chris215 1:fa4c2377a741 158 template class RingBuffer<char>;
chris215 1:fa4c2377a741 159 template class RingBuffer<wchar_t>;
chris215 2:959aad917307 160 */