62 lines
1.5 KiB
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;
|
|
|
|
} |