//- Copyright (c) 2008-2009 James Grenning
//- All rights reserved
//- For use by participants in Wingman Software training courses.


#include "CircularBuffer.h"

CircularBuffer::CircularBuffer(int capacity)
: capacity_(capacity)
, index(0)
, outdex(0)
, count(0)
{
    values = new int[capacity_];
}

CircularBuffer::~CircularBuffer()
{
    delete [] values;
}

bool CircularBuffer::isEmpty() const
{
    return index == outdex && !isFull();
}

bool CircularBuffer::isFull() const
{
    return count == capacity_;
}

void CircularBuffer::put(int value)
{
    if (count >= capacity_)
        throw CircularBufferException("Put to full circular buffer");

    count++;
    values[index] = value;

    index = nextDex(index);
}

int CircularBuffer::get()
{
    if (count == 0)
        throw CircularBufferException("Get from empty circular buffer");

    count--;
    int value = values[outdex];
    outdex = nextDex(outdex);
    return value;
}

int CircularBuffer::capacity() const
{
    return capacity_;
}


int CircularBuffer::nextDex(int dex) const
{
    if (++dex >= capacity_)
        dex = 0;
    return dex;
}
