diff options
Diffstat (limited to 'include/libn.h')
-rw-r--r-- | include/libn.h | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/include/libn.h b/include/libn.h index 2b8dc4c..5d557ce 100644 --- a/include/libn.h +++ b/include/libn.h @@ -22,34 +22,31 @@ typedef wchar_t wchar; // ---------------------------------------------------------------------------- // dynamic array -typedef struct bufHdr +typedef struct BufHdr { vlong len; vlong cap; byte buf[]; -} bufHdr; +} BufHdr; -#define _bufHdr(s) ((bufHdr*)((uint8*)(s)-offsetof(bufHdr, buf))) -#define buflen(s) ((s) ? (_bufHdr(s)->len) : 0) -#define bufcap(s) ((s) ? (_bufHdr(s)->cap) : 0) -#define bufend(s) ((s) + buflen(s)) -#define bufsize(s) ((s) ? (buflen(s) * sizeof((s)[0])) : 0) +#define bufhdr(b) ((BufHdr*)((uint8*)(b)-offsetof(BufHdr, buf))) +#define buflen(b) ((b) ? (bufhdr(b)->len) : 0) +#define bufcap(b) ((b) ? (bufhdr(b)->cap) : 0) +#define bufend(b) ((b) + buflen(b)) +#define bufsize(b) ((b) ? (buflen(b) * sizeof((b)[0])) : 0) -#define buffree(s) ((s) ? (free(_bufHdr(s)), (s) = nil) : 0) -#define buffit(s, n) ((n) <= bufcap(s) ? 0 : ((s) = bufgrow((s), (n), sizeof(*(s))))) +#define buffree(b) ((b) ? (free(bufhdr(b)), (b) = nil) : 0) +#define buffit(b, n) ((n) <= bufcap(b) ? 0 : ((b) = ·bufgrow((b), (n), sizeof(*(b))))) -#define bufresize(s, n) \ - do { \ - (buffit(s, n)); \ - ((_bufHdr(s)->len) = (n)); \ - } while (0) +#define bufpush(b, ...) (buffit((b), 1 + buflen(b)), (b)[bufhdr(b)->len++] = (__VA_ARGS__)) +#define bufaddn(b, n) (buffit(b, buflen(b)+n), bufhdr(b)->len += n, b+bufhdr(b)->len-n) -#define bufpush(s, ...) (buffit((s), 1 + buflen(s)), (s)[_bufHdr(s)->len++] = (__VA_ARGS__)) +#define bufpop(b) ((b)[--bufhdr(b)->len]) +#define bufdel(b, i) bufdeln((b), (i), 1) +#define bufdeln(b, i, n) (memmove((b)+(i), (b)+(i)+(n), sizeof(*(b))*(bufhdr(b)->len-(n)-(i)), bufhdr(b)->len -= (n)) +#define bufdelswap(b, i) ((b)[i] = bufend(b)[-1], bufhdr(b)->len-=1) -#define bufpop(s, i) (_bufpop((s), (i), sizeof(*(s))), (s)[_bufHdr(s)->len]) - -void* bufgrow(void*, vlong, vlong); -void _bufpop(void*, int, vlong); +void* ·bufgrow(void*, vlong, vlong); // ----------------------------------------------------------------------------- // memory allocation @@ -408,9 +405,11 @@ void sort·strings(uintptr n, byte* arr[]); // fast random number generation error rng·init(uint64 seed); -double rng·random(); +double rng·random(void); +double rng·exponential(double lambda); bool rng·bernoulli(double f); uint64 rng·randi(int max); +uint64 rng·poisson(double mean); // ----------------------------------------------------------------------------- // variable arguments |