| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #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;
- }
|