diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2014-05-27 05:48:51 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2014-05-27 05:48:51 +0200 |
commit | e03ec948967225c8162ffecf37b59bbfc338a83a (patch) | |
tree | 6c53c822063d32edb1f387fbf8879155626aafd8 /src/vector.h | |
parent | 9b5e5f7883ef59201d17343680d109c1f9d5ae9b (diff) | |
download | fastd-e03ec948967225c8162ffecf37b59bbfc338a83a.tar fastd-e03ec948967225c8162ffecf37b59bbfc338a83a.zip |
Lots and lots of documentation
Diffstat (limited to 'src/vector.h')
-rw-r--r-- | src/vector.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/vector.h b/src/vector.h index 0396c01..0a61341 100644 --- a/src/vector.h +++ b/src/vector.h @@ -23,18 +23,30 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/** + \file vector.h + + Typesafe dynamically sized arrays +*/ + #pragma once #include <stdlib.h> +/** A vector descriptor */ typedef struct fastd_vector_desc { size_t allocated; size_t length; } fastd_vector_desc_t; +/** + A type for a vector of \e type elements + + \hideinitializer +*/ #define VECTOR(type) \ struct { \ fastd_vector_desc_t desc; \ @@ -49,39 +61,91 @@ void _fastd_vector_insert(fastd_vector_desc_t *desc, void **data, void *element, void _fastd_vector_delete(fastd_vector_desc_t *desc, void **data, size_t pos, size_t elemsize); +/** + Allocates resources for the vector \e a, starting with \e n elements + + \hideinitializer +*/ #define VECTOR_ALLOC(v, n) ({ \ __typeof__(v) *_v = &(v); \ _fastd_vector_alloc(&_v->desc, (void**)&_v->data, (n), sizeof(*_v->data)); \ }) +/** + Resizes the vector \e a to \e n elements + + \hideinitializer +*/ #define VECTOR_RESIZE(v, n) ({ \ __typeof__(v) *_v = &(v); \ _fastd_vector_resize(&_v->desc, (void**)&_v->data, (n), sizeof(*_v->data)); \ }) +/** + Frees all resources used by the vector \e v + + \hideinitializer +*/ #define VECTOR_FREE(v) free((v).data) +/** + Returns the number of elements in the vector \e v + + \hideinitializer +*/ #define VECTOR_LEN(v) ((v).desc.length) + +/** + Returns the element with index \e i in the vector \e v + + \hideinitializer +*/ #define VECTOR_INDEX(v, i) ((v).data[i]) + +/** + Returns a pointer to the vector elements of \e v + + \hideinitializer +*/ #define VECTOR_DATA(v) ((v).data) +/** + Inserts the element \e elem at index \e pos of vector \e v + + \hideinitializer +*/ #define VECTOR_INSERT(v, elem, pos) ({ \ __typeof__(v) *_v = &(v); \ __typeof__(*_v->data) _e = (elem); \ _fastd_vector_insert(&_v->desc, (void**)&_v->data, &_e, (pos), sizeof(_e)); \ }) +/** + Adds the element \e elem at the end of vector \e v + + \hideinitializer +*/ #define VECTOR_ADD(v, elem) ({ \ __typeof__(v) *_v = &(v); \ __typeof__(*_v->data) _e = (elem); \ _fastd_vector_insert(&_v->desc, (void**)&_v->data, &_e, _v->desc.length, sizeof(_e)); \ }) +/** + Deletes the element at index \e pos of vector \e v + + \hideinitializer +*/ #define VECTOR_DELETE(v, pos) ({ \ __typeof__(v) *_v = &(v); \ _fastd_vector_delete(&_v->desc, (void**)&_v->data, (pos), sizeof(*_v->data)); \ }) +/** + Performs a binary search on the vector \e v, returning a pointer to a matching vector element + + \hideinitializer +*/ #define VECTOR_BSEARCH(key, v, cmp) ({ \ __typeof__(v) *_v = &(v); \ const __typeof__(*_v->data) *_key = (key); \ |