diff options
| author | 2025-12-12 10:20:39 +0100 | |
|---|---|---|
| committer | 2025-12-12 10:21:43 +0100 | |
| commit | 5f0793c34c4f10a2221b793316fdc82c50d10452 (patch) | |
| tree | ff7ecf50458935dfb7a1d2f3aeea30d7d84696c3 /common.h | |
| parent | 88652eeb10cd9381aafb2d55e9474bb0799630b1 (diff) | |
lex: use pmap for macro lookup
To reduce hashmap code repetition. Also add pmap_del for this purpose
Diffstat (limited to 'common.h')
| -rw-r--r-- | common.h | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -273,14 +273,17 @@ struct pmapbase { void **k; uint n, N; }; void pmap_init_(struct pmapbase *, void **v, uint vsiz, uint N); int pmap_get_(struct pmapbase *, const void *k); int pmap_set_(struct pmapbase *, void **v, uint vsiz, const void *k); +void pmap_del_(struct pmapbase *, const void *k); +extern char pmap_tombstone_[]; #define pmap_free(m) (free((m)->mb.k), memset((m), 0, sizeof *(m))) #define pmap_init(m, N) (pmap_free(m), pmap_init_(&(m)->mb, (void **)&(m)->v, sizeof*(m)->v, (N))) #define pmap_get(m, k) (((m)->tmp = pmap_get_(&(m)->mb, k)) < 0 ? NULL : &(m)->v[(m)->tmp]) #define pmap_set(m, k, x) ((m)->tmp = pmap_set_(&(m)->mb, (void **)&(m)->v, sizeof*(m)->v, k), \ (m)->v[(m)->tmp] = (x)) +#define pmap_del(m, k) pmap_del_(&(m)->mb, k) #define pmap_each(m,kx,pvx) \ - for (int _i = 0; _i < (m)->mb.N && ((kx) = (m)->mb.k[_i], (pvx) = &(m)->v[_i], 1); ++_i) \ - if (kx) + for (size_t _i = 0; _i < (m)->mb.N && ((kx) = (m)->mb.k[_i], (pvx) = &(m)->v[_i], 1); ++_i) \ + if (kx && kx != pmap_tombstone_) /** bitset **/ struct bitset { uvlong u; }; |