#include <utility>

// Funktionstemplate zum Tauschen von Werten beliebigen Datentyps
// Das Funktionstemplate verwendet die move() Funktion, d.h.
// sollten Objekte getauscht werden, so sollten diese die entsprechenden
// Move-Memberfunktionen definieren
template <typename T>
void Swap(T& val1, T& val2)
{
    T temp(std::move(val1));    // Move-Konstruktor verwenden!
    val1 = std::move(val2);     // Damit koennen auch Objekt getauscht werden
    val2 = std::move(temp);     // wenn diese den Operator = definieren
}

// Einfaches Funktionstemplate zum Sortieren von
// beliebigen Datentypen innerhalb eines Feldes
// pValues ist der Zeiger auf den Beginn des Datenfeldes
// und nNoOfValues enthaelt die Anzahl der Daten
template <typename T>
void Sort(T pValues, int const noOfValues)
{
    bool changed; // Tauschflag

    // Tauschschleife
    do
    {
        // Tauschflag zuruecksetzen
        changed = false;
        // Alle Elemente vergleichen
        for (auto index=0; index<noOfValues-1; index++)
        {
            // Falls getauscht werden muss
            if (pValues[index]>pValues[index+1])
            {
                // Werte tauschen
                Swap(pValues[index],pValues[index+1]);
                // Tauschflag setzen
                changed = true;
            }
        }
    } while (changed);
    // Schleife so lange durchlaufen, bis nicht mehr getauscht wurde
}
