#include "grid.h" #include "puzzle_input.h" #include "string.h" static grid_ret_t index_in_range(const grid_t * grid, int ii, int jj) { return (ii >= grid->height) || (ii < 0) || (jj >= grid->width) || (jj < 0); } static void * get_index_ptr(const grid_t * grid, int ii, int jj) { return grid->data + (jj * grid->elem_size) + (ii * grid->width * grid->elem_size); } grid_ret_t grid_init(grid_t * grid, size_t max_height, size_t max_width, size_t elem_size, void * data_store) { grid->max_height = max_height; grid->max_width = max_width; grid->elem_size = elem_size; grid->data = data_store; grid->height = max_height; grid->width = max_width; return GRID_OK; } grid_ret_t grid_get_data(const grid_t * grid, int ii, int jj, void * ret) { if (index_in_range(grid, ii, jj)) { return GRID_INDEX_OUT_OF_RANGE; } else { void * index = get_index_ptr(grid, ii, jj); if (ret != NULL) { memcpy(ret, index, grid->elem_size); } else { return GRID_INVALID_RET_PTR; } } return GRID_OK; } grid_ret_t grid_set_data(const grid_t * grid, int ii, int jj, void * val) { if (index_in_range(grid, ii, jj)) { return GRID_INDEX_OUT_OF_RANGE; } else { void * index = get_index_ptr(grid, ii, jj); if (val != NULL) { memcpy(index, val, grid->elem_size); } else { return GRID_INVALID_RET_PTR; } } return GRID_OK; }