aoc-2021/src/grid.c

62 lines
1.5 KiB
C

#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;
}