#ifndef VECTOR_H #define VECTOR_H #include #include #include #ifndef DEBUG # define DEBUG 0 #endif #define ERR_MEM_ALLOC 1 #define NO_COLOR "\x1b[0m" #define RED "\x1b[31m" #define GREEN "\x1b[32m" #define BROWN "\x1b[33m" #define BLUE "\x1b[34m" #define MAGENTA "\x1b[35m" #define CYAN "\x1b[36m" #define GRAY "\x1b[37m" #define UNINPLEMENTED printf("%s:%d: Not yet implemented", __FILE__, __LINE__) #define INITIAL_CAPACITY 4 #define PDEB(format, ...) \ if (DEBUG) { \ fprintf(stderr, \ GREEN "%s:%d\t" NO_COLOR format "\n", \ __FILE__, \ __LINE__, \ __VA_ARGS__); \ } #define foreach(item, vector) \ for (int keep = 1, \ count = 0, \ size = sizeof(vector->elements) / sizeof vector->elements; \ keep && count != size; \ keep = !keep, count++) \ for (item = \ (void *)((char *)(vector->elements) + (count * sizeof(void *))); \ keep; \ keep = !keep) #ifndef ARRAY_SIZE # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif // TODO // `sizeof()' does NOT work with dynamically allocated memory. Vector capacity // must be tracked manually /* Destructor typedef */ typedef void (*Destructor)(void *element); typedef struct Vector_s { size_t length; size_t capacity; size_t offset; void ** elements; Destructor destroy; } Vector; Vector vec_new(Destructor destructor); Vector vec_with_capacity(Destructor destructor, size_t capacity); void * vec_at(Vector *self, size_t index); void * vec_safe_at(Vector *self, size_t index); void * vec_last(Vector *self); size_t vec_length(Vector *self); size_t vec_capacity(Vector *self); void vec_push(Vector *self, void *element); void vec_pop(Vector *self); void vec_shrink_to_fit(Vector *self); void vec_delete(Vector *self); #endif /* VECTOR_H */