@author Michael D. Lowis
@license BSD 2-clause License
*/
+#ifndef VEC_H
+#define VEC_H
+
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
typedef struct {
size_t elem_count;
uint8_t* elem_buffer;
} vec_t;
+typedef int (*vec_cmpfn_t)(const void*,const void*);
+
#ifndef DEFAULT_VEC_CAPACITY
#define DEFAULT_VEC_CAPACITY (size_t)8
#endif
/* Find the next highest power of 2 */
next_power--;
for (bit_n = 1; bit_n < num_bits; bit_n = bit_n << 1)
- {
next_power = next_power | (next_power >> bit_n);
- }
next_power++;
return next_power;
}
static void vec_reserve(vec_t* vec, size_t size) {
- vec->elem_buffer = realloc(vec->elem_buffer, size * vec->elem_size);
- vec->elem_count = size;
+ vec->elem_buffer = realloc(vec->elem_buffer, size * vec->elem_size);
+ vec->elem_capacity = size;
}
static void vec_resize(vec_t* vec, size_t count, void* fillval) {
- if (count > vec->elem_count)
- {
+ if (count > vec->elem_count) {
vec_reserve(vec, vec_next_capacity(count+1));
for (; vec->elem_count < count; vec->elem_count++)
memcpy(&(vec->elem_buffer[vec->elem_count * vec->elem_size]), fillval, vec->elem_size);
- }
- else if (count < vec->elem_count)
- {
+ } else if (count < vec->elem_count) {
vec->elem_count = count;
}
}
static void vec_clear(vec_t* vec) {
vec->elem_count = 0;
}
+
+static void vec_sort(vec_t* vec, int (*cmpfn)(const void*,const void*)) {
+ qsort(vec->elem_buffer, vec->elem_count, vec->elem_size, cmpfn);
+}
+
+#endif /* VEC_H */