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

Revision:
0:28766f5a758e
Child:
1:5036a532fe62
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CircularArray.cpp	Tue Feb 11 18:41:26 2014 +0000
@@ -0,0 +1,103 @@
+#include "CircularArray.h"
+#include <cstring>
+
+template <typename T> CircularArray<T>::CircularArray(unsigned int capacity)
+{
+    data = new T[capacity];
+    m_capacity=capacity
+    m_full=false;
+    m_empty=true;
+    w=0;
+    r=0;
+}
+template <typename T>CircularArray<T>::~CircularArray()
+{
+    delete data[];
+}  
+template <typename T> T * CircularArray<T>::getWritePointer()
+{
+    return data+w;
+}
+
+template <typename T> T * CircularArray<T>::getReadPointer(T * buffer,unsigned int num)
+{
+    if(buffer==0 || num <=readable())
+    {
+        return data+r;
+    }
+    else
+    {
+        memcpy(buffer,data+r,readable());
+        memcpy(buffer+readable(),data,num-readable());
+        return buffer;
+    }
+}
+
+
+template <typename T> void CircularArray<T>::writeElements(unsigned int num)
+{
+    w=(w+num)%m_capacity;
+    m_full=r==w;
+}
+template <typename T> void CircularArray<T>::readElements(unsigned int num)
+{
+    r=(r+num)%m_capacity;
+    m_empty=r==w;
+    
+}
+template <typename T> unsigned int CircularArray<T>::fillCapacity()
+{
+    if(w>r || m_empty)
+    {
+        return m_capacity-w;
+    }
+    else
+    {
+        return r-w;
+    }
+}
+template <typename T> unsigned int CircularArray<T>::freeSpace()
+{
+    if(w>r || m_empty)
+    {
+        return fillCapacity()+r;
+    }
+    else
+    {
+        return fillCapacity();
+    }
+    
+}
+template <typename T> unsigned int CircularArray<T>::readable()
+{
+    if(w<r || m_full)
+    {
+        return m_capacity-r;
+    }
+    else
+    {
+        return w-r;
+    }
+    
+}
+template <typename T> unsigned int CircularArray<T>::size()
+{
+    if(w<r || m_full)
+    {
+        return readable()+w;
+    }
+    else
+    {
+        return readable();
+    }
+    
+}
+template <typename T> bool CircularArray<T>::full()
+{
+    return m_full;
+    
+}
+template <typename T> bool CircularArray<T>::empty()
+{
+    return m_empty;
+}
\ No newline at end of file