75 lines
2.6 KiB
C
75 lines
2.6 KiB
C
#ifndef VECTOR_H
|
|
#define VECTOR_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#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 */
|