summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-01 14:03:40 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-01 14:03:40 -0500
commit9532606e6bc39ffe5128cec60a762545e4550052 (patch)
tree797be586ca8441f1ce842ef2e22c09c235a36baa /src
parent539b02f373b271ccf547f184321e6b3295d9008f (diff)
downloadlibalabaster-9532606e6bc39ffe5128cec60a762545e4550052.tar.gz
libalabaster-9532606e6bc39ffe5128cec60a762545e4550052.tar.bz2
libalabaster-9532606e6bc39ffe5128cec60a762545e4550052.zip
array: Add offset() to address the data pointer
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src')
-rw-r--r--src/array.c91
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 \