diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.c | 91 |
1 files changed, 51 insertions, 40 deletions
diff --git a/src/array.c b/src/array.c index 58d3c7f..3236f67 100644 --- a/src/array.c +++ b/src/array.c @@ -17,20 +17,31 @@ #define al_array_is_empty(arr) ((arr).size == 0) +#define al_array_offset(arr, i) ((arr).data + (i)) + #define al_array_at(arr, i) ((arr).data[i]) #define al_array_last(arr) al_array_at(arr, (arr).size - 1) #define al_array_reserve(arr, size) \ ((arr).alloc = _al_array_reserve((void *)&(arr).data, al_array_item_size(arr), (arr).alloc, size)) -#define al_array_clone(dest, src) \ -AL_MACRO_WRAP \ -({ \ - al_array_init(dest); \ - al_array_reserve(dest, (src).size); \ - (dest).size = (src).size; \ - al_memcpy(&al_array_at(dest, 0), &al_array_at(src, 0), \ - al_array_item_size(dest) * (dest).size); \ +#define al_array_clone(dest, src) \ +AL_MACRO_WRAP \ +({ \ + al_array_init(dest); \ + al_array_reserve(dest, (src).size); \ + (dest).size = (src).size; \ + al_memcpy(al_array_offset(dest, 0), al_array_offset(src, 0), \ + al_array_item_size(dest) * (dest).size); \ +}) + +#define al_array_copy(dest, src) \ +AL_MACRO_WRAP \ +({ \ + al_array_reserve(dest, (src).size); \ + (dest).size = (src).size; \ + al_memcpy(al_array_offset(dest, 0), al_array_offset(src, 0), \ + al_array_item_size(dest) * (dest).size); \ }) #define al_array_push(arr, item) \ @@ -40,19 +51,19 @@ AL_MACRO_WRAP \ al_array_at(arr, (arr).size++) = item; \ }) -#define al_array_insert(arr, i, item) \ -AL_MACRO_WRAP \ -({ \ - if ((arr).size > i) { \ - al_array_reserve(arr, (arr).size + 1); \ - al_memmove(&al_array_at(arr, i + 1), &al_array_at(arr, i), \ - al_array_item_size(arr) * ((arr).size - i)); \ - (arr).size++; \ - } else { \ - al_array_reserve(arr, i + 1); \ - (arr).size = i + 1; \ - } \ - al_array_at(arr, i) = item; \ +#define al_array_insert(arr, i, item) \ +AL_MACRO_WRAP \ +({ \ + if ((arr).size > i) { \ + al_array_reserve(arr, (arr).size + 1); \ + al_memmove(al_array_offset(arr, i + 1), al_array_offset(arr, i), \ + al_array_item_size(arr) * ((arr).size - i)); \ + (arr).size++; \ + } else { \ + al_array_reserve(arr, i + 1); \ + (arr).size = i + 1; \ + } \ + al_array_at(arr, i) = item; \ }) #define al_array_pop(arr) al_array_at(arr, --(arr).size) @@ -97,25 +108,25 @@ AL_MACRO_WRAP \ } \ }) -#define al_array_remove_at(arr, i) \ -AL_MACRO_WRAP \ -({ \ - if (i == (arr).size - 1) { \ - (arr).size--; \ - } else { \ - al_memmove(&al_array_at(arr, i), &al_array_at(arr, i + 1), \ - al_array_item_size(arr) * (--(arr).size - i)); \ - } \ +#define al_array_remove_at(arr, i) \ +AL_MACRO_WRAP \ +({ \ + if (i == (arr).size - 1) { \ + (arr).size--; \ + } else { \ + al_memmove(al_array_offset(arr, i), al_array_offset(arr, i + 1), \ + al_array_item_size(arr) * (--(arr).size - i)); \ + } \ }) -#define al_array_remove_range(arr, i, e) \ -AL_MACRO_WRAP \ -({ \ - if (e != (arr).size) { \ - al_memmove(&al_array_at(arr, i), &al_array_at(arr, e), \ - al_array_item_size(arr) * ((arr).size - e)); \ - } \ - (arr).size -= e - i; \ +#define al_array_remove_range(arr, i, e) \ +AL_MACRO_WRAP \ +({ \ + if (e != (arr).size) { \ + al_memmove(al_array_offset(arr, i), al_array_offset(arr, e), \ + al_array_item_size(arr) * ((arr).size - e)); \ + } \ + (arr).size -= e - i; \ }) #ifdef AL_USE_STDLIB @@ -134,10 +145,10 @@ AL_MACRO_WRAP \ for (u32 i = (arr).size; (i-- > 0 && (item = al_array_at(arr, i), 1));) #define al_array_foreach_ptr(arr, i, item) \ - for (u32 i = 0; (i < (arr).size && (item = &al_array_at(arr, i), 1)); i++) + for (u32 i = 0; (i < (arr).size && (item = al_array_offset(arr, i), 1)); i++) #define al_array_foreach_ptr_rev(arr, i, item) \ - for (u32 i = (arr).size; (i-- > 0 && (item = &al_array_at(arr, i), 1));) + for (u32 i = (arr).size; (i-- > 0 && (item = al_array_offset(arr, i), 1));) #define al_array_remove_at_iter(arr, i) \ AL_MACRO_WRAP \ |