mirror of
https://github.com/swaywm/sway.git
synced 2026-04-29 06:46:22 -04:00
Updated list operations
This commit is contained in:
parent
508200e83d
commit
6b05f44339
5 changed files with 63 additions and 58 deletions
|
|
@ -54,26 +54,6 @@ static bool resize(list_t *list) {
|
|||
return true;
|
||||
}
|
||||
|
||||
void list_add(list_t *list, const void *data) {
|
||||
if (!sway_assert(list && data, "Invalid argument") || !resize(list)) {
|
||||
return;
|
||||
}
|
||||
|
||||
size_t size = list->memb_size;
|
||||
uint8_t (*array)[size] = list->items;
|
||||
|
||||
memcpy(&array[list->length], data, size);
|
||||
++list->length;
|
||||
}
|
||||
|
||||
void *list_alloc(list_t *list) {
|
||||
if (!sway_assert(list, "Invalid argument") || !resize(list)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (uint8_t *)list->items + list->memb_size * list->length++;
|
||||
}
|
||||
|
||||
void list_insert(list_t *list, size_t index, const void *data) {
|
||||
if (!sway_assert(list && data && index <= list->length, "Invalid argument") ||
|
||||
!resize(list)) {
|
||||
|
|
@ -88,6 +68,14 @@ void list_insert(list_t *list, size_t index, const void *data) {
|
|||
++list->length;
|
||||
}
|
||||
|
||||
void list_add(list_t *list, const void *data) {
|
||||
if (!sway_assert(list && data, "Invalid argument")) {
|
||||
return;
|
||||
}
|
||||
|
||||
list_insert(list, list->length, data);
|
||||
}
|
||||
|
||||
static void shrink(list_t *list) {
|
||||
/* We shrink very sparse lists, but only down to a certain size.
|
||||
* The choice of >= 8 is somewhat arbitrary, but leaves a minimum
|
||||
|
|
@ -105,15 +93,6 @@ static void shrink(list_t *list) {
|
|||
}
|
||||
}
|
||||
|
||||
void list_remove(list_t *list) {
|
||||
if (!sway_assert(list, "Invalid argument") || list->length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
--list->length;
|
||||
shrink(list);
|
||||
}
|
||||
|
||||
void list_delete(list_t *list, size_t index) {
|
||||
if (!sway_assert(list && index < list->length, "Invalid argument")) {
|
||||
return;
|
||||
|
|
@ -127,6 +106,14 @@ void list_delete(list_t *list, size_t index) {
|
|||
shrink(list);
|
||||
}
|
||||
|
||||
void list_remove(list_t *list) {
|
||||
if (!sway_assert(list, "Invalid argument") || list->length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
list_delete(list, list->length - 1);
|
||||
}
|
||||
|
||||
void list_swap(list_t *list, size_t i1, size_t i2) {
|
||||
if (!sway_assert(list && i1 < list->length && i2 < list->length, "Invalid argument")) {
|
||||
return;
|
||||
|
|
@ -240,7 +227,20 @@ void list_foreach(list_t *list, void callback(void *item)) {
|
|||
}
|
||||
}
|
||||
|
||||
void list_free_with(list_t *list, void callback(void *item)) {
|
||||
void list_foreachp(list_t *list, void callback(void *item)) {
|
||||
if (!sway_assert(list && callback, "Invalid argument")) {
|
||||
return;
|
||||
}
|
||||
|
||||
size_t size = list->memb_size;
|
||||
uint8_t (*array)[size] = list->items;
|
||||
|
||||
for (size_t i = 0; i < list->length; ++i) {
|
||||
callback(*(void **)&array[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void list_free_with(list_t *list, freefn_t callback) {
|
||||
if (!sway_assert(callback, "Invalid argument") || !list) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -249,6 +249,15 @@ void list_free_with(list_t *list, void callback(void *item)) {
|
|||
list_free(list);
|
||||
}
|
||||
|
||||
void list_free_withp(list_t *list, freefn_t callback) {
|
||||
if (!sway_assert(callback, "Invalid argument") || !list) {
|
||||
return;
|
||||
}
|
||||
|
||||
list_foreachp(list, callback);
|
||||
list_free(list);
|
||||
}
|
||||
|
||||
void *list_end(list_t *list) {
|
||||
if (!sway_assert(list, "Invalid argument")) {
|
||||
return NULL;
|
||||
|
|
@ -256,7 +265,3 @@ void *list_end(list_t *list) {
|
|||
|
||||
return (uint8_t *)list->items + list->memb_size * list->length;
|
||||
}
|
||||
|
||||
void list_elem_free(void *item) {
|
||||
free(*(void **)item);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue