9#ifndef satoko__utils__vec__vec_int_h
10#define satoko__utils__vec__vec_int_h
31#define vec_int_foreach(vec, entry, i) \
32 for (i = 0; (i < vec->size) && (((entry) = vec_int_at(vec, i)), 1); i++)
34#define vec_int_foreach_start(vec, entry, i, start) \
35 for (i = start; (i < vec_int_size(vec)) && (((entry) = vec_int_at(vec, i)), 1); i++)
37#define vec_int_foreach_stop(vec, entry, i, stop) \
38 for (i = 0; (i < stop) && (((entry) = vec_int_at(vec, i)), 1); i++)
43static inline vec_int_t *vec_int_alloc(
unsigned cap)
47 if (cap > 0 && cap < 16)
55static inline vec_int_t *vec_int_alloc_exact(
unsigned cap)
83static inline unsigned vec_int_size(
vec_int_t *
p)
88static inline void vec_int_resize(
vec_int_t *
p,
unsigned new_size)
91 if (
p->cap >= new_size)
98static inline void vec_int_reserve(
vec_int_t *
p,
unsigned new_cap)
100 if (
p->cap >= new_cap)
107static inline unsigned vec_int_capacity(
vec_int_t *
p)
114 return p->size ? 0 : 1;
124static inline int vec_int_at(
vec_int_t *
p,
unsigned i)
126 assert(i >= 0 && i < p->size);
130static inline int *vec_int_at_ptr(
vec_int_t *
p,
unsigned i)
132 assert(i >= 0 && i < p->size);
138 assert(dest != NULL && src != NULL);
139 vec_int_resize(dest, src->cap);
140 memcpy(dest->data, src->data,
sizeof(
int) * src->cap);
141 dest->size = src->size;
146 assert(dest != NULL && src != NULL);
147 vec_int_resize(dest, src->size);
148 memcpy(dest->data, src->data,
sizeof(
int) * src->size);
149 dest->size = src->size;
154 if (
p->size ==
p->cap) {
156 vec_int_reserve(
p, 16);
158 vec_int_reserve(
p, 2 *
p->cap);
166 assert((i >= 0) && (i < vec_int_size(
p)));
172 assert((i >= 0) && (i < vec_int_size(
p)));
173 vec_int_push_back(
p, 0);
174 memmove(
p->data + i + 1,
p->data + i, (
p->size - i - 2) *
sizeof(
int));
178static inline void vec_int_drop(
vec_int_t *
p,
unsigned i)
180 assert((i >= 0) && (i < vec_int_size(
p)));
181 memmove(
p->data + i,
p->data + i + 1, (
p->size - i - 1) *
sizeof(
int));
190static inline int vec_int_asc_compare(
const void *p1,
const void *p2)
192 const int *pp1 = (
const int *) p1;
193 const int *pp2 = (
const int *) p2;
202static inline int vec_int_desc_compare(
const void* p1,
const void* p2)
204 const int *pp1 = (
const int *) p1;
205 const int *pp2 = (
const int *) p2;
214static inline void vec_int_sort(
vec_int_t*
p,
int ascending)
217 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
int),
218 (int (*)(
const void*,
const void*)) vec_int_asc_compare);
220 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
int),
221 (int (*)(
const void*,
const void*)) vec_int_desc_compare);
224static inline long vec_int_memory(
vec_int_t *
p)
226 return p == NULL ? 0 :
sizeof(int) *
p->cap +
sizeof(
vec_int_t);
233 fprintf(stdout,
"Vector has %u(%u) entries: {",
p->size,
p->cap);
234 for (i = 0; i <
p->size; i++)
235 fprintf(stdout,
" %d",
p->data[i]);
236 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_int_t_ vec_int_t