vector.h
Raw
1#ifndef CUTILS_VECTOR_H
2#define CUTILS_VECTOR_H
3
4#define VECTOR_DEFAULT_SIZE 4
5
6#include <stdlib.h>
7#include <string.h>
8#include <cutils/common.h>
9
10typedef struct Vector
11{
12 void** items;
13 size_t capacity;
14 size_t length;
15} Vector;
16
17Vector* vector_with_capacity(size_t capacity);
18void delete_vector(Vector* vector, void(*rmv) (void*));
19
20HEDLEY_INLINE
21static void* vector_at(const Vector* vector, size_t index)
22{
23 return vector->items[index];
24}
25void* vector_pop_at(Vector* vector, size_t index);
26
27bool vector_insert(Vector* vector, size_t index, void* item);
28
29HEDLEY_INLINE
30static void vector_remove(Vector* vector, size_t index, void (*rmv)(void*))
31{
32 if(index < vector->length)
33 {
34 if(rmv)
35 rmv(vector->items[index]);
36 memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
37 vector->length--;
38 }
39}
40void vector_remove_range(Vector* vector, size_t index, size_t length, void (*rmv)(void*));
41
42bool vector_grow(Vector* vector, size_t add);
43bool vector_adjust_size(Vector* vector, size_t size);
44bool vector_shrink(Vector* vector);
45HEDLEY_NON_NULL(3)
46size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const void*, const void*));
47
48#define new_vector() vector_with_capacity(VECTOR_DEFAULT_SIZE)
49#define vector_pop(vector) vector_pop_at(vector, ((Vector*)vector)->length-1)
50#define vector_push(vector, item) vector_insert(vector, ((Vector*)vector)->length, item)
51
52#endif /* CUTILS_VECTOR_H */
53