summaryrefslogtreecommitdiffstats
path: root/src/VBox/GuestHost/OpenGL/util/list.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-06 03:01:46 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-06 03:01:46 +0000
commitf8fe689a81f906d1b91bb3220acde2a4ecb14c5b (patch)
tree26484e9d7e2c67806c2d1760196ff01aaa858e8c /src/VBox/GuestHost/OpenGL/util/list.c
parentInitial commit. (diff)
downloadvirtualbox-f8fe689a81f906d1b91bb3220acde2a4ecb14c5b.tar.xz
virtualbox-f8fe689a81f906d1b91bb3220acde2a4ecb14c5b.zip
Adding upstream version 6.0.4-dfsg.upstream/6.0.4-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/util/list.c')
-rw-r--r--src/VBox/GuestHost/OpenGL/util/list.c314
1 files changed, 314 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/util/list.c b/src/VBox/GuestHost/OpenGL/util/list.c
new file mode 100644
index 00000000..83dcfaba
--- /dev/null
+++ b/src/VBox/GuestHost/OpenGL/util/list.c
@@ -0,0 +1,314 @@
+#include "cr_list.h"
+#include "cr_error.h"
+#include "cr_mem.h"
+
+#ifndef CR_TESTING_LIST /* vbox */
+# define CR_TESTING_LIST 0 /* vbox */
+#endif /* vbox */
+#if CR_TESTING_LIST
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
+
+struct CRListIterator {
+ void *element;
+ CRListIterator *prev;
+ CRListIterator *next;
+};
+
+struct CRList {
+ CRListIterator *head;
+ CRListIterator *tail;
+ unsigned size;
+};
+
+CRList *crAllocList( void )
+{
+ CRList *l = crAlloc( sizeof( CRList ) );
+ CRASSERT( l );
+
+ l->head = crAlloc( sizeof( CRListIterator ) );
+ CRASSERT( l->head );
+
+ l->tail = crAlloc( sizeof( CRListIterator ) );
+ CRASSERT( l->tail );
+
+ l->head->prev = NULL;
+ l->head->next = l->tail;
+
+ l->tail->prev = l->head;
+ l->tail->next = NULL;
+
+ l->size = 0;
+
+ return l;
+}
+
+void crFreeList( CRList *l )
+{
+ CRListIterator *t1;
+
+ CRASSERT( l != NULL );
+ t1 = l->head;
+ while ( t1 != NULL )
+ {
+ CRListIterator *t2 = t1;
+ t1 = t1->next;
+ t2->prev = NULL;
+ t2->next = NULL;
+ t2->element = NULL;
+ crFree( t2 );
+ }
+ l->size = 0;
+ crFree( l );
+}
+
+unsigned crListSize( const CRList *l )
+{
+ return l->size;
+}
+
+int crListIsEmpty( const CRList *l )
+{
+ CRASSERT( l != NULL );
+ return l->size == 0;
+}
+
+void crListInsert( CRList *l, CRListIterator *iter, void *elem )
+{
+ CRListIterator *p;
+
+ CRASSERT( l != NULL );
+ CRASSERT( iter != NULL );
+ CRASSERT( iter != l->head );
+
+ p = crAlloc( sizeof( CRListIterator ) );
+ CRASSERT( p != NULL );
+ p->prev = iter->prev;
+ p->next = iter;
+ p->prev->next = p;
+ iter->prev = p;
+
+ p->element = elem;
+ l->size++;
+}
+
+void crListErase( CRList *l, CRListIterator *iter )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( iter != NULL );
+ CRASSERT( iter != l->head );
+ CRASSERT( iter != l->tail );
+ CRASSERT( l->size > 0 );
+
+ iter->next->prev = iter->prev;
+ iter->prev->next = iter->next;
+
+ iter->prev = NULL;
+ iter->next = NULL;
+ iter->element = NULL;
+ crFree( iter );
+
+ l->size--;
+}
+
+void crListClear( CRList *l )
+{
+ CRASSERT( l != NULL );
+ while ( !crListIsEmpty( l ) )
+ {
+ crListPopFront( l );
+ }
+}
+
+void crListPushBack( CRList *l, void *elem )
+{
+ CRASSERT( l != NULL );
+ crListInsert( l, l->tail, elem );
+}
+
+void crListPushFront( CRList *l, void *elem )
+{
+ CRASSERT( l != NULL );
+ crListInsert( l, l->head->next, elem );
+}
+
+void crListPopBack( CRList *l )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( l->size > 0 );
+ crListErase( l, l->tail->prev );
+}
+
+void crListPopFront( CRList *l )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( l->size > 0 );
+ crListErase( l, l->head->next );
+}
+
+void *crListFront( CRList *l )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( l->size > 0 );
+ CRASSERT( l->head != NULL );
+ CRASSERT( l->head->next != NULL );
+ return l->head->next->element;
+}
+
+void *crListBack( CRList *l )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( l->size > 0 );
+ CRASSERT( l->tail != NULL );
+ CRASSERT( l->tail->prev != NULL );
+ return l->tail->prev->element;
+}
+
+CRListIterator *crListBegin( CRList *l )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( l->head != NULL );
+ CRASSERT( l->head->next != NULL );
+ return l->head->next;
+}
+
+CRListIterator *crListEnd( CRList *l )
+{
+ CRASSERT( l != NULL );
+ CRASSERT( l->tail != NULL );
+ return l->tail;
+}
+
+CRListIterator *crListNext( CRListIterator *iter )
+{
+ CRASSERT( iter != NULL );
+ CRASSERT( iter->next != NULL );
+ return iter->next;
+}
+
+CRListIterator *crListPrev( CRListIterator *iter )
+{
+ CRASSERT( iter != NULL );
+ CRASSERT( iter->prev != NULL );
+ return iter->prev;
+}
+
+void *crListElement( CRListIterator *iter )
+{
+ CRASSERT( iter != NULL );
+ return iter->element;
+}
+
+CRListIterator *crListFind( CRList *l, void *element, CRListCompareFunc compare )
+{
+ CRListIterator *iter;
+
+ CRASSERT( l != NULL );
+ CRASSERT( compare );
+
+ for ( iter = crListBegin( l ); iter != crListEnd( l ); iter = crListNext( iter ) )
+ {
+ if ( compare( element, iter->element ) == 0 )
+ {
+ return iter;
+ }
+ }
+ return NULL;
+}
+
+void crListApply( CRList *l, CRListApplyFunc apply, void *arg )
+{
+ CRListIterator *iter;
+
+ CRASSERT( l != NULL );
+ for ( iter = crListBegin( l ); iter != crListEnd( l ); iter = crListNext( iter ) )
+ {
+ apply( iter->element, arg );
+ }
+}
+
+#if CR_TESTING_LIST
+
+static void printElement( void *elem, void *arg )
+{
+ char *s = elem;
+ FILE *fp = arg;
+
+ CRASSERT( s != NULL );
+ CRASSERT( fp != NULL );
+ fprintf( fp, "%s ", s );
+}
+
+static void printList( CRList *l )
+{
+ CRASSERT( l != NULL );
+ crListApply( l, printElement, stderr );
+ fprintf( stderr, "\n" );
+}
+
+static int elementCompare( void *a, void *b )
+{
+ return strcmp( a, b );
+}
+
+int main( void )
+{
+ char *names[] = { "a", "b", "c", "d", "e", "f" };
+ CRList *l;
+ CRListIterator *iter;
+ int i, n;
+
+ n = sizeof( names ) / sizeof( names[0] );
+ fprintf( stderr, "n=%d\n", n );
+
+ l = crAllocList( );
+ for ( i = 0; i < n; ++i )
+ {
+ crListPushBack( l, names[i] );
+ }
+ printList( l );
+
+ crListPushFront( l, "x" );
+ printList( l );
+
+ crListPushBack( l, "y" );
+ printList( l );
+
+ crListPopFront( l );
+ printList( l );
+
+ crListPopBack( l );
+ printList( l );
+
+ iter = crListFind( l, "c", elementCompare );
+ CRASSERT( iter != NULL );
+ crListInsert( l, iter, "z" );
+ printList( l );
+
+ iter = crListFind( l, "d", elementCompare );
+ CRASSERT( iter != NULL );
+ crListErase( l, iter );
+ printList( l );
+
+ crListClear( l );
+ printList( l );
+ fprintf( stderr, "size: %u\n", crListSize( l ) );
+ fprintf( stderr, "is empty: %d\n", crListIsEmpty( l ) );
+
+ crListPushBack( l, "w" );
+ crListPushBack( l, "t" );
+ crListPushBack( l, "c" );
+ printList( l );
+
+ fprintf( stderr, "front: %s\n", ( char * ) crListFront( l ) );
+ fprintf( stderr, "back: %s\n", ( char * ) crListBack( l ) );
+ fprintf( stderr, "size: %u\n", crListSize( l ) );
+ fprintf( stderr, "is empty: %d\n", crListIsEmpty( l ) );
+
+ crFreeList( l );
+ return 0;
+}
+
+#endif /* CR_TESTING_LIST */