From 917cee5d0b9e9812ededb09a145544db2233f5c2 Mon Sep 17 00:00:00 2001 From: jf-home Date: Sun, 17 May 2026 21:28:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(internal):=20=E6=96=B0=E5=A2=9E=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=B1=BB=E5=9E=8B=E7=9A=84=E9=80=9A=E7=94=A8=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/demo.c | 15 ++++----- demo/demo_deque.c | 2 +- demo/demo_tree.c | 2 ++ include/deque.h | 1 + include/unicstl_internal.h | 22 +++++++++++++ src/unicstl_internal.c | 66 ++++++++++++++++++++++++++++++++++---- test/test.c | 8 +---- 7 files changed, 92 insertions(+), 24 deletions(-) diff --git a/demo/demo.c b/demo/demo.c index 8cc0245..3034dbc 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -17,13 +17,7 @@ void print_num(const void* obj) int compare_num(const void *obj, const void *obj2) { - int num1 = *(int*)obj; - int num2 = *(int*)obj2; - if(num1 == num2) - { - return 0; - } - return num1 > num2 ? 1 : -1; + return compare_int(obj, obj2); } void print_struct(const void* obj) @@ -55,6 +49,7 @@ void print_str(const void* obj) int main() { + log_init(); printf("----- unicstl demo -----\n"); // while (1) { @@ -62,11 +57,13 @@ int main() demo_stack(); demo_arraylist(); demo_deque(); - demo_tree(); + demo_heap(); - demo_graph(); + // demo_tree(); + // demo_graph(); } printf("----- unicstl ok -----\n"); + log_deinit(); return 0; } diff --git a/demo/demo_deque.c b/demo/demo_deque.c index cc90e48..380540d 100644 --- a/demo/demo_deque.c +++ b/demo/demo_deque.c @@ -348,8 +348,8 @@ static void demo_deque_struct(void) } } #endif - deque_free(&deque); + log_info("demo_deque_struct end\n"); } void demo_deque(void) diff --git a/demo/demo_tree.c b/demo/demo_tree.c index ac0ee94..1110a3e 100644 --- a/demo/demo_tree.c +++ b/demo/demo_tree.c @@ -39,6 +39,8 @@ void demo_avltree_num(void) int temp = 0; iterator_t iter = NULL; + log_info("avltree_num\n"); + tree_t tree = tree_avl_new(sizeof(int)); tree->print_obj = print_num; tree->compare = compare_num; diff --git a/include/deque.h b/include/deque.h index 5999228..5ac0cc5 100644 --- a/include/deque.h +++ b/include/deque.h @@ -15,6 +15,7 @@ #include "ringbuf.h" #include "segarray.h" +// 0.rinfbuf 1.segarray #define DEQUE_DEFAULT_SELECT 1 #if DEQUE_DEFAULT_SELECT == 1 diff --git a/include/unicstl_internal.h b/include/unicstl_internal.h index 3d98e70..119fc2d 100644 --- a/include/unicstl_internal.h +++ b/include/unicstl_internal.h @@ -214,6 +214,28 @@ typedef int (*compare_fun_t)(const void *obj, const void *obj2); int default_compare(const void *obj1, const void *obj2); void default_print_obj(const void *obj); +int compare_char(const void *obj1, const void *obj2); +int compare_int(const void *obj1, const void *obj2); +int compare_long(const void *obj1, const void *obj2); + +int compare_int8_t(const void *obj1, const void *obj2); +int compare_int16_t(const void *obj1, const void *obj2); +int compare_uint16_t(const void *obj1, const void *obj2); +int compare_int32_t(const void *obj1, const void *obj2); + +int compare_uint8_t(const void *obj1, const void *obj2); +int compare_uint16_t(const void *obj1, const void *obj2); +int compare_uint32_t(const void *obj1, const void *obj2); +int compare_uint64_t(const void *obj1, const void *obj2); + +int compare_size_t(const void *obj1, const void *obj2); +int compare_ssize_t(const void *obj1, const void *obj2); + +int compare_float(const void *obj1, const void *obj2); +int compare_double(const void *obj1, const void *obj2); + +int compare_string(const void *obj1, const void *obj2); + /** * @brief new capacity * diff --git a/src/unicstl_internal.c b/src/unicstl_internal.c index 341c260..cc039e0 100644 --- a/src/unicstl_internal.c +++ b/src/unicstl_internal.c @@ -1,27 +1,27 @@ /** * @file unicstl_internal.c * @author wenjf (Orig5826@163.com) - * @brief + * @brief * @version 0.1 * @date 2025-04-29 - * + * * @copyright Copyright (c) 2025 - * + * */ #include "unicstl_internal.h" -const char* unicstl_version(void) +const char *unicstl_version(void) { return UNICSTL_VERSION_STRING; } -int default_compare(const void* obj1, const void* obj2) +int default_compare(const void *obj1, const void *obj2) { printf("compare is not implemented!\n"); unicstl_assert(0); } -void default_print_obj(const void* obj) +void default_print_obj(const void *obj) { printf("print_obj is not implemented!\n"); unicstl_assert(0); @@ -30,7 +30,7 @@ void default_print_obj(const void* obj) size_t unicstl_new_capacity(size_t capacity) { size_t new_capacity = 0; - if(capacity == 0) + if (capacity == 0) { new_capacity = UNICSTL_CAPACITY_INIT; } @@ -46,3 +46,55 @@ size_t unicstl_new_capacity(size_t capacity) } return new_capacity; } + +#define UNICSTL_COMPARE_FUNC(type) \ + int compare_##type(const void *obj1, const void *obj2) \ + { \ + const type num1 = *(const type *)obj1; \ + const type num2 = *(const type *)obj2; \ + if (num1 < num2) return -1; \ + if (num1 > num2) return 1; \ + return 0; \ + } + +UNICSTL_COMPARE_FUNC(char) +UNICSTL_COMPARE_FUNC(short) +UNICSTL_COMPARE_FUNC(int) +UNICSTL_COMPARE_FUNC(long) +UNICSTL_COMPARE_FUNC(int8_t) +UNICSTL_COMPARE_FUNC(int16_t) +UNICSTL_COMPARE_FUNC(int32_t) +UNICSTL_COMPARE_FUNC(int64_t) +UNICSTL_COMPARE_FUNC(uint8_t) +UNICSTL_COMPARE_FUNC(uint16_t) +UNICSTL_COMPARE_FUNC(uint32_t) +UNICSTL_COMPARE_FUNC(uint64_t) +UNICSTL_COMPARE_FUNC(size_t) +UNICSTL_COMPARE_FUNC(ssize_t) + +int compare_double(const void *obj, const void *obj2) +{ + double num1 = *(double *)obj; + double num2 = *(double *)obj2; + if (num1 - num2 < 1e-9 || num2 - num1 < 1e-9) + { + return 0; + } + return num1 > num2 ? 1 : -1; +} + +int compare_float(const void *obj, const void *obj2) +{ + float num1 = *(float *)obj; + float num2 = *(float *)obj2; + if (num1 - num2 < 1e-9 || num2 - num1 < 1e-9) + { + return 0; + } + return num1 > num2 ? 1 : -1; +} + +int compare_string(const void *obj1, const void *obj2) +{ + return strcmp(*(const char **)obj1, *(const char **)obj2); +} diff --git a/test/test.c b/test/test.c index 75b4bf4..265e3b3 100644 --- a/test/test.c +++ b/test/test.c @@ -17,13 +17,7 @@ void print_num(const void* obj) int compare_num(const void *obj, const void *obj2) { - int num1 = *(int*)obj; - int num2 = *(int*)obj2; - if(num1 == num2) - { - return 0; - } - return num1 > num2 ? 1 : -1; + return compare_int(obj, obj2); } void print_struct(const void* obj)