ソースを参照

DArray copy function

Aaro Saila 1 週間 前
親
コミット
1c8e0be57c
2 ファイル変更、60 行追加、10 行削除
  1. 22 0
      include/scufcont/DArray.h
  2. 38 10
      tests/cmocka/DArray_tests.c

+ 22 - 0
include/scufcont/DArray.h

@@ -20,6 +20,7 @@
 
 #define SCDARRAY_IMPL(type, type_name)                                                  \
     SCDARRAY_EXPANDER(SCDARRAY_ALLOC, type, type_name, alloc)                           \
+    SCDARRAY_EXPANDER(SCDARRAY_ALLOC_COPY, type, type_name, alloc_copy)                 \
     SCDARRAY_EXPANDER(SCDARRAY_FREE, type, type_name, free)                             \
     SCDARRAY_EXPANDER(SCDARRAY_IS_NULL, type, type_name, is_null)                       \
     SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK, type, type_name, push_back)                   \
@@ -33,6 +34,7 @@
 
 #define SCDARRAY_SIGS(type, type_name)                                                       \
     SCDARRAY_EXPANDER(SCDARRAY_ALLOC_SIG, type, type_name, alloc);                           \
+    SCDARRAY_EXPANDER(SCDARRAY_ALLOC_COPY_SIG, type, type_name, alloc_copy);                 \
     SCDARRAY_EXPANDER(SCDARRAY_FREE_SIG, type, type_name, free);                             \
     SCDARRAY_EXPANDER(SCDARRAY_IS_NULL_SIG, type, type_name, is_null);                       \
     SCDARRAY_EXPANDER(SCDARRAY_PUSH_BACK_SIG, type, type_name, push_back);                   \
@@ -78,6 +80,26 @@
         return SCUFCONT_SUCCESS;                       \
     }
 
+#define SCDARRAY_ALLOC_COPY_SIG(type, type_name, func_name) ScufContResult func_name(type_name *const dst, const type_name *const src)
+
+/**
+  @fn SCDArray_alloc_copy
+
+  @return SCUFCONT_OUT_OF_MEMORY
+  @return SCUFCONT_SUCCESS
+*/
+#define SCDARRAY_ALLOC_COPY(type, type_name, func_name)           \
+    SCDARRAY_ALLOC_COPY_SIG(type, type_name, func_name) {         \
+        dst->data = (type *) calloc(src->capacity, sizeof(type)); \
+        if (dst->data == NULL) {                                  \
+            return SCUFCONT_OUT_OF_MEMORY;                        \
+        }                                                         \
+        dst->len = src->len;                                      \
+        dst->capacity = src->capacity;                            \
+        memcpy(dst->data, src->data, src->len);                   \
+        return SCUFCONT_SUCCESS;                                  \
+    }
+
 #define SCDARRAY_FREE_SIG(type, type_name, func_name) void func_name(type_name *const darr)
 
 #define SCDARRAY_FREE(type, type_name, func_name)   \

+ 38 - 10
tests/cmocka/DArray_tests.c

@@ -1,4 +1,6 @@
 #include <cmocka.h>
+#include <stdlib.h>
+#include <time.h>
 
 #include "scufcont/DArray.h"
 #include "scufcont/scufcont.h"
@@ -6,7 +8,7 @@
 SCDARRAY_HEADER(int, int)
 SCDARRAY_IMPL(int, int)
 
-void test_DArray_alloc(void** state) {
+void test_DArray_alloc(void **state) {
     (void) state;
 
     SCDArray_int arr;
@@ -18,39 +20,64 @@ void test_DArray_alloc(void** state) {
     SCDArray_int_free(&arr);
 }
 
-void test_DArray_push_back(void** state) {
+void test_DArray_alloc_copy(void **state) {
+    (void) state;
+
+    srand(time(NULL));
+
+    SCDArray_int arr;
+    assert_true(SCDArray_int_alloc(&arr) == SCUFCONT_SUCCESS);
+
+    const size_t elems_n = rand() % 100;
+    for (size_t i = 0; i < elems_n; i++) {
+        const int elem = rand();
+        assert_true(SCDArray_int_push_back(&arr, &elem) == SCUFCONT_SUCCESS);
+    }
+
+    SCDArray_int copied;
+    assert_true(SCDArray_int_alloc_copy(&copied, &arr) == SCUFCONT_SUCCESS);
+    assert_non_null(copied.data);
+    assert_uint_equal(copied.capacity, arr.capacity);
+    assert_uint_equal(copied.len, arr.len);
+    assert_memory_equal(copied.data, arr.data, copied.len);
+
+    SCDArray_int_free(&arr);
+    SCDArray_int_free(&copied);
+}
+
+void test_DArray_push_back(void **state) {
     (void) state;
 
     SCDArray_int arr;
     SCDArray_int_alloc(&arr);
 
-    assert_true(SCDArray_int_push_back(&arr, &(int){7}) == SCUFCONT_SUCCESS);
+    assert_true(SCDArray_int_push_back(&arr, &(int) { 7 }) == SCUFCONT_SUCCESS);
     assert_true(arr.data[0] == 7);
 
-    assert_true(SCDArray_int_push_back(&arr, &(int){10}) == SCUFCONT_SUCCESS);
+    assert_true(SCDArray_int_push_back(&arr, &(int) { 10 }) == SCUFCONT_SUCCESS);
     assert_true(arr.data[0] == 7);
     assert_true(arr.data[1] == 10);
 
     SCDArray_int_free(&arr);
 }
 
-void test_DArray_at(void** state) {
+void test_DArray_at(void **state) {
     (void) state;
 
     SCDArray_int arr;
     SCDArray_int_alloc(&arr);
 
-    assert_true(SCDArray_int_push_back(&arr, &(int){7}) == SCUFCONT_SUCCESS);
+    assert_true(SCDArray_int_push_back(&arr, &(int) { 7 }) == SCUFCONT_SUCCESS);
     assert_int_equal(*SCDArray_int_at(&arr, 0), 7);
 
-    assert_true(SCDArray_int_push_back(&arr, &(int){10}) == SCUFCONT_SUCCESS);
+    assert_true(SCDArray_int_push_back(&arr, &(int) { 10 }) == SCUFCONT_SUCCESS);
     assert_int_equal(*SCDArray_int_at(&arr, 0), 7);
     assert_int_equal(*SCDArray_int_at(&arr, 1), 10);
 
     SCDArray_int_free(&arr);
 }
 
-void test_DArray_push_back_multiple(void** state) {
+void test_DArray_push_back_multiple(void **state) {
     (void) state;
 
     SCDArray_int arr;
@@ -75,7 +102,7 @@ void test_DArray_push_back_multiple(void** state) {
     SCDArray_int_free(&arr);
 }
 
-void test_DArray_remove(void** state) {
+void test_DArray_remove(void **state) {
     (void) state;
 
     SCDArray_int arr;
@@ -126,7 +153,7 @@ void test_DArray_remove(void** state) {
     SCDArray_int_free(&arr);
 }
 
-void test_DArray_clear(void** state) {
+void test_DArray_clear(void **state) {
     (void) state;
 
     SCDArray_int arr;
@@ -149,6 +176,7 @@ void test_DArray_clear(void** state) {
 int DArray_tests_run(void) {
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(test_DArray_alloc),
+        cmocka_unit_test(test_DArray_alloc_copy),
         cmocka_unit_test(test_DArray_push_back),
         cmocka_unit_test(test_DArray_at),
         cmocka_unit_test(test_DArray_push_back_multiple),