changed map.update to be a macro
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 29 Sep 2021 04:06:11 +0000 (23:06 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 29 Sep 2021 04:06:11 +0000 (23:06 -0500)
core/container/iter.onyx
core/container/map.onyx
tests/aoc-2020/day24.onyx

index 2605e782f3128632f977296755343d02fbe1e742..639aec9a25c5e0ed740a732e1a3adf25f5ec9e60 100644 (file)
@@ -82,7 +82,7 @@ take_one :: (it: Iterator($T)) -> (T, bool) {
 // value: i32;
 // iterator: Iterator(i32) = ...;
 //
-// if (#code value) << iterator {
+// if #(value) << iterator {
 //     ...iterater closed...
 // }
 #operator << macro (dest: Code, it: Iterator($T)) -> bool {
index 28be2766954c7c4ee6dd8db8ef53f712c88bb9a1..30941b57b99b57d0b926c9c6cf7009cd4be321fe 100644 (file)
@@ -67,6 +67,8 @@ get :: (use map: ^Map($K, $V), key: K) -> V {
     return default_value;
 }
 
+#operator [] macro (map: Map($K, $V), key: K) -> V do return (package core.map).get(^map, key);
+
 get_ptr :: (use map: ^Map($K, $V), key: K) -> ^V {
     lr := lookup(map, key);
     if lr.entry_index >= 0 do return ^entries[lr.entry_index].value;
@@ -92,11 +94,15 @@ delete :: (use map: ^Map($K, $V), key: K) {
     else                       do hashes[last.hash_index] = lr.entry_index;
 }
 
-update :: (use map: ^Map($K, $V), key: K, f: (^V) -> void) {
-    lr := lookup(map, key);
-    if lr.entry_index < 0 do return;
+update :: macro (map: ^Map($K, $V), key: K, body: Code) {
+    @Hack // Weird hack because 'lookup' exists at file scope.
+    lookup_ :: lookup
 
-    f(^entries[lr.entry_index].value);
+    lr := lookup_(map, key);
+    if lr.entry_index >= 0 {
+        it := ^map.entries[lr.entry_index].value;
+        #insert body;
+    }
 }
 
 clear :: (use map: ^Map($K, $V)) {
index 0e52d1ddef8c89beed57e1a5caeeb04286bc5920..79a535141265869547debb639e40f5bd17fe1cbb 100644 (file)
@@ -108,7 +108,7 @@ main :: (args: [] cstr) {
                }
 
                for ^cell: cells_to_consider {
-                       map.update(^grid, *cell, (state: ^Cell) { state.alive = state.next; });
+                       map.update(^grid, *cell, #code { it.alive = it.next; });
                }
 
                array.clear(^cells_to_consider);