aboutsummaryrefslogtreecommitdiff
path: root/builtins/table.h
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-29 12:37:09 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-29 12:37:09 -0500
commitec75208980f29628604aed45a4f64cfa3c62e0df (patch)
treeb1cf929cb2735f8ad258c60317410e111ad58462 /builtins/table.h
parenta7bbbe9584f6e4cd35c9a78e8f83b458ddd8f914 (diff)
Fix up some import issues and improve arrays to use saturating refcounts
instead of .copy_on_write
Diffstat (limited to 'builtins/table.h')
-rw-r--r--builtins/table.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/builtins/table.h b/builtins/table.h
index d11a876d..023df218 100644
--- a/builtins/table.h
+++ b/builtins/table.h
@@ -24,7 +24,19 @@
if (__builtin_expect($v == NULL, 0)) \
fail_source(filename, start, end, "The key %r is not in this table\n", generic_as_str(&$k, USE_COLOR, $info->TableInfo.key)); \
*$v; })
-
+#define $TABLE_FOREACH(table_expr, key_type, k, value_type, v, value_offset, body, else_body) {\
+ array_t $entries = (table_expr).entries; \
+ if ($entries.length == 0) else_body \
+ else { \
+ $ARRAY_INCREF($entries); \
+ for (int64_t $i = 0; $i < $entries.length; $i++) { \
+ key_type k = *(key_type*)($entries.data + $i*$entries.stride); \
+ value_type v = *(value_type*)($entries.data + $i*$entries.stride + value_offset); \
+ body \
+ } \
+ $ARRAY_DECREF($entries); \
+ } \
+ }
table_t Table_from_entries(array_t entries, const TypeInfo *type);
void *Table_get(const table_t *t, const void *key, const TypeInfo *type);