9#ifndef satoko__utils__vec__vec_uint_h
10#define satoko__utils__vec__vec_uint_h
31#define vec_uint_foreach(vec, entry, i) \
32 for (i = 0; (i < vec_uint_size(vec)) && (((entry) = vec_uint_at(vec, i)), 1); i++)
34#define vec_uint_foreach_start(vec, entry, i, start) \
35 for (i = start; (i < vec_uint_size(vec)) && (((entry) = vec_uint_at(vec, i)), 1); i++)
37#define vec_uint_foreach_stop(vec, entry, i, stop) \
38 for (i = 0; (i < stop) && (((entry) = vec_uint_at(vec, i)), 1); i++)
43static inline vec_uint_t * vec_uint_alloc(
unsigned cap)
47 if (cap > 0 && cap < 16)
55static inline vec_uint_t * vec_uint_alloc_exact(
unsigned cap)
89static inline void vec_uint_resize(
vec_uint_t *
p,
unsigned new_size)
92 if (
p->cap >= new_size)
99static inline void vec_uint_shrink(
vec_uint_t *
p,
unsigned new_size)
105static inline void vec_uint_reserve(
vec_uint_t *
p,
unsigned new_cap)
107 if (
p->cap >= new_cap)
114static inline unsigned vec_uint_capacity(
vec_uint_t *
p)
121 return p->size ? 0 : 1;
131static inline unsigned vec_uint_at(
vec_uint_t *
p,
unsigned idx)
133 assert(idx >= 0 && idx < p->size);
137static inline unsigned * vec_uint_at_ptr(
vec_uint_t *
p,
unsigned idx)
139 assert(idx >= 0 && idx < p->size);
140 return p->data + idx;
143static inline unsigned vec_uint_find(
vec_uint_t *
p,
unsigned entry)
146 for (i = 0; i <
p->size; i++)
147 if (
p->data[i] == entry)
152static inline unsigned * vec_uint_data(
vec_uint_t *
p)
160 assert(dest != NULL && src != NULL);
161 vec_uint_resize(dest, src->cap);
162 memcpy(dest->data, src->data,
sizeof(
unsigned) * src->cap);
163 dest->size = src->size;
168 assert(dest != NULL && src != NULL);
169 vec_uint_resize(dest, src->size);
170 memcpy(dest->data, src->data,
sizeof(
unsigned) * src->size);
171 dest->size = src->size;
176 if (
p->size ==
p->cap) {
178 vec_uint_reserve(
p, 16);
180 vec_uint_reserve(
p, 2 *
p->cap);
186static inline unsigned vec_uint_pop_back(
vec_uint_t *
p)
189 return p->data[--
p->size];
192static inline void vec_uint_assign(
vec_uint_t *
p,
unsigned idx,
unsigned value)
194 assert((idx >= 0) && (idx < vec_uint_size(
p)));
198static inline void vec_uint_insert(
vec_uint_t *
p,
unsigned idx,
unsigned value)
200 assert((idx >= 0) && (idx < vec_uint_size(
p)));
201 vec_uint_push_back(
p, 0);
202 memmove(
p->data + idx + 1,
p->data + idx, (
p->size - idx - 2) *
sizeof(
unsigned));
206static inline void vec_uint_drop(
vec_uint_t *
p,
unsigned idx)
208 assert((idx >= 0) && (idx < vec_uint_size(
p)));
209 memmove(
p->data + idx,
p->data + idx + 1, (
p->size - idx - 1) *
sizeof(
unsigned));
218static inline int vec_uint_asc_compare(
const void *p1,
const void *p2)
220 const unsigned *pp1 = (
const unsigned *) p1;
221 const unsigned *pp2 = (
const unsigned *) p2;
230static inline int vec_uint_desc_compare(
const void *p1,
const void *p2)
232 const unsigned *pp1 = (
const unsigned *) p1;
233 const unsigned *pp2 = (
const unsigned *) p2;
242static inline void vec_uint_sort(
vec_uint_t *
p,
int ascending)
245 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
unsigned),
246 (int (*)(
const void *,
const void *)) vec_uint_asc_compare);
248 qsort((
void*)
p->data, (
size_t)
p->size,
sizeof(
unsigned),
249 (int (*)(
const void *,
const void *)) vec_uint_desc_compare);
254 return p == NULL ? 0 :
sizeof(unsigned) *
p->cap +
sizeof(
vec_uint_t);
261 fprintf(stdout,
"Vector has %u(%u) entries: {",
p->size,
p->cap);
262 for (i = 0; i <
p->size; i++)
263 fprintf(stdout,
" %u",
p->data[i]);
264 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_uint_t_ vec_uint_t