From 17365e6e2d1972c9987e2485be79249aa1d1e193 Mon Sep 17 00:00:00 2001 From: Aurelio Buonomo <48835871+auribuo@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:34:44 +0200 Subject: [PATCH] Added macro nob_da_swap to swap elements in a dynamic array --- nob.c | 1 + nob.h | 12 ++++++++++++ tests/da_swap.c | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 tests/da_swap.c diff --git a/nob.c b/nob.c index 912e05f..c9bd15b 100644 --- a/nob.c +++ b/nob.c @@ -15,6 +15,7 @@ const char *test_names[] = { "read_entire_dir", "da_resize", "da_last", + "da_swap", "da_remove_unordered", "da_append", "sb_appendf", diff --git a/nob.h b/nob.h index 8ab0cf5..e253557 100644 --- a/nob.h +++ b/nob.h @@ -321,6 +321,17 @@ bool nob_delete_file(const char *path); (da)->items[j] = (da)->items[--(da)->count]; \ } while(0) +#define nob_da_swap(da, i, j) \ + do { \ + size_t ii = (i); \ + size_t jj = (j); \ + NOB_ASSERT(ii < (da)->count); \ + NOB_ASSERT(jj < (da)->count); \ + nob_da_append((da), (da)->items[ii]); \ + (da)->items[ii] = (da)->items[jj]; \ + (da)->items[jj] = (da)->items[--((da)->count)]; \ + } while(0) + // Foreach over Dynamic Arrays. Example: // ```c // typedef struct { @@ -1927,6 +1938,7 @@ int closedir(DIR *dirp) #define da_reserve nob_da_reserve #define da_last nob_da_last #define da_remove_unordered nob_da_remove_unordered + #define da_swap nob_da_swap #define da_foreach nob_da_foreach #define String_Builder Nob_String_Builder #define read_entire_file nob_read_entire_file diff --git a/tests/da_swap.c b/tests/da_swap.c new file mode 100644 index 0000000..6cd4795 --- /dev/null +++ b/tests/da_swap.c @@ -0,0 +1,19 @@ +#define NOB_IMPLEMENTATION +#define NOB_STRIP_PREFIX +#include "nob.h" + +typedef struct { + int *items; + size_t count; + size_t capacity; +} Numbers; + +int main(void) +{ + nob_log(INFO, "da_swap:"); + Numbers xs = {0}; + for (int i = 1; i <= 10; ++i) da_append(&xs, i); + for (int i = 0; i < 5; ++i) da_swap(&xs, i, xs.count - i - 1); + for (int i = 0; i < 10; ++i) nob_log(INFO, "%d", xs.items[i]); + return 0; +}