/*
Fix méretű körkörös puffer (circular/ring buffer)
Mire jó?
-----------
Egy fix méretű körkörös puffer egy olyan sor-típusú adatstruktúra, ahol a tárolókapacitás előre rögzített. Ha megtelik,
a legújabb elem felülírja a legrégebbit (tehát nem dob hibát/túlcsordulást, hanem "forog"). Ez például
hangfeldolgozásban, mérési adatoknál, loggerben, real-time rendszerekben alapvető.
Miért találták ki?
------------------
- Amikor előre ismert a maximális adatmennyiség, de nem akarsz/tudsz dinamikus memóriakezelést alkalmazni (pl. beágyazott rendszerek).
- Kritikus időzítésnél, ahol a legutolsó N adat a fontos – az összes régi már nem érdekel.
- STL-ben ilyen nincs! Az STL queue, deque sosem írja felül automatikusan a régit.
Jellemző felhasználás:
----------------------
- Realtime adatrögzítés, szenzorbufferelés, streamelés.
- Producer-consumer típusú problémák, ahol sosem állhat le a feldolgozás.
Miben más, mint az STL queue?
-----------------------------
- Az STL queue-ból nem lehet felülírással "túlcsordulni": ha megtelik, tovább nő.
- Itt garantált a maximális memóriahasználat, nincs allokáció.
- Automatikus törlés a legrégebbi elem rovására.
*/
#include <cassert>
#include <iostream>
using namespace std;
template<typename T, size_t N>
class Buffer {
T buffer[N]; // Statikus tömb
size_t head = 0; // Olvasási mutató
size_t tail = 0; // Írási mutató
size_t size_ = 0; // Jelenlegi elemszám, Google C++ Style Guide stílus
public:
// Új elem hozzáadása: ha tele van, automatikusan felülírja a legrégebbi elemet.
void push(const T& value) {
buffer[tail] = value;
tail = (tail + 1) % N;
if (size_ < N) {
++size_;
}
else {
// Tele van: head-et léptetjük (a legrégebbi eltűnik!)
head = (head + 1) % N;
}
}
// Legrégebbi elem eltávolítása (és visszaadása)
T pop() {
assert(size_ > 0);
T val = buffer[head];
head = (head + 1) % N;
--size_;
return val;
}
size_t size() const { return size_; }
// Kiírja a buffer aktuális tartalmát, logikai sorrendben
void print() const {
for (size_t i = 0, idx = head; i < size_; ++i, idx = (idx + 1) % N)
cout << buffer[idx] << " ";
cout << '\n';
}
};