All pastes #161871 Raw Edit

Untitled

public text v1 · immutable
·published 2006-09-05 21:48 UTC
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