aboutsummaryrefslogtreecommitdiff
path: root/stdlib/tables.h
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-12-06 15:18:25 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-12-06 15:18:25 -0500
commit3a5815d4bd000cb250e3736db7ad02f63d065bfe (patch)
tree253f7c8afbba9bfbd08b9eb4616ed7219300f537 /stdlib/tables.h
parentca14454bb03bda9794ffcb0c0745cf6978b595fc (diff)
Improvements and fixes for assigning to table keys
Diffstat (limited to 'stdlib/tables.h')
-rw-r--r--stdlib/tables.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/stdlib/tables.h b/stdlib/tables.h
index cd19efdd..50ecc453 100644
--- a/stdlib/tables.h
+++ b/stdlib/tables.h
@@ -35,6 +35,14 @@ void *Table$get(Table_t t, const void *key, const TypeInfo_t *type);
const Table_t t = table_expr; const key_t k = key_expr; \
val_t *nonnull_var = Table$get(t, &k, info_expr); \
nonnull_var ? nonnull_expr : null_expr; })
+#define Table$get_or_setdefault(table_expr, key_t, val_t, key_expr, default_expr, info_expr) ({ \
+ Table_t *t = &table_expr; const key_t k = key_expr; \
+ val_t *v = Table$get(*t, &k, info_expr); \
+ v ? v : (val_t*)Table$reserve(t, &k, (val_t[1]){default_expr}, info_expr); })
+#define Table$get_or_default(table_expr, key_t, val_t, key_expr, default_expr, info_expr) ({ \
+ const Table_t t = table_expr; const key_t k = key_expr; \
+ val_t *v = Table$get(t, &k, info_expr); \
+ v ? *v : default_expr; })
#define Table$has_value(table_expr, key_expr, info_expr) ({ \
const Table_t t = table_expr; __typeof(key_expr) k = key_expr; \
(Table$get(t, &k, info_expr) != NULL); })