2020-10-07 15:13:28 +00:00
|
|
|
#ifndef VECTOR_H
|
|
|
|
#define VECTOR_H
|
|
|
|
|
2020-10-26 19:18:34 +00:00
|
|
|
#include <stdbool.h>
|
2020-10-07 15:13:28 +00:00
|
|
|
#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__)
|
2020-10-26 20:35:37 +00:00
|
|
|
#define NONNULL __attribute__((nonnull))
|
2020-10-07 15:13:28 +00:00
|
|
|
#define INITIAL_CAPACITY 4
|
2020-10-26 19:18:34 +00:00
|
|
|
#define PCOMMON(color, format, ...) \
|
|
|
|
fprintf(stderr, \
|
|
|
|
"%s%s:%d%s\t" format "\n", \
|
|
|
|
color, \
|
|
|
|
__FILE__, \
|
|
|
|
__LINE__, \
|
|
|
|
NO_COLOR, \
|
|
|
|
__VA_ARGS__)
|
|
|
|
#define PDEB(format, ...) PCOMMON(GREEN, format, __VA_ARGS__)
|
|
|
|
#define PERR(format, ...) PCOMMON(RED, format, __VA_ARGS__)
|
2020-10-07 15:13:28 +00:00
|
|
|
|
|
|
|
/* Destructor typedef */
|
|
|
|
typedef void (*Destructor)(void *element);
|
|
|
|
|
|
|
|
typedef struct Vector_s {
|
2020-10-26 19:18:34 +00:00
|
|
|
size_t length;
|
|
|
|
size_t capacity;
|
|
|
|
const size_t offset;
|
|
|
|
void ** elements;
|
|
|
|
Destructor destroy;
|
2020-10-07 15:13:28 +00:00
|
|
|
} Vector;
|
|
|
|
|
2020-10-26 19:18:34 +00:00
|
|
|
typedef struct Result_s {
|
|
|
|
union {
|
|
|
|
const char *message;
|
|
|
|
void * value;
|
|
|
|
} result;
|
|
|
|
bool error;
|
|
|
|
} Result;
|
2020-10-08 09:11:28 +00:00
|
|
|
|
2020-10-26 19:18:34 +00:00
|
|
|
Result vec_new(Destructor destructor);
|
|
|
|
Result vec_with_capacity(Destructor const destructor, size_t const capacity);
|
2020-10-26 20:35:37 +00:00
|
|
|
Result vec_push(Vector *const self, void *const element) NONNULL;
|
|
|
|
Result vec_shrink_to_fit(Vector *const self) NONNULL;
|
|
|
|
void * vec_safe_at(Vector const *const self, size_t const index) NONNULL;
|
|
|
|
void * vec_at(Vector const *const self, size_t const index) NONNULL;
|
|
|
|
void * vec_last(Vector const *const self) NONNULL;
|
|
|
|
void vec_pop(Vector *const self) NONNULL;
|
|
|
|
void vec_delete(Vector *const self) NONNULL;
|
|
|
|
size_t vec_length(Vector const *const self) NONNULL;
|
|
|
|
size_t vec_capacity(Vector const *const self) NONNULL;
|
2020-10-26 19:18:34 +00:00
|
|
|
|
2020-10-07 15:13:28 +00:00
|
|
|
#endif /* VECTOR_H */
|