9#ifndef satoko__utils__vec__vec_flt_h
10#define satoko__utils__vec__vec_flt_h
31#define vec_flt_foreach(vec, entry, i) \
32 for (i = 0; (i < vec->size) && (((entry) = vec_flt_at(vec, i)), 1); i++)
34#define vec_flt_foreach_start(vec, entry, i, start) \
35 for (i = start; (i < vec_flt_size(vec)) && (((entry) = vec_flt_at(vec, i)), 1); i++)
37#define vec_flt_foreach_stop(vec, entry, i, stop) \
38 for (i = 0; (i < stop) && (((entry) = vec_flt_at(vec, i)), 1); i++)
43static inline vec_flt_t *vec_flt_alloc(
unsigned cap)
47 if (cap > 0 && cap < 16)
55static inline vec_flt_t *vec_flt_alloc_exact(
unsigned cap)
83static inline unsigned vec_flt_size(
vec_flt_t *
p)
88static inline void vec_flt_resize(
vec_flt_t *
p,
unsigned new_size)
91 if (
p->cap >= new_size)
98static inline void vec_flt_reserve(
vec_flt_t *
p,
unsigned new_cap)
100 if (
p->cap >= new_cap)
107static inline unsigned vec_flt_capacity(
vec_flt_t *
p)
114 return p->size ? 0 : 1;
124static inline float vec_flt_at(
vec_flt_t *
p,
unsigned i)
126 assert(i >= 0 && i < p->size);
130static inline float *vec_flt_at_ptr(
vec_flt_t *
p,
unsigned i)
132 assert(i >= 0 && i < p->size);
136static inline float *vec_flt_data(
vec_flt_t *
p)
144 assert(dest != NULL && src != NULL);
145 vec_flt_resize(dest, src->cap);
146 memcpy(dest->data, src->data,
sizeof(
float) * src->cap);
147 dest->size = src->size;
152 assert(dest != NULL && src != NULL);
153 vec_flt_resize(dest, src->size);
154 memcpy(dest->data, src->data,
sizeof(
float) * src->size);
155 dest->size = src->size;
160 if (
p->size ==
p->cap) {
162 vec_flt_reserve(
p, 16);
164 vec_flt_reserve(
p, 2 *
p->cap);
170static inline void vec_flt_assign(
vec_flt_t *
p,
unsigned i,
float value)
172 assert((i >= 0) && (i < vec_flt_size(
p)));
176static inline void vec_flt_insert(
vec_flt_t *
p,
unsigned i,
float value)
178 assert((i >= 0) && (i < vec_flt_size(
p)));
179 vec_flt_push_back(
p, 0);
180 memmove(
p->data + i + 1,
p->data + i, (
p->size - i - 2) *
sizeof(
float));
184static inline void vec_flt_drop(
vec_flt_t *
p,
unsigned i)
186 assert((i >= 0) && (i < vec_flt_size(
p)));
187 memmove(
p->data + i,
p->data + i + 1, (
p->size - i - 1) *
sizeof(
float));
196static inline int vec_flt_asc_compare(
const void *p1,
const void *p2)
198 const float *pp1 = (
const float *) p1;
199 const float *pp2 = (
const float *) p2;
208static inline int vec_flt_desc_compare(
const void* p1,
const void* p2)
210 const float *pp1 = (
const float *) p1;
211 const float *pp2 = (
const float *) p2;
220static inline void vec_flt_sort(
vec_flt_t*
p,
int ascending)
223 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
float),
224 (int (*)(
const void*,
const void*)) vec_flt_asc_compare);
226 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
float),
227 (int (*)(
const void*,
const void*)) vec_flt_desc_compare);
230static inline long vec_flt_memory(
vec_flt_t *
p)
232 return p == NULL ? 0 :
sizeof(float) *
p->cap +
sizeof(
vec_flt_t);
239 fprintf(stdout,
"Vector has %u(%u) entries: {",
p->size,
p->cap);
240 for (i = 0; i <
p->size; i++)
241 fprintf(stdout,
" %f",
p->data[i]);
242 fprintf(stdout,
" }\n");
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
ABC_NAMESPACE_IMPL_START typedef signed char value
#define satoko_realloc(type, ptr, n_elements)
#define satoko_alloc(type, n_elements)
typedefABC_NAMESPACE_HEADER_START struct vec_flt_t_ vec_flt_t