mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-20 09:04:43 +00:00
40 lines
1.6 KiB
C
40 lines
1.6 KiB
C
|
#pragma once
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include "mutex.h"
|
||
|
|
||
|
// List Interface
|
||
|
// Purpose: Unify and optimize the way QB64 references lists of objects (such as handles)
|
||
|
// Notes: Does not use index 0
|
||
|
struct list {
|
||
|
intptr_t user_structure_size;
|
||
|
intptr_t internal_structure_size;
|
||
|
uint8_t *structure; // block of structures of user-specified size
|
||
|
intptr_t structures;
|
||
|
intptr_t structures_last;
|
||
|
intptr_t *structure_freed; // quickly re-reference available structures after they have been removed
|
||
|
intptr_t *structure_freed_cleanup; // the previous *structure_freed memory block
|
||
|
intptr_t structures_freed;
|
||
|
intptr_t structures_freed_last;
|
||
|
intptr_t structure_base[64]; // every time the 'structure' block is full a new and larger block is allocated
|
||
|
// because the list doubles each time, 64 entries will never be exceeded
|
||
|
intptr_t structure_bases;
|
||
|
intptr_t *index; // pointers to the structures referred to by each index value
|
||
|
intptr_t *index_cleanup;
|
||
|
intptr_t indexes;
|
||
|
intptr_t indexes_last;
|
||
|
struct libqb_mutex *lock_add;
|
||
|
struct libqb_mutex *lock_remove;
|
||
|
};
|
||
|
|
||
|
list *list_new(intptr_t structure_size);
|
||
|
list *list_new_threadsafe(intptr_t structure_size);
|
||
|
void list_destroy(list *L);
|
||
|
|
||
|
intptr_t list_add(list *L);
|
||
|
intptr_t list_remove(list *L, intptr_t i); // returns -1 on success, 0 on failure
|
||
|
//
|
||
|
void *list_get(list *L, intptr_t i); // Returns a pointer to an index's structure
|
||
|
//
|
||
|
intptr_t list_get_index(list *L, void *structure); // Retrieves the index value of a structure
|