module;
#include <print>

export module Grid;

// Klassendefinition
export class Grid
{
    short **ppGrid; // Zeiger auf 2-dimensionales Feld
    short rows;     // Anzahl der Reihen
    short cols;     // Anzahl der Spalten
public:
    Grid(short ro, short co);
    ~Grid();
    bool SetCell(short ro, short co, short v);
    void PrintIt() const;
};
// Definition der Memberfunktionen
// Konstruktor
Grid::Grid(short ro, short co)
{
    // Anzahl Reihen/Spalten merken
    rows = ro;
    cols = co;

    // Feld fuer Tabellenreihen-Zeiger reservieren
    ppGrid = new short*[rows];
    // Speicher fuer die Spalten reservieren
    for (auto index=0; index<rows; index++)
    {
        ppGrid[index] = new short[cols];
    }
}
// Destruktor
Grid::~Grid()
{
    // Alle Spaltenfelder freigeben
    for (auto index=0; index<rows; index++)
        delete [] ppGrid[index];
    // Feld mit Tabellenreihen-Zeiger freigeben
    delete [] ppGrid;
}
// Zelle in der Tabelle setzen
bool Grid::SetCell(short ro, short co, short v)
{
    bool retVal = true;
    // Reihen-/Spaltennummer abpruefen
    if ((ro<0) || (ro>=rows))
        retVal = false;
	else
	{
		 if ((co<0) || (co>=cols))
			 retVal = false;
		else
			// Zelle setzen
			ppGrid[ro][co] = v;
	}
	return retVal;
}
// Tabelle ausgeben
void Grid::PrintIt() const
{

    std::println("Tabelleninhalt\n==============");

    for (auto rIndex=0; rIndex<rows; rIndex++)
    {
        for (auto cIndex = 0; cIndex < cols; cIndex++)
            std::print("{:4}", ppGrid[rIndex][cIndex]);
        std::println();
    }
}
