/** * Copyright (c) 2014 rxi * * This library is free software; you can redistribute it and/or modify it * under the terms of the MIT license. See LICENSE for details. */ #include "vec.h" #include int vec_expand_(void **data, const int *length, int *capacity, int memsz) { if (*length + 1 > *capacity) { void *ptr; int n = (*capacity == 0) ? 1 : *capacity << 1; ptr = realloc(*data, n * memsz); if (ptr == NULL) return -1; *data = ptr; *capacity = n; } return 0; } int vec_reserve_(void **data, const int *length, int *capacity, int memsz, int n) { (void) length; if (n > *capacity) { void *ptr = realloc(*data, n * memsz); if (ptr == NULL) return -1; *data = ptr; *capacity = n; } return 0; } int vec_reserve_po2_( void **data, int *length, int *capacity, int memsz, int n ) { int n2 = 1; if (n == 0) return 0; while (n2 < n) n2 <<= 1; return vec_reserve_(data, length, capacity, memsz, n2); } int vec_compact_(void **data, const int *length, int *capacity, int memsz) { if (*length == 0) { free(*data); *data = NULL; *capacity = 0; } else { void *ptr; int n = *length; ptr = realloc(*data, n * memsz); if (ptr == NULL) return -1; *capacity = n; *data = ptr; } return 0; } int vec_insert_(void **data, int *length, int *capacity, int memsz, int idx ) { char *mdata = *data; int err = vec_expand_(data, length, capacity, memsz); if (err) return err; memmove(mdata + (idx + 1) * memsz, mdata + idx * memsz, (*length - idx) * memsz); return 0; } void vec_splice_(void *const *data, const int *length, const int *capacity, int memsz, int start, int count ) { char *mdata = *data; (void) capacity; memmove(mdata + start * memsz, mdata + (start + count) * memsz, (*length - start - count) * memsz); } void vec_swapsplice_(void *const *data, const int *length, const int *capacity, int memsz, int start, int count ) { char *mdata = *data; (void) capacity; memmove(mdata + start * memsz, mdata + (*length - count) * memsz, count * memsz); } void vec_swap_(void *const *data, const int *length, const int *capacity, int memsz, int idx1, int idx2 ) { unsigned char *a, *b, tmp; int count; (void) length; (void) capacity; if (idx1 == idx2) return; a = (unsigned char*) *data + idx1 * memsz; b = (unsigned char*) *data + idx2 * memsz; count = memsz; while (count--) { tmp = *a; *a = *b; *b = tmp; a++, b++; } }