cvector/vector.h
Lucien Cartier-Tilet 988420a27c
Add attributes to functions, remove inline functions
For some reasons, I cannot compile correctly this library with inline
functions using Meson and Ninja (commit adding Meson build file
incoming).

Some attributes are also added, such as an attribute for all functions
receiving pointers as arguments telling these arguments cannot be null.
2020-10-26 21:35:37 +01:00

68 lines
2.2 KiB
C

#ifndef VECTOR_H
#define VECTOR_H
#include <stdbool.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 NONNULL __attribute__((nonnull))
#define INITIAL_CAPACITY 4
#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__)
/* Destructor typedef */
typedef void (*Destructor)(void *element);
typedef struct Vector_s {
size_t length;
size_t capacity;
const size_t offset;
void ** elements;
Destructor destroy;
} Vector;
typedef struct Result_s {
union {
const char *message;
void * value;
} result;
bool error;
} Result;
Result vec_new(Destructor destructor);
Result vec_with_capacity(Destructor const destructor, size_t const capacity);
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;
#endif /* VECTOR_H */