#include <print>
#include <typeinfo>
#include <cstdlib>

import Graphics;

int main()
{
    // Anzahl der zu erstellenden Grafikobjekte
    constexpr auto NOOFOBJECTS = 10;

    // Zeigerfeld für Grafikobjekte anlegen
    GBase *pnObjects[NOOFOBJECTS];

    // Nun 10 zufällige Grafikobjekte erzeugen und ablegen
    for (auto& elem : pnObjects)
        elem = ClassFactory();

    // Grafikobjekte ausgeben
    for (auto elem : pnObjects)
        elem->Draw();

    // Die verschiedenen Grafikobjekte zählen
    auto noOfCircle = 0;
    auto noOfRect = 0;
    auto noOfPolygon = 0;
    for (auto elem: pnObjects)
    {
        // Falls Grafikobjekt ein Kreis ist
        if (typeid(*elem) == typeid(Circle))
            noOfCircle++;
        else
            // Falls Grafikobjekt ein Rechteck ist
            if (typeid(*elem) == typeid(Rect))
                noOfRect++;
            else
                // Grafikobjekt ist Polygon
                noOfPolygon++;
    }
    // Anzahl der verschiedenen Grafikobjekte ausgeben
    std::println("{} Objekte vom Typ {}\n{} Objekte vom Typ {}\n"
                 "{} Objekte vom Typ {}", noOfCircle, typeid(Circle).name(),
                 noOfRect, typeid(Rect).name(), noOfPolygon, typeid(Polygon).name());
}
