first and last commit
This commit is contained in:
commit
c9e78fd810
381 changed files with 37141 additions and 0 deletions
85
list.h
Normal file
85
list.h
Normal file
|
@ -0,0 +1,85 @@
|
|||
|
||||
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);
|
||||
}
|
Reference in a new issue