Abderrahmane Faiz 4 өдөр өмнө
parent
commit
7997b4f978
2 өөрчлөгдсөн 75 нэмэгдсэн , 0 устгасан
  1. 1 0
      README.md
  2. 74 0
      dynamic_array.c

+ 1 - 0
README.md

@@ -0,0 +1 @@
+# Shadow Header data structure in C

+ 74 - 0
dynamic_array.c

@@ -0,0 +1,74 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+typedef struct {
+  size_t count;
+  size_t capacity;
+} Header;
+
+#define ARR_INIT_CAPACITY 256
+
+#define arr_len(arr) ((Header *)(arr) - 1)->count
+
+#define arr_push(arr, x)                                                       \
+  do {                                                                         \
+    if ((arr) == NULL) {                                                       \
+      size_t st = sizeof(*(arr)) * ARR_INIT_CAPACITY + sizeof(Header);         \
+      Header *header = malloc(st);                                             \
+      header->count = 0;                                                       \
+      header->capacity = ARR_INIT_CAPACITY;                                    \
+      (arr) = (void *)(header + 1);                                            \
+    }                                                                          \
+    Header *header = (Header *)(arr) - 1;                                      \
+    if (header->count >= header->capacity) {                                   \
+      header->capacity *= 2;                                                   \
+      header =                                                                 \
+          realloc(header, sizeof(*(arr)) * header->capacity + sizeof(Header)); \
+      (arr) = (void *)(header + 1);                                            \
+    }                                                                          \
+    (arr)[header->count++] = (x);                                              \
+  } while (0)
+
+#define arr_pop(arr)                                                           \
+  do {                                                                         \
+    if ((arr) == NULL) {                                                       \
+      size_t st = sizeof(*(arr)) * ARR_INIT_CAPACITY + sizeof(Header);         \
+      Header *header = malloc(st);                                             \
+      header->count = 0;                                                       \
+      header->capacity = ARR_INIT_CAPACITY;                                    \
+      (arr) = (void *)(header + 1);                                            \
+    }                                                                          \
+    Header *header = (Header *)(arr) - 1;                                      \
+    if (header->count > 0)                                                     \
+      header->count--;                                                         \
+	} while(0)
+
+#define arr_free(arr) free((Header*)(arr)-1)
+
+int main(){
+  int *numbers = NULL;
+  // [header][numbers]
+  //         ^
+  float *data = NULL;
+  arr_push(numbers, 23);
+  arr_push(numbers, 456);
+  arr_push(numbers, 3128);
+  arr_push(numbers, 79);
+  arr_push(numbers, 69);
+  printf("\nnumbers (nb_elements: %zu)\n", arr_len(numbers));
+  for (int i = 0; i < arr_len(numbers); i++) {
+	printf("%d\n", numbers[i]);
+  }
+
+
+  arr_push(data, 67);
+  arr_push(data, 54);
+  arr_push(data, 34.5);
+  printf("\ndata (nb_elements: %zu)\n", arr_len(data));
+  for (int i = 0; i < arr_len(data); i++) {
+	printf("%f\n", data[i]);
+  }
+  arr_free(numbers);
+  arr_free(data);
+  return 0;
+}