Add list_insert/append_ptr

This commit is contained in:
2023-01-03 14:04:03 +01:00
parent c13bea5ab4
commit a54a6af497
2 changed files with 22 additions and 3 deletions

View File

@ -38,12 +38,23 @@ void *list_create(int elem_size, int init_elem_n) {
return (unsigned char *) list_ptr + sizeof(list_meta_t);
}
unsigned int list_size(void *list_ptr) {
int list_size(const void *list_ptr) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
return list->size;
}
void *list_insert(void *list_ptr, void *elem, int n) {
void *ptr = NULL;
list_ptr = list_insert_ptr(list_ptr, &ptr, n);
if (list_ptr != NULL && ptr != NULL) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
memcpy(ptr, elem, list->elem_size);
}
return list_ptr;
}
void *list_insert_ptr(void *list_ptr, void **elem, int n) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
if (n < 0)
n = list->size + n + 1;
@ -58,7 +69,7 @@ void *list_insert(void *list_ptr, void *elem, int n) {
if (n < list->size)
memmove(array + (n + 1) * list->elem_size, array + n * list->elem_size, (list->size - n) * list->elem_size);
memcpy(array + n * list->elem_size, elem, list->elem_size);
*elem = array + n * list->elem_size;
list->size++;
return (unsigned char *) list + sizeof(list_meta_t);
@ -68,6 +79,10 @@ void *list_append(void *list_ptr, void *elem) {
return list_insert(list_ptr, elem, -1);
}
void *list_append_ptr(void *list_ptr, void **elem) {
return list_insert_ptr(list_ptr, elem, -1);
}
void *list_remove(void *list_ptr, int n) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
if (n < 0)

View File

@ -4,12 +4,16 @@
void *list_create(int elem_size, int init_elem_n);
unsigned int list_size(void *list_ptr);
int list_size(const void *list_ptr);
void *list_insert(void *list_ptr, void *elem, int n);
void *list_insert_ptr(void *list_ptr, void **elem, int n);
void *list_append(void *list_ptr, void *elem);
void *list_append_ptr(void *list_ptr, void **elem);
void *list_remove(void *list_ptr, int n);
void *list_clear(void *list_ptr);