summaryrefslogtreecommitdiff
path: root/common/GameUI/ObjectList.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /common/GameUI/ObjectList.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'common/GameUI/ObjectList.cpp')
-rw-r--r--common/GameUI/ObjectList.cpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/common/GameUI/ObjectList.cpp b/common/GameUI/ObjectList.cpp
new file mode 100644
index 0000000..7da1100
--- /dev/null
+++ b/common/GameUI/ObjectList.cpp
@@ -0,0 +1,243 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include <stdio.h>
+#include <malloc.h>
+#include "ObjectList.h"
+#include "tier1/strtools.h"
+
+//#include "port.h"
+//#include "mem.h"
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+ObjectList::ObjectList()
+{
+ head = tail = current = NULL;
+ number = 0;
+}
+
+ObjectList::~ObjectList()
+{
+ Clear( false );
+}
+
+bool ObjectList::AddHead(void * newObject)
+{
+ // create new element
+ element_t * newElement = (element_t *) calloc(1, sizeof(element_t));
+
+ if (newElement == NULL )
+ return false; // out of memory
+
+ // insert element
+ newElement->object = newObject;
+
+ if (head)
+ {
+ newElement->next = head;
+ head->prev = newElement;
+ };
+
+ head = newElement;
+
+ // if list was empty set new tail
+ if (tail==NULL) tail = head;
+
+ number++;
+
+ return true;
+
+}
+
+void * ObjectList::RemoveHead()
+{
+ void * retObj;
+
+ // check head is present
+ if (head)
+ {
+ retObj = head->object;
+ element_t * newHead = head->next;
+ if (newHead) newHead->prev = NULL;
+
+ // if only one element is in list also update tail
+ // if we remove this prev element
+ if (tail==head) tail = NULL;
+
+ free(head);
+ head = newHead;
+
+ number--;
+
+ } else
+ retObj = NULL;
+
+ return retObj;
+}
+
+bool ObjectList::AddTail(void * newObject)
+{
+ element_t * newElement = (element_t *) calloc(1, sizeof(element_t));
+
+ if (newElement == NULL)
+ return false; // out of memory;
+
+ newElement->object = newObject;
+
+ if (tail)
+ {
+ newElement->prev = tail;
+ tail->next = newElement;
+ }
+
+ tail = newElement;
+
+ // if list was empty set new head
+ if (head==NULL) head = tail;
+
+ number++;
+
+ return true;
+
+}
+
+void * ObjectList::RemoveTail()
+{
+ void * retObj;
+
+ // check tail is present
+ if (tail)
+ {
+ retObj = tail->object;
+ element_t * newTail = tail->prev;
+ if (newTail) newTail->next = NULL;
+
+ // if only one element is in list also update tail
+ // if we remove this prev element
+ if (head==tail) head = NULL;
+
+ free(tail);
+ tail = newTail;
+
+ number--;
+
+ } else
+ retObj = NULL;
+
+ return retObj;
+}
+
+bool ObjectList::IsEmpty()
+{
+ return ( head == NULL );
+}
+
+int ObjectList::CountElements()
+{
+ return number;
+}
+
+bool ObjectList::Contains(void * object)
+{
+ element_t * e = head;
+
+ while(e && e->object!=object) { e = e->next;}
+
+ if ( e )
+ {
+ current = e;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void ObjectList::Clear( bool freeElementsMemory )
+{
+ element_t * ne;
+
+ element_t * e = head;
+ while(e)
+ {
+ ne = e->next;
+
+ if ( freeElementsMemory && e->object )
+ free( e->object );
+
+ free(e);
+ e = ne;
+ }
+
+ head = tail = current = NULL;
+ number = 0;
+
+}
+
+bool ObjectList::Remove( void * object )
+{
+ element_t * e = head;
+
+ while(e && e->object!=object) { e = e->next;}
+
+ if (e!=NULL)
+ {
+ if (e->prev) e->prev->next = e->next;
+ if (e->next) e->next->prev = e->prev;
+ if (head==e) head = e->next;
+ if (tail==e) tail = e->prev;
+ if (current == e) current= e->next;
+ free(e);
+ number--;
+ }
+
+ return (e!=NULL);
+}
+
+void ObjectList::Init()
+{
+ head = tail = current = NULL;
+ number = 0;
+}
+
+void * ObjectList::GetFirst()
+{
+ if (head)
+ {
+ current = head->next;
+ return head->object;
+ }
+ else
+ {
+ current = NULL;
+ return NULL;
+ };
+
+}
+
+void * ObjectList::GetNext()
+{
+ void * retObj = NULL;
+ if (current)
+ {
+ retObj = current->object;
+ current = current->next;
+ }
+ return retObj;
+}
+
+bool ObjectList::Add(void *newObject)
+{
+ return AddTail( newObject );
+}
+