Ver Fonte

SCDArray_resize, SCDArray_clear, SCDArray_clear_no_resize

Aaro Saila há 1 mês atrás
pai
commit
1f37e3cc26
2 ficheiros alterados com 62 adições e 5 exclusões
  1. 41 5
      include/scufcont/DArray.h
  2. 21 0
      tests/cmocka/DArray_tests.c

+ 41 - 5
include/scufcont/DArray.h

@@ -25,7 +25,10 @@
     SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK, type, type_name, push_back)                   \
     SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_MULTIPLE, type, type_name, push_back_multiple) \
     SCDARRAY_EXPANDER(SCDARRAY_AT, type, type_name, at)                                 \
-    SCDARRAY_EXPANDER(SCDARRAY_REMOVE, type, type_name, remove)
+    SCDARRAY_EXPANDER(SCDARRAY_RESIZE, type, type_name, resize)                         \
+    SCDARRAY_EXPANDER(SCDARRAY_REMOVE, type, type_name, remove)                         \
+    SCDARRAY_EXPANDER(SCDARRAY_CLEAR_NO_RESIZE, type, type_name, clear_no_resize)       \
+    SCDARRAY_EXPANDER(SCDARRAY_CLEAR, type, type_name, clear)
 
 #define SCDARRAY_HEADER(type, type_name) \
     SCDARRAY_STRUCT(type, type_name)     \
@@ -38,7 +41,10 @@
     SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_SIG, type, type_name, push_back);                   \
     SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_MULTIPLE_SIG, type, type_name, push_back_multiple); \
     SCDARRAY_EXPANDER(SCDARRAY_AT_SIG, type, type_name, at);                                 \
-    SCDARRAY_EXPANDER(SCDARRAY_REMOVE_SIG, type, type_name, remove);
+    SCDARRAY_EXPANDER(SCDARRAY_RESIZE_SIG, type, type_name, resize);                         \
+    SCDARRAY_EXPANDER(SCDARRAY_REMOVE_SIG, type, type_name, remove);                         \
+    SCDARRAY_EXPANDER(SCDARRAY_CLEAR_NO_RESIZE_SIG, type, type_name, clear_no_resize);       \
+    SCDARRAY_EXPANDER(SCDARRAY_CLEAR_SIG, type, type_name, clear);
 
 // SCDARRAY_ALLOC_SIG(type, SCDArray_##type_name, SCDArray_##type_name##_alloc);
 // SCDARRAY_PUSH_BACK_SIG(type, SCDArray_##type_name, SCDArray_##type_name##_push_back);
@@ -81,7 +87,7 @@
 
 // SCDARRAY_ALLOC(int, SCDArray_int, SCDArray_int_alloc);
 
-#define SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) ScufContResult func_name(type_name* darr, const type *const new_elem)
+#define SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) ScufContResult func_name(type_name *darr, const type *const new_elem)
 
 #define SCDARRAY_PUSH_BACK(type, type_name, func_name)                                     \
     SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) {                                   \
@@ -142,15 +148,45 @@
 
 // SCDARRAY_AT(char*, SCDArray_charp, SCDArray_charp_at)
 
+#define SCDARRAY_RESIZE_SIG(type, type_name, func_name) void func_name(type_name *darr)
+
+#define SCDARRAY_RESIZE(type, type_name, func_name)                     \
+    SCDARRAY_RESIZE_SIG(type, type_name, func_name) {                   \
+        if (darr->len == 0) {                                           \
+            darr->data = realloc(darr->data, sizeof(type));             \
+        } else {                                                        \
+            darr->data = realloc(darr->data, sizeof(type) * darr->len); \
+        }                                                               \
+    }
+
 #define SCDARRAY_REMOVE_SIG(type, type_name, func_name) void func_name(type_name *darr, const size_t i)
 
 #define SCDARRAY_REMOVE(type, type_name, func_name)                                  \
     SCDARRAY_REMOVE_SIG(type, type_name, func_name) {                                \
         memmove(darr->data + i, darr->data + i + 1, (darr->len - i) * sizeof(type)); \
         darr->len--;                                                                 \
-        darr->data = realloc(darr->data, sizeof(type) * darr->len);                  \
+        type_name##_resize(darr);                                                  \
+    }
+
+// SCDARRAY_EXPANDER(SCDARRAY_REMOVE, char*, charp, remove)
+
+#define SCDARRAY_CLEAR_NO_RESIZE_SIG(type, type_name, func_name) void func_name(type_name *darr)
+
+#define SCDARRAY_CLEAR_NO_RESIZE(type, type_name, func_name)   \
+    SCDARRAY_CLEAR_NO_RESIZE_SIG(type, type_name, func_name) { \
+        darr->len = 0;                                         \
+    }
+
+// SCDARRAY_CLEAR_NO_RESIZE(char*, SCDArray_charp, SCDArray_charp_clear_no_resize)
+
+#define SCDARRAY_CLEAR_SIG(type, type_name, func_name) void func_name(type_name *darr)
+
+#define SCDARRAY_CLEAR(type, type_name, func_name)   \
+    SCDARRAY_CLEAR_SIG(type, type_name, func_name) { \
+        type_name##_clear_no_resize(darr);         \
+        type_name##_resize(darr);                  \
     }
 
-// SCDARRAY_REMOVE(char*, SCDArray_charp, SCDArray_charp_remove)
+// SCDARRAY_EXPANDER(SCDARRAY_CLEAR, char*, charp, clear)
 
 #endif // SCUFCONT_DARRAY_H_

+ 21 - 0
tests/cmocka/DArray_tests.c

@@ -126,6 +126,26 @@ void test_DArray_remove(void** state) {
     SCDArray_int_free(&arr);
 }
 
+void test_DArray_clear(void** state) {
+    (void) state;
+
+    SCDArray_int arr;
+    SCDArray_int_alloc(&arr);
+
+    for (int i = 1; i <= 10; i++) {
+        SCDArray_int_push_back(&arr, &i);
+    }
+
+    assert_uint_equal(arr.len, 10);
+    for (int i = 0; i < 10; i++) {
+        const int *const n = SCDArray_int_at(&arr, i);
+        assert_int_equal(*n, i + 1);
+    }
+
+    SCDArray_int_clear(&arr);
+    assert_uint_equal(arr.len, 0);
+}
+
 int DArray_tests_run(void) {
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(test_DArray_alloc),
@@ -133,6 +153,7 @@ int DArray_tests_run(void) {
         cmocka_unit_test(test_DArray_at),
         cmocka_unit_test(test_DArray_push_back_multiple),
         cmocka_unit_test(test_DArray_remove),
+        cmocka_unit_test(test_DArray_clear)
     };
 
     return cmocka_run_group_tests_name("DArray", tests, NULL, NULL);