175 lines
4.1 KiB
Markdown
175 lines
4.1 KiB
Markdown
# vector
|
|
|
|
Simple type-agnostic dynamic array
|
|
|
|
## Structs
|
|
|
|
### Vector
|
|
|
|
Vector struct
|
|
|
|
```c
|
|
typedef struct Vector {
|
|
size_t capacity;
|
|
size_t length;
|
|
void **elements;
|
|
void (*destroy)(void *data);
|
|
} Vector;
|
|
```
|
|
|
|
Members:
|
|
|
|
- `capacity`: The size of `elements` in memory
|
|
- `length`: The number of real elements stored in the backing `elements` array
|
|
- `elements`: The dynamic array of `void *` that holds the vector's members
|
|
- `destroy`: Optional deallocation function for data inside a node. Typical usage is `NULL` for stack allocated data and `free()` for data created with `malloc()`
|
|
|
|
## Functions
|
|
|
|
### vec_init
|
|
|
|
Initialize the vector with a default capacity of 2. User is responsible for freeing elements of the vector with `vec_destroy()`. Returns a non-zero integer if there is an error
|
|
|
|
```c
|
|
int vec_init(Vector *vec, void (*destroy)(void *data));
|
|
```
|
|
|
|
### vec_init_with_capacity
|
|
|
|
Initialize the vector with a user-specified capacity. User is responsible for freeing elements of the vector with `vec_destroy()`. Returns a non-zero integer if there is an error
|
|
|
|
```c
|
|
int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t cap);
|
|
```
|
|
|
|
### vec_destroy
|
|
|
|
Frees the underlying array inside a `Vector`. If `destroy` was provided when creating the vector, then it is called against each element in the array before the array is freed. Does not destroy the vector itself, that is left up to the user
|
|
|
|
|
|
```c
|
|
void vec_destroy(Vector *vec);
|
|
|
|
/* Usage */
|
|
vec_destroy(vec);
|
|
free(vec);
|
|
```
|
|
|
|
### vec_insert
|
|
|
|
Insert `data` into the vector at a specified index. Any elements at that array and beyond will be moved up to make room. Returns a non-zero integer if there is an error
|
|
|
|
```c
|
|
int vec_insert(Vector *vec, void *data, size_t index);
|
|
|
|
/* Usage */
|
|
|
|
// vec: 1 2 3 4
|
|
int i = 99;
|
|
vec_insert(vec, &i, 2);
|
|
// vec: 1 2 99 3 4
|
|
```
|
|
|
|
### vec_push
|
|
|
|
Insert `data` at the end of the vector. Returns a non-zero integer if there is an error
|
|
|
|
```c
|
|
int vec_push(Vector *vec, void *data);
|
|
|
|
/* Usage */
|
|
|
|
// vec: 1 2 3
|
|
int *i = malloc(sizeof(int));
|
|
*i = 4;
|
|
vec_push(vec, i);
|
|
// vec: 1 2 3 4
|
|
```
|
|
|
|
### vec_safe_at
|
|
|
|
Gets the stored data at a specified index. Uses safety checks to make sure `index` is not out of bounds. Returns `NULL` if there is an error
|
|
|
|
```c
|
|
void *vec_safe_at(Vector *vec, size_t index);
|
|
```
|
|
|
|
### vec_remove
|
|
|
|
Removes an element from the array and returns the pointer, then moves elements to shrink the array accordingly. Returns `NULL` if the index is not valid
|
|
|
|
```c
|
|
void *vec_remove(Vector *vec, size_t index);
|
|
|
|
/* Usage */
|
|
// vec: 1 2 3 4
|
|
int *t = NULL;
|
|
t = (int*)vec_remove(vec, 2);
|
|
assert(*t == 3);
|
|
// vec: 1 2 4
|
|
```
|
|
|
|
### vec_shrink
|
|
|
|
Shrinks the capacity of the vector down to the current length. Returns a non-zero integer if there is an error
|
|
|
|
```c
|
|
int vec_shrink(Vector *vec);
|
|
```
|
|
|
|
### vec_max
|
|
|
|
Finds the largest value in the vector and returns a void pointer to the underlying data. Requires a
|
|
comparison function to compare the data in the vector. This function must return `1` if `a > b`, `-1` if
|
|
`a < b`, or `0` if `a == b`. See the supplied comparison functions below for reference
|
|
|
|
```c
|
|
const void *vec_min(const Vector *vec, int(*cmp)(const void *a, const void *b));
|
|
```
|
|
|
|
### vec_min
|
|
|
|
Finds the smallest value in the vector and returns a void pointer to the underlying data. Requires a
|
|
comparison function to compare the data in the vector. This function must return `1` if `a > b`, `-1` if
|
|
`a < b`, or `0` if `a == b`. See the supplied comparison functions below for reference
|
|
|
|
```c
|
|
const void *vec_max(const Vector *vec, int(*cmp)(const void *a, const void *b));
|
|
```
|
|
|
|
## Comparison Functions
|
|
|
|
Comparison functions to compare data in a vector. These functions must return `1` if `a > b`, `-1` if
|
|
`a < b`, or `0` if `a == b`.
|
|
|
|
```c
|
|
int vec_cmp_int(const void *a, const void *b);
|
|
int vec_cmp_char(const void *a, const void *b);
|
|
```
|
|
|
|
## Macros
|
|
|
|
### vec_at
|
|
|
|
Grabs the element at index `i` without safety checks for better performance. Use with caution
|
|
|
|
```c
|
|
#define vec_at(v, i) (v)->elements[(i)]
|
|
```
|
|
|
|
### vec_len
|
|
|
|
Returns the length of the vector
|
|
|
|
```c
|
|
#define vec_len(v) (v)->length
|
|
```
|
|
|
|
### vec_cap
|
|
|
|
Returns the capacity of the vector
|
|
|
|
```c
|
|
#define vec_cap(v) (v)->capacity
|
|
```
|