9#ifndef satoko__utils__vec__vec_char_h
10#define satoko__utils__vec__vec_char_h
31#define vec_char_foreach(vec, entry, i) \
32 for (i = 0; (i < vec_char_size(vec)) && (((entry) = vec_char_at(vec, i)), 1); i++)
34#define vec_char_foreach_start(vec, entry, i, start) \
35 for (i = start; (i < vec_char_size(vec)) && (((entry) = vec_char_at(vec, i)), 1); i++)
37#define vec_char_foreach_stop(vec, entry, i, stop) \
38 for (i = 0; (i < stop) && (((entry) = vec_char_at(vec, i)), 1); i++)
43static inline vec_char_t * vec_char_alloc(
unsigned cap)
47 if (cap > 0 && cap < 16)
55static inline vec_char_t * vec_char_alloc_exact(
unsigned cap)
89static inline void vec_char_resize(
vec_char_t *
p,
unsigned new_size)
92 if (
p->cap >= new_size)
99static inline void vec_char_shrink(
vec_char_t *
p,
unsigned new_size)
105static inline void vec_char_reserve(
vec_char_t *
p,
unsigned new_cap)
107 if (
p->cap >= new_cap)
114static inline unsigned vec_char_capacity(
vec_char_t *
p)
121 return p->size ? 0 : 1;
131static inline char vec_char_at(
vec_char_t *
p,
unsigned idx)
133 assert(idx >= 0 && idx < p->size);
137static inline char * vec_char_at_ptr(
vec_char_t *
p,
unsigned idx)
139 assert(idx >= 0 && idx < p->size);
140 return p->data + idx;
151 assert(dest != NULL && src != NULL);
152 vec_char_resize(dest, src->cap);
153 memcpy(dest->data, src->data,
sizeof(
char) * src->cap);
154 dest->size = src->size;
159 assert(dest != NULL && src != NULL);
160 vec_char_resize(dest, src->size);
161 memcpy(dest->data, src->data,
sizeof(
char) * src->size);
162 dest->size = src->size;
167 if (
p->size ==
p->cap) {
169 vec_char_reserve(
p, 16);
171 vec_char_reserve(
p, 2 *
p->cap);
180 return p->data[--
p->size];
185 assert((idx >= 0) && (idx < vec_char_size(
p)));
191 assert((idx >= 0) && (idx < vec_char_size(
p)));
192 vec_char_push_back(
p, 0);
193 memmove(
p->data + idx + 1,
p->data + idx, (
p->size - idx - 2) *
sizeof(
char));
197static inline void vec_char_drop(
vec_char_t *
p,
unsigned idx)
199 assert((idx >= 0) && (idx < vec_char_size(
p)));
200 memmove(
p->data + idx,
p->data + idx + 1, (
p->size - idx - 1) *
sizeof(
char));
209static inline int vec_char_asc_compare(
const void *p1,
const void *p2)
211 const char *pp1 = (
const char *)p1;
212 const char *pp2 = (
const char *)p2;
221static inline int vec_char_desc_compare(
const void *p1,
const void *p2)
223 const char *pp1 = (
const char *)p1;
224 const char *pp2 = (
const char *)p2;
233static inline void vec_char_sort(
vec_char_t *
p,
int ascending)
236 qsort((
void *)
p->data, (
size_t)
p->size,
sizeof(
char),
237 (int (*)(
const void *,
const void *)) vec_char_asc_compare);
239 qsort((
void*)
p->data, (
size_t)
p->size,
sizeof(
char),
240 (int (*)(
const void *,
const void *)) vec_char_desc_compare);
246 return p == NULL ? 0 :
sizeof(char) *
p->cap +
sizeof(
vec_char_t);
253 fprintf(stdout,
"Vector has %u(%u) entries: {",
p->size,
p->cap);
254 for (i = 0; i <
p->size; i++)
255 fprintf(stdout,
" %d",
p->data[i]);
256 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_char_t_ vec_char_t