Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Buffer circolare - Buffer.cpp

Buffer.cpp

Caricato da: Roby94
Scarica il programma completo

  1. #include <stdlib.h>
  2. #include "Buffer.h"
  3.  
  4. Buffer::Buffer(uint8_t size)
  5. {
  6.         this->size = size;//Imposto la varibile protetta che indica le dimensioni del buffer
  7.         this->array = this->firstElement = this->firstSpace = NULL;//Inizializzo i puntatori a NULL
  8.         if (this->size > 0)//Verifico che la dimensione sia maggiore di 0
  9.         {
  10.                 this->array = (uint8_t*) malloc(this->size);//Alloco le celle di memoria necessarie ad archiviare i dati
  11.                 if (this->array != NULL)//Verifico che l'allocazione sia riuscita
  12.                 {
  13.                         this->firstSpace = this->array;//Imposto il puntatore al primo spazio libero alla prima cella allocata
  14.                 }
  15.         }
  16. }
  17.  
  18. Buffer::~Buffer()
  19. {
  20.         free(this->array);//Libero la memoria allocata per contenere i dati del buffer
  21. }
  22.  
  23. bool Buffer::IsEmpty()
  24. {
  25.         return this->firstElement == NULL;//Se il puntatore al primo elemento punta a NULL segno che il buffer è vuoto restituisco true
  26. }
  27.  
  28. bool Buffer::IsFull()
  29. {
  30.         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
  31. }
  32.  
  33. uint8_t Buffer::Count()
  34. {
  35.         if(this->IsEmpty()) return 0;//Se il buffer è vuoto restituisco 0
  36.         if(this->IsFull()) return this->size;//Se il buffer è pieno restituisco la dimensione del buffer
  37.        
  38.         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
  39.         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
  40. }
  41.  
  42. bool Buffer::Push(uint8_t val)
  43. {
  44.         if (this->IsFull()) return false;//Se il buffer è pieno restituisco false
  45.        
  46.         if (this->IsEmpty()) this->firstElement = this->firstSpace;//Se il buffer è vuoto imposto il puntatore al primo elemento al primo spazio libero
  47.         *this->firstSpace = val;//Imposto il valore nel primo spazio disponibile nel buffer
  48.         this->firstSpace++;//Sposto il puntatore una cella in avanti
  49.         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
  50.         return true;//Restituisco true se il valore è stato inserito correttamente
  51. }
  52.  
  53. uint8_t Buffer::Pull()
  54. {
  55.         uint8_t val;
  56.         if (this->IsEmpty()) return 0;//Se il buffer è vuoto restituisco 0
  57.        
  58.         val = *this->firstElement;//Copio il valore nella variabile che verrà restituita
  59.         this->firstElement++;//Sposto il puntatore una cella in avanti
  60.         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
  61.         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
  62.         return val;//Restituisco il valore
  63. }
  64.  
  65. uint8_t Buffer::Pop()
  66. {
  67.         if (this->IsEmpty()) return 0;//Se il buffer è vuoto restituisco 0
  68.        
  69.         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
  70.         else this->firstSpace--;//In caso contrario sposto il puntatore al primo spazio libero indietro di una cella
  71.         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
  72.         return *this->firstSpace;//Restituisco il valore
  73. }