Sfoglia il codice sorgente

Fixed memory not resizing after DArray_remove

Aaro Saila 2 mesi fa
parent
commit
157e4ea09a
1 ha cambiato i file con 45 aggiunte e 44 eliminazioni
  1. 45 44
      include/scufcont/DArray.h

+ 45 - 44
include/scufcont/DArray.h

@@ -45,34 +45,34 @@
 
 #define SCDARRAY_STRUCT(type, type_name) \
     typedef struct {                     \
-        type* data;                      \
+        type *data;                      \
         size_t len;                      \
         size_t capacity;                 \
     } SCDArray_##type_name;
 
 // SCDARRAY_STRUCT(int);
 
-#define SCDARRAY_ALLOC_SIG(type, type_name, func_name) ScufContResult func_name(type_name* darr)
-
-#define SCDARRAY_ALLOC(type, type_name, func_name)    \
-    SCDARRAY_ALLOC_SIG(type, type_name, func_name) {  \
-        darr->data = (type*) calloc(1, sizeof(type)); \
-        if (darr->data == NULL) {                     \
-            return SCUFCONT_OUT_OF_MEMORY;            \
-        }                                             \
-        darr->len = 0;                                \
-        darr->capacity = 1;                           \
-        return SCUFCONT_SUCCESS;                      \
+#define SCDARRAY_ALLOC_SIG(type, type_name, func_name) ScufContResult func_name(type_name *darr)
+
+#define SCDARRAY_ALLOC(type, type_name, func_name)     \
+    SCDARRAY_ALLOC_SIG(type, type_name, func_name) {   \
+        darr->data = (type *) calloc(1, sizeof(type)); \
+        if (darr->data == NULL) {                      \
+            return SCUFCONT_OUT_OF_MEMORY;             \
+        }                                              \
+        darr->len = 0;                                 \
+        darr->capacity = 1;                            \
+        return SCUFCONT_SUCCESS;                       \
     }
 
-#define SCDARRAY_FREE_SIG(type, type_name, func_name) void func_name(type_name* darr)
+#define SCDARRAY_FREE_SIG(type, type_name, func_name) void func_name(type_name *darr)
 
 #define SCDARRAY_FREE(type, type_name, func_name)   \
     SCDARRAY_FREE_SIG(type, type_name, func_name) { \
         free(darr->data);                           \
     }
 
-#define SCDARRAY_IS_NULL_SIG(type, type_name, func_name) bool func_name(const type_name* darr)
+#define SCDARRAY_IS_NULL_SIG(type, type_name, func_name) bool func_name(const type_name *darr)
 
 #define SCDARRAY_IS_NULL(type, type_name, func_name)   \
     SCDARRAY_IS_NULL_SIG(type, type_name, func_name) { \
@@ -81,41 +81,41 @@
 
 // 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* new_elem)
-
-#define SCDARRAY_PUSH_BACK(type, type_name, func_name)                                    \
-    SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) {                                  \
-        if (darr->len + 1 > darr->capacity) {                                             \
-            darr->capacity *= 2;                                                          \
-            darr->data = (type*) realloc(darr->data, darr->capacity * sizeof(*new_elem)); \
-            if (darr->data == NULL) {                                                     \
-                return SCUFCONT_OUT_OF_MEMORY;                                            \
-            }                                                                             \
-        }                                                                                 \
-        memcpy(darr->data + darr->len, new_elem, sizeof(*new_elem));                      \
-        darr->len++;                                                                      \
-        return SCUFCONT_SUCCESS;                                                          \
+#define SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) ScufContResult func_name(type_name *darr, const type *new_elem)
+
+#define SCDARRAY_PUSH_BACK(type, type_name, func_name)                                     \
+    SCDARRAY_PUSH_BACK_SIG(type, type_name, func_name) {                                   \
+        if (darr->len + 1 > darr->capacity) {                                              \
+            darr->capacity *= 2;                                                           \
+            darr->data = (type *) realloc(darr->data, darr->capacity * sizeof(*new_elem)); \
+            if (darr->data == NULL) {                                                      \
+                return SCUFCONT_OUT_OF_MEMORY;                                             \
+            }                                                                              \
+        }                                                                                  \
+        memcpy(darr->data + darr->len, new_elem, sizeof(*new_elem));                       \
+        darr->len++;                                                                       \
+        return SCUFCONT_SUCCESS;                                                           \
     }
 
-#define SCDARRAY_PUSH_BACK_MULTIPLE_SIG(type, type_name, func_name) ScufContResult func_name(type_name* const darr, const type* const new_elems, const size_t new_elems_n)
-
-#define SCDARRAY_PUSH_BACK_MULTIPLE(type, type_name, func_name)                                      \
-    SCDARRAY_PUSH_BACK_MULTIPLE_SIG(type, type_name, func_name) {                                    \
-        if (darr->len + new_elems_n > darr->capacity) {                                              \
-            darr->data = (type*) realloc(darr->data, (darr->capacity + new_elems_n) * sizeof(type)); \
-            if (darr->data == NULL) {                                                                \
-                return SCUFCONT_OUT_OF_MEMORY;                                                       \
-            }                                                                                        \
-            darr->capacity += new_elems_n;                                                           \
-        }                                                                                            \
-        memcpy(darr->data + darr->len, new_elems, sizeof(type) * new_elems_n);                       \
-        darr->len += new_elems_n;                                                                    \
-        return SCUFCONT_SUCCESS;                                                                     \
+#define SCDARRAY_PUSH_BACK_MULTIPLE_SIG(type, type_name, func_name) ScufContResult func_name(type_name *const darr, const type *const new_elems, const size_t new_elems_n)
+
+#define SCDARRAY_PUSH_BACK_MULTIPLE(type, type_name, func_name)                                       \
+    SCDARRAY_PUSH_BACK_MULTIPLE_SIG(type, type_name, func_name) {                                     \
+        if (darr->len + new_elems_n > darr->capacity) {                                               \
+            darr->data = (type *) realloc(darr->data, (darr->capacity + new_elems_n) * sizeof(type)); \
+            if (darr->data == NULL) {                                                                 \
+                return SCUFCONT_OUT_OF_MEMORY;                                                        \
+            }                                                                                         \
+            darr->capacity += new_elems_n;                                                            \
+        }                                                                                             \
+        memcpy(darr->data + darr->len, new_elems, sizeof(type) * new_elems_n);                        \
+        darr->len += new_elems_n;                                                                     \
+        return SCUFCONT_SUCCESS;                                                                      \
     }
 
 // SCDARRAY_PUSH_BACK_MULTIPLE(int, SCDArray_int, SCDArray_int_push_back_multiple)
 
-#define SCDARRAY_AT_SIG(type, type_name, func_name) type* func_name(const type_name* const darr, const size_t i)
+#define SCDARRAY_AT_SIG(type, type_name, func_name) type *func_name(const type_name *const darr, const size_t i)
 
 // SCDARRAY_PUSH_BACK(int, SCDArray_int, SCDArray_int_push_back);
 
@@ -142,12 +142,13 @@
 
 // SCDARRAY_AT(char*, SCDArray_charp, SCDArray_charp_at)
 
-#define SCDARRAY_REMOVE_SIG(type, type_name, func_name) void func_name(type_name* darr, const size_t i)
+#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);                  \
     }
 
 // SCDARRAY_REMOVE(char*, SCDArray_charp, SCDArray_charp_remove)