
#include <iostream>
#include <array>
#include <stdexcept>
#include <algorithm>
#include <ranges>
#include <print>
using namespace std::string_literals;

import CData4;

// Demo-array anlegen und initialisieren
std::array<CData4, 4> demoObj{ CData4{"eins"s},CData4{"zwei"s},
                               CData4{"drei"s},CData4{"vier"s} };
// Lambda-Funktion zur Ausgabe eines Demo-Objekts
auto PData = [](const CData4& obj) {std::print("{},", obj); };

int main()
{
    // array ausgeben
    std::println("Arrayinhalt:");
    std::ranges::for_each(demoObj, PData);
    // array rueckwaerts ausgeben
    std::println("\nNun Rueckwaerts:");
    std::ranges::for_each(std::views::reverse(demoObj), PData);
    // Zugriff auf array Elemente
    // 2. Zugriff schlaegt fehl und loest Ausnahme aus
    try
    {
        std::println("\n1. Element: {}", demoObj.at(0));
        std::println("10. Element: ");
        demoObj.at(9) = CData4{ "neun"s };
    }
    catch (std::out_of_range& ex)
    {
        std::cout << "Fehler: " << ex.what() << '\n';
    }
    // array mit neuen Daten fuellen
    // und ausgeben
    std::println("Ueberschreiben mit neuen Objekten:");
    demoObj.fill(CData4{ "alles neu"s });
    std::ranges::for_each(demoObj, PData);
    std::println("");
}
