|
|
@@ -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;
|
|
|
+}
|