aboutsummaryrefslogtreecommitdiff
path: root/builtins/table.h
diff options
context:
space:
mode:
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);