mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-29 16:06:06 +00:00
126 lines
2.7 KiB
C++
126 lines
2.7 KiB
C++
/* ---------------------------------------------------------------------------
|
|
Nullsoft Database Engine
|
|
--------------------
|
|
codename: Near Death Experience
|
|
--------------------------------------------------------------------------- */
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
|
|
Double-Linked List Class
|
|
|
|
Caution: The entire library relies on this base class. Modify with care!
|
|
|
|
--------------------------------------------------------------------------- */
|
|
|
|
#include "nde.h"
|
|
#include "LinkedList.h"
|
|
//---------------------------------------------------------------------------
|
|
LinkedListEntry *LinkedListEntry::GetNext(void) const
|
|
{
|
|
return Next;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
LinkedListEntry *LinkedListEntry::GetPrevious(void) const
|
|
{
|
|
return Previous;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
LinkedListEntry::LinkedListEntry()
|
|
{
|
|
//Int=0;
|
|
Next=NULL;
|
|
Previous=NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
LinkedListEntry::~LinkedListEntry()
|
|
{
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
LinkedList::LinkedList()
|
|
{
|
|
Head = NULL;
|
|
Foot = NULL;
|
|
NElements=0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
LinkedList::~LinkedList()
|
|
{
|
|
while (Head)
|
|
RemoveEntry(Head);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void LinkedList::AddEntry(LinkedListEntry *Entry, bool Cat)
|
|
{
|
|
#ifdef WIN32
|
|
//EnterCriticalSection(&Critical);
|
|
#endif
|
|
if (!Cat)
|
|
{
|
|
if (Head)
|
|
Head->Previous = Entry;
|
|
Entry->Next = Head;
|
|
Entry->Previous = NULL;
|
|
Head = Entry;
|
|
if (!Foot)
|
|
Foot = Entry;
|
|
}
|
|
else
|
|
{
|
|
if (Foot)
|
|
Foot->Next = Entry;
|
|
Entry->Previous = Foot;
|
|
Entry->Next = NULL;
|
|
Foot = Entry;
|
|
if (!Head)
|
|
Head = Entry;
|
|
}
|
|
NElements++;
|
|
#ifdef WIN32
|
|
//LeaveCriticalSection(&Critical);
|
|
#endif
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void LinkedList::RemoveEntry(LinkedListEntry *Entry)
|
|
{
|
|
if (!Entry) return;
|
|
#ifdef WIN32
|
|
//EnterCriticalSection(&Critical);
|
|
#endif
|
|
if (Entry->Next)
|
|
Entry->Next->Previous = Entry->Previous;
|
|
else
|
|
Foot = Entry->Previous;
|
|
if (Entry->Previous)
|
|
Entry->Previous->Next = Entry->Next;
|
|
else
|
|
Head = Entry->Next;
|
|
|
|
if (NElements > 0)
|
|
{
|
|
delete Entry;
|
|
NElements--;
|
|
}
|
|
#ifdef WIN32
|
|
//LeaveCriticalSection(&Critical);
|
|
#endif
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void LinkedList::WalkList(WalkListProc WalkProc, int ID, void *Data1, void *Data2)
|
|
{
|
|
if (!WalkProc) return;
|
|
LinkedListEntry *Entry = Head;
|
|
while (Entry)
|
|
{
|
|
if (!WalkProc(Entry, ID, Data1, Data2)) break;
|
|
Entry = Entry->Next;
|
|
}
|
|
} |