From ad97de47a6222f7b7d189098fdec0ec238e43053 Mon Sep 17 00:00:00 2001 From: jun <83899451+zeichensystem@users.noreply.github.com> Date: Sun, 5 Jan 2025 02:45:54 +0100 Subject: [PATCH] Add dbuf_sort --- src/guf_common.h | 5 +++++ src/guf_dbuf.h | 21 ++++++++++++++++++--- src/guf_test.c | 8 +++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/guf_common.h b/src/guf_common.h index 72d8ebf..5d0dcd6 100644 --- a/src/guf_common.h +++ b/src/guf_common.h @@ -16,6 +16,11 @@ typedef enum guf_obj_cpy_opt { GUF_CPY_MOVE = 2, } guf_obj_cpy_opt; +typedef enum guf_sort_opt { + GUF_SORT_ASCENDING = 0, + GUF_SORT_DESCENDING = 1 +} guf_sort_opt; + // bool guf_alloc_init(void); // void *guf_malloc(size_t size, const char *name); // void *guf_calloc(size_t count, size_t size, const char *name); diff --git a/src/guf_dbuf.h b/src/guf_dbuf.h index f5dfb21..a98f64e 100644 --- a/src/guf_dbuf.h +++ b/src/guf_dbuf.h @@ -299,9 +299,24 @@ void GUFCAT(GUF_CNT_NAME, _free)(GUF_CNT_NAME *dbuf) dbuf->capacity = dbuf->size = 0; } -// void guf_dbuf_sort(guf_dbuf *dbuf, void (*cmp)(const void *a, const void *b)); -// void guf_dbuf_ascending(guf_dbuf *dbuf); -// void guf_dbuf_descending(guf_dbuf *dbuf); +void GUFCAT(GUF_CNT_NAME, _sort)(GUF_CNT_NAME *dbuf, guf_sort_opt sort_opt) +{ + GUF_ASSERT_RELEASE(GUFCAT(GUF_CNT_NAME, _valid_and_maybe_empty)(dbuf)); + + if (dbuf->size == 0) { + return; + } + + if (sort_opt == GUF_SORT_ASCENDING) { + GUF_ASSERT_RELEASE(GUF_CNT_T_OPS.cmp_void); + qsort(dbuf->data, dbuf->size, sizeof(GUF_CNT_T), GUF_CNT_T_OPS.cmp_void); + } else if (sort_opt == GUF_SORT_DESCENDING) { + GUF_ASSERT_RELEASE(GUF_CNT_T_OPS.cmp_void_inv); + qsort(dbuf->data, dbuf->size, sizeof(GUF_CNT_T), GUF_CNT_T_OPS.cmp_void_inv); + } else { + GUF_ASSERT_RELEASE(false); + } +} typedef struct GUFCAT(GUF_CNT_NAME, _iter) { GUF_CNT_T *cur, *end, *begin; diff --git a/src/guf_test.c b/src/guf_test.c index 7c11b27..d5d8ea6 100644 --- a/src/guf_test.c +++ b/src/guf_test.c @@ -71,14 +71,16 @@ int main(void) } dbuf_heap_cstr mut_strings = dbuf_heap_cstr_new(); - dbuf_heap_cstr_push_val_cpy(&mut_strings, "First mut!"); - dbuf_heap_cstr_push_val_cpy(&mut_strings, "Second mut!"); + dbuf_heap_cstr_push_val_cpy(&mut_strings, "1"); + dbuf_heap_cstr_push_val_cpy(&mut_strings, "2"); char *move_me_pls = calloc(128, sizeof(char)); - strcpy(move_me_pls, "Third mut"); + strcpy(move_me_pls, "3"); dbuf_heap_cstr_push(&mut_strings, &move_me_pls, GUF_CPY_MOVE); GUF_ASSERT_RELEASE(move_me_pls == NULL); + dbuf_heap_cstr_sort(&mut_strings, GUF_SORT_DESCENDING); + GUF_FOREACH(&mut_strings, dbuf_heap_cstr, it) { printf("str: %s\n", *it.cur); }