Ringbuffer class
RingBuffer.cpp@2:959aad917307, 2016-01-13 (annotated)
- 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?
User | Revision | Line number | New 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 | */ |