diff --git a/cli_main.c b/cli_main.c index f531d2b..f3b4950 100644 --- a/cli_main.c +++ b/cli_main.c @@ -1,5 +1,6 @@ #include "base.h" #include "field.h" +#include "mark.h" #include "sim.h" #include @@ -93,8 +94,11 @@ int main(int argc, char** argv) { fprintf(stderr, "File load error: %s.\n", errstr); return 1; } + Markmap_reusable markmap_r; + markmap_reusable_init(&markmap_r); + markmap_reusable_ensure_size(&markmap_r, field.height, field.width); for (int i = 0; i < ticks; ++i) { - orca_run(&field); + orca_run(&field, markmap_r.buffer); } field_fput(&field, stdout); field_deinit(&field); diff --git a/mark.c b/mark.c index 57f6806..1de8d3f 100644 --- a/mark.c +++ b/mark.c @@ -1,21 +1,22 @@ #include "mark.h" -void markmap_init(Markmap* map) { +void markmap_reusable_init(Markmap_reusable* map) { map->buffer = NULL; map->capacity = 0; } -void markmap_ensure_capacity(Markmap* map, Usz capacity) { +void markmap_reusable_ensure_size(Markmap_reusable* map, Usz height, + Usz width) { + Usz capacity = height * width; if (map->capacity < capacity) { map->buffer = realloc(map->buffer, capacity); map->capacity = capacity; } } -void markmap_clear(Markmap* map) { - memset(map->buffer, 0, map->capacity); -} +void markmap_reusable_deinit(Markmap_reusable* map) { free(map->buffer); } -void markmap_deinit(Markmap* map) { - free(map->buffer); +void markmap_clear(Markmap_buffer map, Usz height, Usz width) { + Usz cleared_size = height * width; + memset(map, 0, cleared_size); } diff --git a/mark.h b/mark.h index cc26c6c..d206104 100644 --- a/mark.h +++ b/mark.h @@ -11,41 +11,48 @@ typedef enum { Mark_flag_sleep_phase1 = 1 << 4, } Mark_flags; -typedef struct { - U8* buffer; +typedef U8* Markmap_buffer; + +typedef struct Markmap_reusable { + Markmap_buffer buffer; Usz capacity; -} Markmap; +} Markmap_reusable; + +void markmap_reusable_init(Markmap_reusable* map); +void markmap_reusable_ensure_size(Markmap_reusable* map, Usz height, Usz width); +void markmap_reusable_deinit(Markmap_reusable* map); -void markmap_init(Markmap* map); -void markmap_ensure_capacity(Markmap* map, Usz capacity); -void markmap_clear(Markmap* map); -void markmap_deinit(Markmap* map); +void markmap_clear(Markmap_buffer map, Usz height, Usz width); ORCA_FORCE_INLINE -Mark_flags markmap_peek_relative(Markmap* map, Usz map_height, Usz map_width, - Usz y, Usz x, Isz offs_y, Isz offs_x); +Mark_flags markmap_peek_relative(Markmap_buffer map, Usz map_height, + Usz map_width, Usz y, Usz x, Isz offs_y, + Isz offs_x); ORCA_FORCE_INLINE -void markmap_poke_relative(Markmap* map, Usz map_height, Usz map_width, Usz y, - Usz x, Isz offs_y, Isz offs_x, Mark_flags flags); +void markmap_poke_relative(Markmap_buffer map, Usz map_height, Usz map_width, + Usz y, Usz x, Isz offs_y, Isz offs_x, + Mark_flags flags); // Inline implementation ORCA_FORCE_INLINE -Mark_flags markmap_peek_relative(Markmap* map, Usz map_height, Usz map_width, - Usz y, Usz x, Isz offs_y, Isz offs_x) { +Mark_flags markmap_peek_relative(Markmap_buffer map, Usz map_height, + Usz map_width, Usz y, Usz x, Isz offs_y, + Isz offs_x) { Isz y0 = (Isz)y + offs_y; Isz x0 = (Isz)x + offs_x; if (y0 >= (Isz)map_height || x0 >= (Isz)map_width || y0 < 0 || x0 < 0) return Mark_flag_none; - return map->buffer[(Usz)y0 * map_width + (Usz)x0]; + return map[(Usz)y0 * map_width + (Usz)x0]; } ORCA_FORCE_INLINE -void markmap_poke_relative(Markmap* map, Usz map_height, Usz map_width, Usz y, - Usz x, Isz offs_y, Isz offs_x, Mark_flags flags) { +void markmap_poke_relative(Markmap_buffer map, Usz map_height, Usz map_width, + Usz y, Usz x, Isz offs_y, Isz offs_x, + Mark_flags flags) { Isz y0 = (Isz)y + offs_y; Isz x0 = (Isz)x + offs_x; if (y0 >= (Isz)map_height || x0 >= (Isz)map_width || y0 < 0 || x0 < 0) return; - map->buffer[(Usz)y0 * map_width + (Usz)x0] = flags; + map[(Usz)y0 * map_width + (Usz)x0] = (U8)flags; } diff --git a/sim.c b/sim.c index db34ff4..2f812fc 100644 --- a/sim.c +++ b/sim.c @@ -91,7 +91,8 @@ static inline void oper_m_phase1(Field* field, Usz y, Usz x) { } } -void orca_run(Field* field) { +void orca_run(Field* field, Markmap_buffer markmap) { + (void)markmap; Usz ny = field->height; Usz nx = field->width; Glyph* field_buffer = field->buffer; diff --git a/sim.h b/sim.h index 56386c0..d87c944 100644 --- a/sim.h +++ b/sim.h @@ -1,4 +1,5 @@ #pragma once #include "base.h" +#include "mark.h" -void orca_run(Field* f); +void orca_run(Field* field, Markmap_buffer markmap);