#include <utility>

template <typename T>
class Buffer
{
    struct buffer
    {
        T       data;       // Nutzdatum
        bool    used;       // Abgelegtes Datum gueltig
    } *bufferPtr;           // Zeiger auf Ringpuffer
    unsigned int size;      // Ringpuffergroesse
    unsigned int in;        // Ablageindex
    unsigned int out;       // Ausleseindex
public:
    // ctor
    Buffer(unsigned int _size)
    {
       size = _size;    // Puffergroesse ablegen
       in = 0;          // Ablage- und
       out = 0;         // Ausleseindex initialisieren
       // Ringpuffer anlegen
       bufferPtr = new buffer[size];
       // Alle Elemente im Ringpuffer als nicht belegt kennzeichnen
       for (unsigned int index = 0; index < size; index++)
           bufferPtr[index].used = false;
    }
    // dtor, loescht Ringpuffer
    ~Buffer()
    {
        delete[] bufferPtr;
    }
    // Element data in Ringpuffer ablegen
    bool Insert(const T& data)
    {
        // Wenn naechste Stelle im Ringpuffer belegt
        if (bufferPtr[in].used)
            return false;
        // Datum ablegen und Ringpufferelement als belegt kennzeichnen
        bufferPtr[in].data = std::move(data);
        bufferPtr[in].used = true;
        // Ablageindex auf naechste Stelle
        if (++in == size)
            in = 0;
        return true;
    }
    // Element aus Ringpuffer auslesen und entfernen
    bool Remove(T& data)
    {
        // Wenn Ringpufferelement nicht belegt
        if (bufferPtr[out].used == false)
            return false;
        // Datum auslesen und Ringpufferelement als frei kennzeichnen
        data = std::move(bufferPtr[out].data);
        bufferPtr[out].used = false;
        // Ausleseindex auf naechste Stelle
        if (++out == size)
            out = 0;
        return true;
    }
};
