module;
#include <print>

export module Stack;

// Stackgrösse
constexpr auto SSIZE = 10;
// Klassendefinition
export class Stack
{
   // Die Eigenschaften sind private und damit
   // gegen den direkten Zugriff geschützt
   short stackPtr;
   short values[SSIZE];
 public:
   // Die Memberfunktionen müssen public sein sonst
   // kann mit der Klasse nicht gearbeitet werden
   Stack();
   ~Stack();
   bool Push(short val);
   bool Pop(short& val);
};

// Definition der Memberfunktionen
// Konstruktor
Stack::Stack()
{
   stackPtr = 0;
   std::println("ctor: Stack initialisiert!");
}
// Destruktor
Stack::~Stack()
{
   std::println("Hole restliche Werte vom Stack:");
   while (stackPtr > 0)
   {
      std::print("{}, ",values[--stackPtr]);
   }
   std::println("\ndtor: Stack geleert!");
}
// Wert auf Stack ablegen
bool Stack::Push(short val)
{
   decltype(Push(val)) retval = false;
   // Falls Stack noch nicht voll ist
   if (stackPtr != SSIZE)
   {
      // Neuen Wert ablegen
      values[stackPtr++] = val;
      retval = true;
   }
   return retval;
}
// Wert vom Stack holen
bool Stack::Pop(short& val)
{
   decltype(Pop(val)) retval = false;
   // Falls noch Werte auf dem Stack
   if (stackPtr!=0)
   {
      // Wert vom Stack holen
      val = values[--stackPtr];
      retval = true;
   }
   return retval;
}
