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

CircularArray.cpp

Committer:
GLemasson
Date:
2014-02-11
Revision:
0:28766f5a758e
Child:
1:5036a532fe62

File content as of revision 0:28766f5a758e:

#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;
}