9#ifndef satoko__utils__vec__vec_sdbl_h
10#define satoko__utils__vec__vec_sdbl_h
32#define vec_sdbl_foreach(vec, entry, i) \
33 for (i = 0; (i < vec->size) && (((entry) = vec_sdbl_at(vec, i)), 1); i++)
35#define vec_sdbl_foreach_start(vec, entry, i, start) \
36 for (i = start; (i < vec_sdbl_size(vec)) && (((entry) = vec_sdbl_at(vec, i)), 1); i++)
38#define vec_sdbl_foreach_stop(vec, entry, i, stop) \
39 for (i = 0; (i < stop) && (((entry) = vec_sdbl_at(vec, i)), 1); i++)
44static inline vec_sdbl_t *vec_sdbl_alloc(
unsigned cap)
48 if (cap > 0 && cap < 16)
56static inline vec_sdbl_t *vec_sdbl_alloc_exact(
unsigned cap)
89static inline void vec_sdbl_shrink(
vec_sdbl_t *
p,
unsigned new_size)
91 assert(new_size <= p->cap);
95static inline void vec_sdbl_resize(
vec_sdbl_t *
p,
unsigned new_size)
98 if (
p->cap >= new_size)
105static inline void vec_sdbl_reserve(
vec_sdbl_t *
p,
unsigned new_cap)
107 if (
p->cap >= new_cap)
114static inline unsigned vec_sdbl_capacity(
vec_sdbl_t *
p)
121 return p->size ? 0 : 1;
133 assert(i >= 0 && i < p->size);
139 assert(i >= 0 && i < p->size);
151 assert(dest != NULL && src != NULL);
152 vec_sdbl_resize(dest, src->cap);
153 memcpy(dest->data, src->data,
sizeof(
sdbl_t) * src->cap);
154 dest->size = src->size;
159 assert(dest != NULL && src != NULL);
160 vec_sdbl_resize(dest, src->size);
161 memcpy(dest->data, src->data,
sizeof(
sdbl_t) * src->size);
162 dest->size = src->size;
167 if (
p->size ==
p->cap) {
169 vec_sdbl_reserve(
p, 16);
171 vec_sdbl_reserve(
p, 2 *
p->cap);
179 assert((i >= 0) && (i < vec_sdbl_size(
p)));
185 assert((i >= 0) && (i < vec_sdbl_size(
p)));
186 vec_sdbl_push_back(
p, 0);
191static inline void vec_sdbl_drop(
vec_sdbl_t *
p,
unsigned i)
193 assert((i >= 0) && (i < vec_sdbl_size(
p)));
203static inline int vec_sdbl_asc_compare(
const void *p1,
const void *p2)
215static inline int vec_sdbl_desc_compare(
const void* p1,
const void* p2)
227static inline void vec_sdbl_sort(
vec_sdbl_t*
p,
int ascending)
230 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
sdbl_t),
231 (int (*)(
const void*,
const void*)) vec_sdbl_asc_compare);
233 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
sdbl_t),
234 (int (*)(
const void*,
const void*)) vec_sdbl_desc_compare);
246 fprintf(stdout,
"Vector has %u(%u) entries: {",
p->size,
p->cap);
247 for (i = 0; i <
p->size; i++)
248 fprintf(stdout,
" %f", sdbl2double(
p->data[i]));
249 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)
ABC_NAMESPACE_HEADER_START typedef word sdbl_t
typedefABC_NAMESPACE_HEADER_START struct vec_sdbl_t_ vec_sdbl_t