#include <stdlib.h>
#include "Buffer.h"
Buffer::Buffer(uint8_t size)
{
this->size = size;//Imposto la varibile protetta che indica le dimensioni del buffer
this->array = this->firstElement = this->firstSpace = NULL;//Inizializzo i puntatori a NULL
if (this->size > 0)//Verifico che la dimensione sia maggiore di 0
{
this->array = (uint8_t*) malloc(this->size);//Alloco le celle di memoria necessarie ad archiviare i dati
if (this->array != NULL)//Verifico che l'allocazione sia riuscita
{
this->firstSpace = this->array;//Imposto il puntatore al primo spazio libero alla prima cella allocata
}
}
}
Buffer::~Buffer()
{
free(this->array);//Libero la memoria allocata per contenere i dati del buffer
}
bool Buffer::IsEmpty()
{
return this->firstElement == NULL;//Se il puntatore al primo elemento punta a NULL segno che il buffer è vuoto restituisco true
}
bool Buffer::IsFull()
{
return this->firstElement == this->firstSpace;//Se i puntatori del primo elemento e primo spazio libero puntano alla stessa cella segno che il buffer è pieno restituisco true
}
uint8_t Buffer::Count()
{
if(this->IsEmpty()) return 0;//Se il buffer è vuoto restituisco 0
if(this->IsFull()) return this->size;//Se il buffer è pieno restituisco la dimensione del buffer
if(this->firstElement < this->firstSpace) return this->firstSpace - this->firstElement;//Se il puntatore al primo elemento si trova prima del primo spazio libero restituisco la differenza tra i due
else return this->size - (this->firstElement - this->firstSpace);//Se il puntatore al primo elemento di trova dopo il primo spazio libero restituisco la dimensione del buffer meno la differenza tra il puntatore al primo elemento e il primo spazio libero
}
bool Buffer::Push(uint8_t val)
{
if (this->IsFull()) return false;//Se il buffer è pieno restituisco false
if (this->IsEmpty()) this->firstElement = this->firstSpace;//Se il buffer è vuoto imposto il puntatore al primo elemento al primo spazio libero
*this->firstSpace = val;//Imposto il valore nel primo spazio disponibile nel buffer
this->firstSpace++;//Sposto il puntatore una cella in avanti
if (this->array + this->size == this->firstSpace) this->firstSpace = this->array;//Se il puntatore sconfina in una zona al di fuori del buffer lo si reimposta alla prima cella allocata
return true;//Restituisco true se il valore è stato inserito correttamente
}
uint8_t Buffer::Pull()
{
uint8_t val;
if (this->IsEmpty()) return 0;//Se il buffer è vuoto restituisco 0
val = *this->firstElement;//Copio il valore nella variabile che verrà restituita
this->firstElement++;//Sposto il puntatore una cella in avanti
if (this->array + this->size == this->firstElement) this->firstElement = this->array;//Se il puntatore sconfina in una zona al di fuori del buffer lo si reimposta alla prima cella allocata
if (this->firstElement == this->firstSpace) this->firstElement = NULL;//Se i due puntatori finisco a puntare alla stessa cella come se il buffer fosse pieno reimposto il puntatore al primo elemento a null
return val;//Restituisco il valore
}
uint8_t Buffer::Pop()
{
if (this->IsEmpty()) return 0;//Se il buffer è vuoto restituisco 0
if (this->firstSpace == this->array) this->firstSpace += this->size - 1;//Se il puntatore al primo spazio libero punta alla prima cella allocata allora lo sposto all'ultima cella allocata
else this->firstSpace--;//In caso contrario sposto il puntatore al primo spazio libero indietro di una cella
if (this->firstElement == this->firstSpace) this->firstElement = NULL;//Se i due puntatori finisco a puntare alla stessa cella come se il buffer fosse pieno reimposto il puntatore al primo elemento a null
return *this->firstSpace;//Restituisco il valore
}