12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #include "ds.h"
- #include <string.h>
- // super nifty site:
- // http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
- static int inline nextPOT(int in) {
-
- in--;
- in |= in >> 1;
- in |= in >> 2;
- in |= in >> 4;
- in |= in >> 8;
- in |= in >> 16;
- in++;
-
- return in;
- }
- void vec_resize_to(void** data, size_t* size, size_t elem_size, size_t new_size) {
- void* tmp;
-
- if(*size >= new_size) return;
-
- *size *= nextPOT(new_size);
-
- tmp = realloc(*data, *size * elem_size);
- if(!tmp) {
- fprintf(stderr, "Out of memory in vector resize");
- return;
- }
-
- *data = tmp;
- }
- void vec_resize(void** data, size_t* size, size_t elem_size) {
- void* tmp;
-
- if(*size < 8) *size = 8;
- else *size *= 2;
-
- tmp = realloc(*data, *size * elem_size);
- if(!tmp) {
- fprintf(stderr, "Out of memory in vector resize");
- return;
- }
-
- *data = tmp;
- }
-
- ptrdiff_t vec_find(void* data, size_t len, size_t stride, void* search) {
- size_t i;
- for(i = 0; i < len; i++) {
- if(0 == memcmp(data + (i * stride), search, stride)) {
- return i;
- }
- }
-
- return -1;
- }
|