rendered paste body#ifndef _HEADER_FUER_VERKETTETE_LISTEN__CRLIST__DEF_
#define _HEADER_FUER_VERKETTETE_LISTEN__CRLIST__DEF_
//--------------------------------------------------------------------------
template <class T> class CListEntry
{
public:
T* Data;
CListEntry* point2;
};
//--------------------------------------------------------------------------
struct CListSearchEx
{
void* CurEntry;
};
//--------------------------------------------------------------------------
template <class T> class CRList
{
public:
//--------------------------------------------------------------------------
// Konstruktor
//--------------------------------------------------------------------------
CRList ( )
{
ListRoot = NULL;
CurEntry = NULL;
ItemCount = 0;
}
//--------------------------------------------------------------------------
// Dekonstruktor
//--------------------------------------------------------------------------
~CRList( )
{
Clear();
}
//--------------------------------------------------------------------------
// Eintrag hinzufügen
//--------------------------------------------------------------------------
void Add( T* Item )
{
// Neuen Eintrag erstellen
CListEntry <T> *E = new CListEntry <T> ( );
// Daten eintragen
E->Data = Item;
E->point2 = ListRoot;
ListRoot = E;
// Anzahl hochzählen
++ItemCount;
}
//--------------------------------------------------------------------------
// Eintrag aus der Liste entfernen
//--------------------------------------------------------------------------
void Delete( T* Item )
{
CListEntry <T> *Last = NULL;
CListEntry <T> *Next = ListRoot;
CListEntry <T> *This = Next;
// Schleife um den Eintrag zu finden
for (; Next; This=Next )
{
Next = This->point2;
if ( This->Data == Item )
{
// Aktueller Sucheintrag löschen?
if ( This == CurEntry ) CurEntry = Next;
// Eintrag gefunden
delete This;
// Anzahl runterzählen
--ItemCount;
// Pointer neu setzen
if ( Last == NULL ) ListRoot = Next;
else Last->point2 = Next;
return;
}
else Last = This;
}
}
//--------------------------------------------------------------------------
// Leert die komplette Liste
//--------------------------------------------------------------------------
void Clear ( void )
{
CListEntry <T> *Next = ListRoot;
CListEntry <T> *This = Next;
// Löschen aller Einträge
for (; Next; This=Next )
{
Next = This->point2;
delete This;
}
// Variablen zurücksetzen
ListRoot = NULL;
CurEntry = NULL;
ItemCount = 0;
}
//--------------------------------------------------------------------------
// Anzahl Einträge zurückgeben
//--------------------------------------------------------------------------
unsigned GetItemCount( void )
{
return ItemCount;
}
//--------------------------------------------------------------------------
// Zum ersten Eintrag der Liste springen
//--------------------------------------------------------------------------
T* GetFirstItem( void )
{
if ( ListRoot==NULL ) return NULL;
CurEntry = ListRoot->point2;
if ( ListRoot==NULL ) return NULL;
return ListRoot->Data;
}
//--------------------------------------------------------------------------
// Zum nächsten Eintrag der Liste springen
//--------------------------------------------------------------------------
T* GetNextItem ( void )
{
T* ReturnValue;
if ( CurEntry == NULL ) return NULL;
ReturnValue = CurEntry->Data;
CurEntry = CurEntry->point2;
return ReturnValue;
}
//--------------------------------------------------------------------------
// Zum ersten Eintrag der Liste springen
//--------------------------------------------------------------------------
T* GetFirstItemEx( CListSearchEx &Search )
{
if ( ListRoot == NULL )
{
Search.CurEntry = NULL;
return NULL;
}
Search.CurEntry = (void*)ListRoot->point2;
if ( ListRoot == NULL ) return NULL;
return ListRoot->Data;
}
//--------------------------------------------------------------------------
// Zum nächsten Eintrag der Liste springen
//--------------------------------------------------------------------------
T* GetNextItemEx ( CListSearchEx &Search )
{
CListEntry <T> *This = (CListEntry <T> *)Search.CurEntry;
if ( This == NULL ) return NULL;
// Nächster Eintrag
Search.CurEntry = (void*)This->point2;
return This->Data;
}
//--------------------------------------------------------------------------
private:
CListEntry <T> *ListRoot; // Erster Eintrag der Liste
CListEntry <T> *CurEntry; // Eintrag für die GetNextItem-Funktion
unsigned ItemCount; // Anzahl Einträge in der Liste
};
//--------------------------------------------------------------------------
#endif