#include "matrix.hpp" #include "constants.hpp" #include using namespace fmt; using std::min, std::max; inline size_t next_x(size_t x, size_t width) { return (x + 1) * ((x + 1) < width); } inline size_t next_y(size_t x, size_t y) { return y + (x == 0); } inline bool at_end(size_t y, size_t height) { return y < height; } inline bool end_row(size_t x, size_t width) { return x == width - 1; } namespace matrix { each_cell::each_cell(Matrix &mat) { height = mat.size(); width = mat[0].size(); } bool each_cell::next() { x = next_x(x, width); y = next_y(x, y); return at_end(y, height); } each_row::each_row(Matrix &mat) : $mat(mat) { height = $mat.size(); width = $mat[0].size(); } bool each_row::next() { x = next_x(x, width); y = next_y(x, y); row = end_row(x, width); return at_end(y, height); } in_box::in_box(Matrix &mat, size_t from_x, size_t from_y, size_t size) { size_t h = mat.size(); size_t w = mat[0].size(); // keeps it from going below zero // need extra -1 to compensate for the first next() left = max(from_x, size) - size; x = left - 1; // must be -1 for next() // keeps it from going above width right = min(from_x + size + 1, w); // same for these two top = max(from_y, size) - size; y = top - (left == 0); bottom = min(from_y + size + 1, h); } bool in_box::next() { // calc next but allow to go to 0 for next x = next_x(x, right); // x will go to 0, which signals new line y = next_y(x, y); // this must go here // if x==0 then this moves it to min_x x = max(x, left); // and done return at_end(y, bottom); } void in_box::dump() { println("BOX: x={},y={}; left={},right={}; top={},bottom={}", x, y, left, right, top, bottom); } void dump(const std::string &msg, Matrix &map, int show_x, int show_y) { println("----------------- {}", msg); for(each_row it{map}; it.next();) { int cell = map[it.y][it.x]; if(int(it.x) == show_x && int(it.y) == show_y) { print("{:x}<", cell); } else if(cell == WALL_PATH_LIMIT) { print("# "); } else if(cell > 15) { print("* "); } else { print("{:x} ", cell); } if(it.row) print("\n"); } } }