#ifndef INC_LISTE_HPP
#define INC_LISTE_HPP

#include "listtype.hpp"
#include "LISTENEL.hpp"



        /*
Die Klasse LISTE ist stellt Funktionen zur Verarbeitung von Listen zur Verfügung.
Wenn bei Datenslots eine Kardinalität von "m" (Many) angegeben wird, ist der Slot automatisch vom Typ LISTE. Der Programmierer ist dann selber dafür Verantwortlich, wie Elemente in die Liste eingefügt, gelöscht, bearbeitet etc. werden.
Selbstverständlich steht es dem Programmierer frei, diese Klasse durch eine eigene zu ersetzen.
*/
class LISTE  {


// erzeugt von US (Innovative Software) am 14.08.1991, 13:24
// letzte Änderung von US am 22.09.1991, 11:41

    public:
/*
Konstruktor zur Initialisierung der Slots.
*/
        LISTE();
/*
Das Erste Element der Liste wird zum aktuellen Element gemacht.
Wenn die Liste leer ist, ist das aktuelle Element 0.
Der Rückgabewert ist der Zeiger auf die Daten des aktuellen Elements, wenn die Liste nicht leer ist, sonst 0.
*/
        VOIDPTR GoFirst();
/*
Das letzte Element der Liste wird zum aktuellen Element gemacht.
Wenn die Liste leer ist, ist das aktuelle Element 0.
Der Rückgabewert ist der Zeiger auf die Daten des aktuellen Elements, wenn die Liste nicht leer ist, sonst 0.
*/
        VOIDPTR GoLast();
/*
Das nachfolgende Element des Aktuellen Elements der Liste wird zum aktuellen Element gemacht.
Wenn das aktuelle Element 0 ist, bleibt das aktuelle Element 0.
Der Rückgabewert ist der Zeiger auf die Daten des neuen aktuellen Elements, sonst 0.
*/
        VOIDPTR GoNext();
/*
Das verhergehende Element des Aktuellen Elements der Liste wird zum aktuellen Element gemacht.
Wenn das aktuelle Element 0 ist, bleibt das aktuelle Element 0.
Der Rückgabewert ist der Zeiger auf die Daten des neuen aktuellen Elements, sonst 0.
*/
        VOIDPTR GoPrevious();
/*
Diese Methode fügt ein Neues Element in die Liste vor dem aktuellen Element ein. Wenn das Aktuelle Element 0 ist, wird das neue Element an das Ende der Liste angehangen.

Die Parameter enthalten folgende Werte:

VOIDPTR Data: Zeiger auf die Daten des neuen Elements. Wenn dieser Parameter 0 ist, wird kein neues Element eingefügt.

DELETEPROC DeleteProc: Zeiger auf eine Funktion, die vor dem Löschen des Elements aufgerufen wird. Dieser Parameter darf 0 sein.

Der Rückgabewert ist ungleich 0, wenn das Einfügen erfolgreich war. Danach ist das neue Element das aktuelle Element.

*/
        int Insert(VOIDPTR Data, DELETEPROC DeleteProc);
/*
Diese Methode hängt ein Neues Element an das Ender der Liste.

Die Parameter enthalten folgende Werte:

VOIDPTR Data: Zeiger auf die Daten des neuen Elements. Wenn dieser Parameter 0 ist, wird kein neues Element angehängt.

DELETEPROC DeleteProc: Zeiger auf eine Funktion, die vor dem Löschen des Elements aufgerufen wird. Dieser Parameter darf 0 sein.

Der Rückgabewert ist ungleich 0, wenn das Anhängen erfolgreich war. Danach ist das neue Element das aktuelle Element.

*/
        int Append(VOIDPTR Data, DELETEPROC DeleteProc);
/*
Diese Methode liefert den Zeiger auf die Daten des aktuellen Elements zurück. Wenn das aktuelle Element 0 ist, wird eine 0 zurückgegeben.
*/
        VOIDPTR GetCurrent();
/*
Destruktor. Alle zur Liste gehörenden LISTENELEMENTE und ggf. der assoziierte Speicher werden gelöscht.
*/
        ~LISTE();
/*
Wenn das aktuelle Element ungleich 0 ist, wird es aus der Liste gelöscht. Das nachfolgende Element des zu löschenden Elements wird das neue aktuelle Element.
Der Rückgabewert ist ungleich 0, wenn das Löschen erfolgreich war.
*/
        int Delete();
/*
Wenn das aktuelle Element ungleich 0 ist, wird es aus der Liste gelöscht. Das nachfolgende Element des zu löschenden Elements wird das neue aktuelle Element.
Der Rückgabewert ist ungleich 0, wenn das Löschen erfolgreich war.
Die Daten des LISTENELEMENTs werden nicht gelöscht!
*/
        int Exclude();
/*
Gibt die Anzahl der in der Liste enthaltenen Elemente zurück.
*/
        int GetElementCount();
/*
Diese Funktion ruft für jedes Element der Liste die 
Callback-Funktion auf, bis diese einen Wert ungleich 0 
zurückgibt oder alle Elemente abgearbeitet wurden. Der 
Rückgabewert von EnumElements ist gleich dem Rückgabewert 
des letzten Aufrufs der Callback-Funktion. Wenn die Liste leer ist, wird 0 zurückgegeben. 
 
Die Callback-Funktion muß folgende Syntax haben: 
 
long Callback(void* Data, va_list argptr); 
 
Gibt die Callback-Funktion Null zurück, wird, falls vorhanden, 
die Callback-Funktion für das nächste Element aufgerufen. Gibt 
sie einen  Wert ungleich Null zurück, wird EnumElements abgebrochen und dieser Wert als Ergebnis von EnumElements 
zurückgegegben. 
 
*/
        long EnumElements(LISTEENUMFUNC EnumFunc, ...);
/*
Diese Funktion ruft für jedes Element der Liste die Methode Delete auf. Dadurch werden alle Elemente gelöscht und ihr zugehöriger Speicher freigegeben, indem die zugehörige DeleteProc aufgerufen wird.
*/
        void DeleteAll();
/*
Diese Methode ruft für alle Listenelemente die Methode Exclude auf. Dadurch wird die Liste leer, die zugehörigen LISTENELEMENTE werden gelöscht, aber die zu den LISTENELEMENTEn gehörenden Daten werden nicht gelöscht (die DeleteProc wird nicht aufgerufen).
*/
        void ExcludeAll();
/*
Die Methode FindData sucht in der Liste nach dem ersten Element, daß mit den Daten, auf die DataPtr zeigt, assoziiert ist. 
Wenn kein Element gefunden wurde, ist der Rückgabewert und das aktuelle Element 0, sonst ist der Rückgabewert ungleich 0 und das Aktuelle Element zeigt auf das gefundene Element.

*/
        int FindData(VOIDPTR DataPtr);
    private:
/*
Integer, der die Anzahl der in dieser Liste enthaltenen Elemente enthält.
*/
        int AnzahlElemente;
/*
Referenz auf das erste Element der Liste. Wenn die Liste leer ist, ist ErstesElement gleich 0.
*/
        LISTENELEMENT* ErstesElement;
/*
Referenz auf das letzte Element der Liste. Wenn die Liste leer ist, ist LetztesElement gleich 0.
*/
        LISTENELEMENT* LetztesElement;
/*
Referenz auf das aktuelle Element der Liste. Dieser Slot kann auch dann 0 sein, wenn die Liste nicht leer ist. Wenn die Liste leer ist, ist dieser Slot auf jeden Fall gleich 0.
*/
        LISTENELEMENT* AktuellesElement;
/*
Enumfunktion für FindData
*/
        static long FindDataEnum(VOIDPTR Data, va_list argptr);
};

#endif
