#include <limits>
#include <print>
#include <string>

// Basisklassen-Template für 'normalen' Drehschalter
// Default-Datentyp des Drehschalters ist unsigned short
template <typename T = unsigned short>
class Rotary
{
  protected:
    T value;    // akt. Wert
    T minValue; // kleinster Wert
    T maxValue; // groesster Wert
  public:
    // ctor, initialisiert Eigenschaften
    Rotary()
    {
        // Min/Max-Werte auf Bereichsgrenzen des
        // aktuellen Datentyps setzen
        value = minValue = std::numeric_limits<T>::min();
        maxValue = std::numeric_limits<T>::max();
    }
    // Drehschalter um eins erhoehen
    // aber nicht ueber obere Grenze
    void Increment()
    {
        if (value < maxValue)
           value++;
    }
    // Drehschalter um eins verringern
    // aber nicht unter untere Grenze
    void Decrement()
    {
        if (value > minValue)
            value--;
    }
    // Eigenschaften ausgeben
    void ShowProperties()
    {
        std::println("Min/Max: ({}/{}), akt. Wert: {}",
            minValue, maxValue, value);
    }
};


// Vom Klassentemplate Rotary abgeleitete Klasse
// TextRotary. Datentyp des Werts von Rotary ist
// defaultmaessig unsigned short.
template <int SIZE>
class TextRotary: public Rotary<>
{
   std::string textList[SIZE];
  public:
    TextRotary(std::string (&text)[SIZE])
    {
        // Texte umkopieren
        for (size_t index=0; index < SIZE; index++)
            textList[index] = text[index];
        // Min/Max Werte und Startwert setzen
        minValue = value = 0;
        maxValue = SIZE-1;
    }
    void ShowProperties()
    {
        std::println("Min/Max: ({}/{}), akt. Wert: {}",
            textList[minValue], textList[maxValue], textList[value]);
    }
};
