#include <iostream>
#include <print>

#include "tmemfkt_01.h"

import CData2;        // Modul mit Demo-Klasse

int main()
{
    // Ringpuffer fuer 10 int-Daten
    Buffer<int> intBuffer(10);
    // 4 ints im Puffer ablegen
    std::println("Lege 4 int-Daten ab:");;
    for (int index = 0; index < 4; index++)
    {
        if (!intBuffer.Insert(index + 10))
        {
            std::println("Pufferueberlauf!!");
            break;
        }
        else
            std::print("{} ", index + 10);
    }
    // 2 ints wieder auslesen
    std::println("\nLese 2 int-Daten aus:");
    int idata;
    for (int index=0; index<2; index++)
    {
        if (!intBuffer.Remove(idata))
        {
            std::println("Puffer leer!");
            break;
        }
        std::print("{} ", idata);
    }
    // Puffer vollstaendig fuellen
    std::println("\nFuelle int-Puffer komplett:");
    idata = 100;
    while (intBuffer.Insert(++idata))
        std::print("{} ", idata);
    // Und wieder vollstaendig auslesen
    std::println("\nLeere int-Puffer komplett:");
    while (intBuffer.Remove(idata))
        std::print("{} ", idata);
    std::println();

    // Ringpuffer fuer 5 CData2-Objekte
    Buffer<CData2> data2Buffer(5);
    // Ringpuffer mit 3 Objekte belegen
    std::println("\nLege 3 CData2-Objekte ab:");
    for (size_t index=0; index<3; index++)
    {
        data2Buffer.Insert(CData2{index+2z});
    }
    std::println("Lese 1 CData2-Objekt aus :");
    CData2 resObj;
    data2Buffer.Remove(resObj);
    std::cout << resObj;
    // Puffer vollstaendig fuellen
    std::println("Fuelle CData2-Puffer komplett :");
    size_t index = 5;
    while (data2Buffer.Insert(CData2{ index++ }))
        ;
    // Und wieder vollstaendig auslesen
    std::println("Leere CData2-Puffer komplett:");
    while (data2Buffer.Remove(resObj))
        std::cout << resObj;
}
