Refactor is_blankward() in shape.c

This commit is contained in:
Thomas Jensen 2023-12-07 22:04:59 +01:00
parent 0eed7422f6
commit 30950e7f72
No known key found for this signature in database
GPG Key ID: A4ACEE270D0FB7DB
3 changed files with 38 additions and 68 deletions

View File

@ -384,8 +384,8 @@ static size_t find_horizontal_shape(design_t *current_design, comparison_t comp_
}
uint32_t *shape_relevant = prepare_comp_shape(current_design, hshape, j, comp_type,
is_blank_leftward(current_design, hshape, j),
is_blank_rightward(current_design, hshape, j));
is_blankward(current_design, hshape, j, 1),
is_blankward(current_design, hshape, j, 0));
size_t length_relevant = u32_strlen(shape_relevant);
for (size_t k = 0; k < current_design->shape[hshape].height; ++k) {

View File

@ -176,6 +176,8 @@ void freeshape(sentry_t *shape)
}
BFREE (shape->chars);
BFREE (shape->mbcs);
BFREE (shape->blank_leftward);
BFREE (shape->blank_rightward);
*shape = SENTRY_INITIALIZER;
}
@ -398,28 +400,16 @@ static int *new_blankward_cache(const size_t shape_height)
int is_blank_leftward(design_t *current_design, const shape_t shape, const size_t shape_line_idx)
static int is_blankward_calc(
design_t *current_design, const shape_t shape, const size_t shape_line_idx, const int is_leftward)
{
if (current_design == NULL) {
return 0; /* this would be a bug */
}
sentry_t *shape_data = current_design->shape + shape;
if (shape_line_idx >= shape_data->height) {
return 0; /* this would be a bug */
}
if (shape_data->blank_leftward != NULL && shape_data->blank_leftward[shape_line_idx] >= 0) {
return shape_data->blank_leftward[shape_line_idx]; /* cached value available */
}
if (shape_data->blank_leftward == NULL) {
shape_data->blank_leftward = new_blankward_cache(shape_data->height);
}
int result = -1;
if (is_west(shape_data, 1)) {
result = 1;
sentry_t *shape_data = current_design->shape + shape;
if (is_west(shape_data, is_leftward ? 1 : 0)) {
result = is_leftward ? 1 : 0;
}
else if (is_east(shape_data, 0)) {
result = 0;
else if (is_east(shape_data, is_leftward ? 0 : 1)) {
result = is_leftward ? 0 : 1;
}
else {
shape_t *side = north_side;
@ -429,7 +419,13 @@ int is_blank_leftward(design_t *current_design, const shape_t shape, const size_
pos = find_in_south(shape);
}
result = 1;
for (size_t i = 0; i < (size_t) pos; i++) {
size_t loop_init = (size_t) pos + 1;
size_t loop_end = SHAPES_PER_SIDE;
if (is_leftward) {
loop_init = 0;
loop_end = (size_t) pos;
}
for (size_t i = loop_init; i < loop_end; i++) {
sentry_t *tshape = current_design->shape + side[i];
if (tshape->mbcs != NULL && !bxs_is_blank(tshape->mbcs[shape_line_idx])) {
result = 0;
@ -437,14 +433,12 @@ int is_blank_leftward(design_t *current_design, const shape_t shape, const size_
}
}
}
shape_data->blank_leftward[shape_line_idx] = result;
return result;
}
// TODO HERE is_blank_rightward() and is_blank_leftward() are nearly identical -> consolidate
int is_blank_rightward(design_t *current_design, const shape_t shape, const size_t shape_line_idx)
int is_blankward(design_t *current_design, const shape_t shape, const size_t shape_line_idx, const int is_leftward)
{
if (current_design == NULL) {
return 0; /* this would be a bug */
@ -453,38 +447,22 @@ int is_blank_rightward(design_t *current_design, const shape_t shape, const size
if (shape_line_idx >= shape_data->height) {
return 0; /* this would be a bug */
}
if (shape_data->blank_rightward != NULL && shape_data->blank_rightward[shape_line_idx] >= 0) {
return shape_data->blank_rightward[shape_line_idx]; /* cached value available */
int *blankward_cache = is_leftward ? shape_data->blank_leftward : shape_data->blank_rightward;
if (blankward_cache != NULL && blankward_cache[shape_line_idx] >= 0) {
return blankward_cache[shape_line_idx]; /* cached value available */
}
if (shape_data->blank_rightward == NULL) {
shape_data->blank_rightward = new_blankward_cache(shape_data->height);
}
int result = -1;
if (is_west(shape_data, 0)) {
result = 0;
}
else if (is_east(shape_data, 1)) {
result = 1;
}
else {
shape_t *side = north_side;
int pos = find_in_north(shape);
if (pos < 0) {
side = south_side_rev;
pos = find_in_south(shape);
if (blankward_cache == NULL) {
blankward_cache = new_blankward_cache(shape_data->height);
if (is_leftward) {
shape_data->blank_leftward = blankward_cache;
}
result = 1;
for (size_t i = (size_t) pos + 1; i < SHAPES_PER_SIDE; i++) {
sentry_t *tshape = current_design->shape + side[i];
if (tshape->mbcs != NULL && !bxs_is_blank(tshape->mbcs[shape_line_idx])) {
result = 0;
break;
}
else {
shape_data->blank_rightward = blankward_cache;
}
}
shape_data->blank_rightward[shape_line_idx] = result;
int result = is_blankward_calc(current_design, shape, shape_line_idx, is_leftward);
blankward_cache[shape_line_idx] = result;
return result;
}

View File

@ -54,24 +54,16 @@ int empty_side (sentry_t *sarr, const int aside);
/**
* Determine if there are only blanks to the left of this shape on the given line. The result is cached in the shape.
* Determine if there are only blanks to the left (or right) of this shape on the given line. The result is cached in
* the shape.
* @param current_design the design whose shapes to use
* @param shape the shape for which to calculate "blank_leftward"
* @param shape the shape for which to calculate the result
* @param shape_line_idx the index of the shape line to assess
* @return 1 if blank leftward, 0 otherwise. Will always return 1 if shape is part of the left (west) box side, and
* always 0 if shape is an east side shape (not a corner)
* @param is_leftward 1 to check on the left, 0 to check on the right
* @return 1 if blank, 0 otherwise. Box contents is always counted as "not blank" (because it could be), and the outside
* of a box counts as blank.
*/
int is_blank_leftward(design_t *current_design, const shape_t shape, const size_t shape_line_idx);
/**
* Determine if there are only blanks to the right of this shape on the given line. The result is cached in the shape.
* @param current_design the design whose shapes to use
* @param shape the shape for which to calculate "blank_rightward"
* @param shape_line_idx the index of the shape line to assess
* @return 1 if blank rightward, 0 otherwise. Will always return 1 if shape is part of the right (east) box side, and
* always 0 if shape is a west side shape (not a corner)
*/
int is_blank_rightward(design_t *current_design, const shape_t shape, const size_t shape_line_idx);
int is_blankward(design_t *current_design, const shape_t shape, const size_t shape_line_idx, const int is_leftward);
/**