aboutsummaryrefslogtreecommitdiff
path: root/Src/nde/LinkedList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nde/LinkedList.cpp')
-rw-r--r--Src/nde/LinkedList.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/Src/nde/LinkedList.cpp b/Src/nde/LinkedList.cpp
new file mode 100644
index 00000000..05f4d122
--- /dev/null
+++ b/Src/nde/LinkedList.cpp
@@ -0,0 +1,126 @@
+/* ---------------------------------------------------------------------------
+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;
+ }
+} \ No newline at end of file