Skip to content

Commit

Permalink
Merge branch 'yshui:next' into next
Browse files Browse the repository at this point in the history
  • Loading branch information
pijulius committed Jun 6, 2024
2 parents 9df22a4 + 4dc7878 commit 0834219
Showing 1 changed file with 24 additions and 5 deletions.
29 changes: 24 additions & 5 deletions src/utils/dynarr.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,17 +131,22 @@ static inline void dynarr_remove_swap_impl(size_t size, void *arr, size_t idx) {
/// Return whether the array is empty
#define dynarr_is_empty(arr) (dynarr_len(arr) == 0)

/// Clear the array, destructing each element with `dtor`.
#define dynarr_clear(arr, dtor) \
/// Reduce the length of the array to `n`, destructing each element with `dtor`. If `n`
/// is greater than the current length, this does nothing.
#define dynarr_truncate(arr, n, dtor) \
do { \
if ((dtor) != NULL) { \
for (size_t i = 0; i < dynarr_len(arr); i++) { \
for (size_t i = n; i < dynarr_len(arr); i++) { \
(dtor)((arr) + i); \
} \
} \
dynarr_len(arr) = 0; \
dynarr_len(arr) = n; \
} while (0)
#define dynarr_clear_pod(arr) dynarr_clear(arr, (void (*)(typeof(arr)))NULL)
#define dynarr_truncate_pod(arr, n) dynarr_truncate(arr, n, (void (*)(typeof(arr)))NULL)

/// Clear the array, destructing each element with `dtor`.
#define dynarr_clear(arr, dtor) dynarr_truncate(arr, 0, dtor)
#define dynarr_clear_pod(arr) dynarr_truncate_pod(arr, 0)

/// Extend the array by copying `n` elements from `other`
#define dynarr_extend_from(arr, other, n) \
Expand All @@ -164,3 +169,17 @@ static inline void dynarr_remove_swap_impl(size_t size, void *arr, size_t idx) {
#define dynarr_foreach(arr, i) for (typeof(arr)(i) = (arr); (i) < dynarr_end(arr); (i)++)
#define dynarr_foreach_rev(arr, i) \
for (typeof(arr)(i) = dynarr_end(arr) - 1; (i) >= (arr); (i)--)

/// Find the index of an element in the array by using trivial comparison, returns -1 if
/// not found.
#define dynarr_find_pod(arr, needle) \
({ \
ptrdiff_t dynarr_find_ret = -1; \
dynarr_foreach(arr, dynarr_find_i) { \
if (*dynarr_find_i == (needle)) { \
dynarr_find_ret = dynarr_find_i - (arr); \
break; \
} \
} \
dynarr_find_ret; \
})

0 comments on commit 0834219

Please sign in to comment.