Archived
1
0
Fork 0
This repository has been archived on 2025-09-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
skcblitz/list.h

86 lines
2 KiB
C
Raw Permalink Normal View History

2025-09-02 14:43:36 +02:00
uint lst_push(list_t *list) {
list_e *elem = list->free;
if(elem == NULL) {
return 0xffffffff;
}
list->free = list->free->f_next ? list->free->f_next : list->free->f_prev;
if(elem->f_prev) {
elem->f_prev->f_next = elem->f_next;
}
if(elem->f_next) {
elem->f_next->f_prev = elem->f_prev;
}
elem->f_next = elem->f_prev = NULL;
if(list->used && list->used->u_prev) {
list->used->u_prev->u_next = elem;
}
elem->u_prev = list->used ? list->used->u_prev : NULL; // unused
elem->u_next = list->used;
if(list->used) {
list->used->u_prev = elem;
}
list->used = elem;
list->stored += 1;
return elem->id;
}
void lst_pop(list_t *list, uint id) {
list_e *elem = &list->elems[id];
if(elem == list->used) {
list->used = list->used->u_next ? list->used->u_next : list->used->u_prev;
}
if(elem->u_prev) {
elem->u_prev->u_next = elem->u_next;
}
if(elem->u_next) {
elem->u_next->u_prev = elem->u_prev;
}
elem->u_next = elem->u_prev = NULL;
if(list->free && list->free->f_prev) {
list->free->f_prev->f_next = elem;
}
elem->f_prev = list->free ? list->free->f_prev : NULL;
elem->f_next = list->free;
if(list->free) {
list->free->f_prev = elem;
}
list->free = elem;
list->stored -= 1;
}
uint lst_iter(list_t *list, int *ptr) {
list_e *elem = ((*ptr) < 0) ? NULL : (((*ptr) == 0) ? list->used : &list->elems[(*ptr)-1]);
if(elem == NULL) {
return 0xffffffff;
}
*ptr = elem->u_next ? (elem->u_next->id + 1) : -1;
return elem->id;
}
void lst_clear(list_t *list) {
list_e *elem;
list->stored = 0;
list->used = NULL;
list->free = list->elems;
for(int z = 0; z < list->size; z++) {
elem = &list->elems[z];
elem->f_prev = (z == 0) ? NULL : &list->elems[z-1];
elem->f_next = (z == (list->size - 1)) ? NULL : &list->elems[z+1];
elem->u_prev = elem->u_next = NULL;
elem->id = z;
}
}
void lst_init(list_t *list, uint size, byte cat) {
list->size = size;
list->elems = mem_alloc(list->size * sizeof(table_e), cat);
lst_clear(list);
}
void lst_free(list_t *list) {
mem_free(list->elems);
}