Files
mie/mie/include/mie/vector.h

112 lines
5.5 KiB
C

#ifndef MIE_VECTOR_H_
#define MIE_VECTOR_H_
#include <mie/misc.h>
#include <mie/status.h>
#include <stddef.h>
struct mie_vector_ops {
enum mie_status (*v_copy)(void *, const void *, size_t);
enum mie_status (*v_move)(void *, void *, size_t);
enum mie_status (*v_destroy)(void *);
};
#define MIE_VECTOR_DEFINE(type, name) \
struct { \
size_t count; \
size_t max; \
type *items; \
} name = {0}
#define MIE_VECTOR_DECLARE(type, name) \
struct { \
size_t count; \
size_t max; \
type *items; \
} name
#define MIE_VECTOR_ITEM(name, index) name.items[index]
#define MIE_VECTOR_ITEM_PTR(name, index) &name.items[index]
#define MIE_VECTOR_COUNT(name) name.count
#define MIE_VECTOR_MAX(name) name.max
/* use this macros in your function prototype, to allow the function to accept
* a reference to a vector as a parameter */
#define MIE_VECTOR_REF_PARAM(type, name) \
type **name, size_t *name##_count, size_t *name##_max
/* use this macro to pass a reference to a vector as a parameter to a function
* whose prototype uses MIE_VECTOR_REF_PARAM */
#define MIE_VECTOR_REF(name) &(name.items), &(name.count), &(name.max)
/* use this macro to forward your reference to a vector (which you got via
* MIE_VECTOR_REF_PARAM in your function prototype), to another function whose
* prototype also uses MIE_VECTOR_REF_PARAM */
#define MIE_VECTOR_REF2(name) name, name##_count, name##_max
/* use these functions if you're accessing a vector directly. */
#define mie_vector_push_back(vector, ptr, ops) \
__mie_vector_push_back( \
(void **)&(vector.items), ptr, sizeof *ptr, &(vector.count), \
&(vector.max), ops)
#define mie_vector_pop_back(vector, ops) \
__mie_vector_pop_back( \
(void **)&(vector.items), sizeof *vector.items, \
&(vector.count), &(vector.max), ops)
#define mie_vector_emplace_back(vector, ops) \
__mie_vector_emplace_back( \
(void **)&(vector.items), sizeof *vector.items, \
&(vector.count), &(vector.max), ops)
#define mie_vector_trim(vector, ops) \
__mie_vector_trim( \
(void **)&(vector.items), sizeof *vector.items, \
&(vector.count), &(vector.max), ops)
#define mie_vector_destroy(vector, ops) \
__mie_vector_destroy( \
(void **)&(vector.items), sizeof *vector.items, \
&(vector.count), &(vector.max), ops)
/* use these functions if you're accessing a vector as a reference
* via MIE_VECTOR_REF_PARAM. */
#define mie_vector_ref_push_back(vector, ptr, ops) \
__mie_vector_push_back( \
(void **)(vector), ptr, sizeof *ptr, (vector##_count), \
(vector##_max), ops)
#define mie_vector_ref_pop_back(vector, ops) \
__mie_vector_pop_back( \
(void **)(vector), sizeof **vector, (vector##_count), \
(vector##_max), ops)
#define mie_vector_ref_emplace_back(vector, ops) \
__mie_vector_emplace_back( \
(void **)(vector), sizeof **vector, (vector##_count), \
(vector##_max), ops)
#define mie_vector_ref_trim(vector, ops) \
__mie_vector_trim( \
(void **)(vector), sizeof **vector, (vector##_count), \
(vector##_max), ops)
#define mie_vector_ref_destroy(vector, ops) \
__mie_vector_destroy( \
(void **)(vector), sizeof **vector, (vector##_count), \
(vector##_max), ops)
#define mie_vector_ref_get_item(vector, index) (*vector)[index]
#define mie_vector_ref_get_item_ptr(vector, index) (&(*vector)[index])
#define mie_vector_ref_get_count(vector) *(vector##_count)
#define mie_vector_ref_get_max(vector) *(vector##_count)
/* don't use these functions */
MIE_API int __mie_vector_push_back(
void **vector, const void *item, size_t item_size, size_t *count,
size_t *max, const struct mie_vector_ops *ops);
MIE_API void __mie_vector_pop_back(
void **vector, size_t item_size, size_t *count, size_t *max,
const struct mie_vector_ops *ops);
MIE_API void *__mie_vector_emplace_back(
void **vector, size_t item_size, size_t *count, size_t *max,
const struct mie_vector_ops *ops);
MIE_API void __mie_vector_trim(
void **vector, size_t item_size, size_t *count, size_t *max,
const struct mie_vector_ops *ops);
MIE_API void __mie_vector_destroy(
void **vector, size_t item_size, size_t *count, size_t *max,
const struct mie_vector_ops *ops);
#endif