aboutsummaryrefslogtreecommitdiffhomepage
path: root/common.h
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-12 10:20:39 +0100
committerlemon <lsof@mailbox.org>2025-12-12 10:21:43 +0100
commit5f0793c34c4f10a2221b793316fdc82c50d10452 (patch)
treeff7ecf50458935dfb7a1d2f3aeea30d7d84696c3 /common.h
parent88652eeb10cd9381aafb2d55e9474bb0799630b1 (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.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/common.h b/common.h
index 30b3cea..ae0beab 100644
--- a/common.h
+++ b/common.h
@@ -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; };