-rw-r--r-- 3343 holtrace-20250617/vector.h raw
#ifndef VECTOR_h #define VECTOR_h #include <stdlib.h> #include <string.h> #include <assert.h> #define VECTOR_declare_typedef(X) \ typedef struct { \ X *VECTOR_data; \ long long VECTOR_len; \ long long VECTOR_allocated; \ } vector_##X; #define VECTOR_declare(X) \ VECTOR_declare_typedef(X) \ extern void vector_##X##_allocate(vector_##X *,long long); \ extern X vector_##X##_read(const vector_##X *,long long); \ extern void vector_##X##_write(vector_##X *,long long,X); \ extern void vector_##X##_append(vector_##X *,X); \ extern void vector_##X##_trunc(vector_##X *,long long); \ extern void vector_##X##_empty(vector_##X *); \ extern long long vector_##X##_len(const vector_##X *); \ extern void vector_##X##_free(vector_##X *); \ #define VECTOR_define_prefix(X,prefix) \ prefix void vector_##X##_allocate(vector_##X *VECTOR_v,long long VECTOR_n) \ { \ void *VECTOR_newdata; \ \ if (VECTOR_n <= VECTOR_v->VECTOR_allocated) return; \ if ((unsigned long long) VECTOR_n >= (1LL<<(8*sizeof(size_t)-3))/sizeof(X)) abort(); \ if (VECTOR_v->VECTOR_data) { \ VECTOR_n += VECTOR_n>>3; \ VECTOR_n += 1; \ } \ \ VECTOR_newdata = reallocarray(VECTOR_v->VECTOR_data,VECTOR_n,sizeof(X)); \ if (!VECTOR_newdata) abort(); \ VECTOR_v->VECTOR_data = VECTOR_newdata; \ assert(VECTOR_v->VECTOR_allocated < VECTOR_n); \ memset(VECTOR_v->VECTOR_data+VECTOR_v->VECTOR_allocated,0,sizeof(X)*(VECTOR_n-VECTOR_v->VECTOR_allocated)); \ VECTOR_v->VECTOR_allocated = VECTOR_n; \ } \ \ prefix X vector_##X##_read(const vector_##X *VECTOR_v,long long VECTOR_pos) \ { \ if (VECTOR_pos < 0 || VECTOR_pos >= VECTOR_v->VECTOR_len) { \ X VECTOR_zero; \ memset(&VECTOR_zero,0,sizeof VECTOR_zero); \ return VECTOR_zero; \ } \ return VECTOR_v->VECTOR_data[VECTOR_pos]; \ } \ \ prefix void vector_##X##_write(vector_##X *VECTOR_v,long long VECTOR_pos,X VECTOR_x) \ { \ assert(VECTOR_pos >= 0); \ if ((unsigned long long) VECTOR_pos >= (1LL<<(8*sizeof(size_t)-3))/sizeof(X)) abort(); \ vector_##X##_allocate(VECTOR_v,VECTOR_pos+1); \ if (VECTOR_pos >= VECTOR_v->VECTOR_len) VECTOR_v->VECTOR_len = VECTOR_pos+1; \ VECTOR_v->VECTOR_data[VECTOR_pos] = VECTOR_x; \ } \ prefix void vector_##X##_trunc(vector_##X *VECTOR_v,long long VECTOR_n) \ { \ if (VECTOR_v->VECTOR_len > VECTOR_n) { \ memset(VECTOR_v->VECTOR_data+VECTOR_n,0,(VECTOR_v->VECTOR_len-VECTOR_n)*sizeof(X)); \ VECTOR_v->VECTOR_len = VECTOR_n; \ } \ } \ prefix void vector_##X##_empty(vector_##X *VECTOR_v) \ { \ vector_##X##_trunc(VECTOR_v,0); \ } \ prefix long long vector_##X##_len(const vector_##X *VECTOR_v) \ { \ return VECTOR_v->VECTOR_len; \ } \ prefix void vector_##X##_free(vector_##X *VECTOR_v) \ { \ if (VECTOR_v->VECTOR_data) free(VECTOR_v->VECTOR_data); \ VECTOR_v->VECTOR_data = 0; \ VECTOR_v->VECTOR_len = 0; \ VECTOR_v->VECTOR_allocated = 0; \ } \ prefix void vector_##X##_append(vector_##X *VECTOR_v,X VECTOR_x) \ { \ vector_##X##_write(VECTOR_v,vector_##X##_len(VECTOR_v),VECTOR_x); \ } \ #define VECTOR_define(X) VECTOR_define_prefix(X,) #define VECTOR_define_inline(X) \ VECTOR_declare_typedef(X) \ VECTOR_define_prefix(X,static inline) #endif