Ringbuffer class
Revision 2:959aad917307, committed 2016-01-13
- Comitter:
- chris215
- Date:
- Wed Jan 13 05:31:28 2016 +0000
- Parent:
- 1:fa4c2377a741
- Commit message:
- 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
Changed in this revision
| RingBuffer.cpp | Show annotated file Show diff for this revision Revisions of this file |
| RingBuffer.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/RingBuffer.cpp Wed Jan 13 02:34:23 2016 +0000
+++ b/RingBuffer.cpp Wed Jan 13 05:31:28 2016 +0000
@@ -1,7 +1,61 @@
#include "RingBuffer.h"
+RingBuffer::RingBuffer(uint32_t NumberOfElements,uint32_t SizeOfElement)
+{
+ m_ElementSize = SizeOfElement;
+ m_size = NumberOfElements;
+ m_buf = new uint8_t[m_size*m_ElementSize];
+ m_latchingbuffer = new uint8_t[m_ElementSize];
+ clear();
+}
+RingBuffer::~RingBuffer()
+{
+ delete [] m_buf;
+ delete [] m_latchingbuffer;
+}
+void RingBuffer::clear(void)
+{
+ m_wloc = 0;
+ m_rloc = 0;
+ m_ActualCapacity = 0;
+ memset(m_buf, 0, m_size * m_ElementSize);
+ memset(m_latchingbuffer, 0, m_ElementSize);
+ return;
+}
+void RingBuffer::put(void* data)
+{
+ uint8_t* srcData = (uint8_t*)data;
+ uint8_t* dstData = m_buf + (m_wloc*m_ElementSize);
+
+ memcpy(dstData,srcData,m_ElementSize);
+
+ m_wloc++;
+ m_wloc %= (m_size);
+ m_ActualCapacity++;
+}
+int RingBuffer::get(void* data)
+{
+ uint8_t* SrcData = m_buf + (m_rloc*m_ElementSize);
+ uint8_t* dstData = (uint8_t*)data;
+ memcpy(dstData,SrcData,m_ElementSize);
+ m_rloc++;
+ m_rloc %= (m_size);
+ m_ActualCapacity--;
+ return 1;
+}
+void RingBuffer::LatchBuffer(void* DstBuffer)
+{
+ uint8_t* src = (uint8_t*)DstBuffer;
+ do
+ {
+ get(src);
+ src++;
+ }
+ while(m_ActualCapacity > 0);
+}
+/*
template <class T>
RingBuffer<T>::RingBuffer(uint32_t size)
{
@@ -103,4 +157,4 @@
template class RingBuffer<int64_t>;
template class RingBuffer<char>;
template class RingBuffer<wchar_t>;
-
+*/
--- a/RingBuffer.h Wed Jan 13 02:34:23 2016 +0000
+++ b/RingBuffer.h Wed Jan 13 05:31:28 2016 +0000
@@ -5,6 +5,34 @@
#include <stdint.h>
#include <string.h>
+class RingBuffer
+{
+ private:
+ uint8_t* m_buf;
+ uint8_t* m_latchingbuffer;
+ volatile uint32_t m_wloc;
+ volatile uint32_t m_rloc;
+ volatile uint32_t m_ActualCapacity;
+ uint32_t m_size;
+ uint32_t m_ElementSize;
+
+ public:
+ RingBuffer(uint32_t NumberOfElements = 128,uint32_t SizeOfElement = 1);
+ ~RingBuffer();
+
+ void put(void* data);
+ int get(void* data);
+
+ void clear(void);
+ uint32_t GetSize(){return m_size;}; //Return the size of the ring buffer
+
+ uint32_t GetCapacity(){return m_ActualCapacity;}; //Return the number of elements stored in the buffer
+
+ uint32_t GetElementSize(){return m_ElementSize;};
+
+ void LatchBuffer(void* DstBuffer);
+};
+/*
template <typename T>
class RingBuffer
{
@@ -36,5 +64,5 @@
};
-
+*/
#endif
\ No newline at end of file