diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-02-29 12:37:09 -0500 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-02-29 12:37:09 -0500 |
| commit | ec75208980f29628604aed45a4f64cfa3c62e0df (patch) | |
| tree | b1cf929cb2735f8ad258c60317410e111ad58462 /builtins/table.h | |
| parent | a7bbbe9584f6e4cd35c9a78e8f83b458ddd8f914 (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.h | 14 |
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); |
