diff options
| author | Simon Tatham <anakin@pobox.com> | 2023-04-20 13:52:13 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2023-04-20 17:21:54 +0100 |
| commit | 11a8149d673d96bec17d6487b5fa95b5bf5ffd6b (patch) | |
| tree | 8087f57805f3cc7f981bffcee9fecebd9e806610 | |
| parent | bb561ee3b18be69e52b17cedde50eac96ea409da (diff) | |
| download | puzzles-11a8149d673d96bec17d6487b5fa95b5bf5ffd6b.zip puzzles-11a8149d673d96bec17d6487b5fa95b5bf5ffd6b.tar.gz puzzles-11a8149d673d96bec17d6487b5fa95b5bf5ffd6b.tar.bz2 puzzles-11a8149d673d96bec17d6487b5fa95b5bf5ffd6b.tar.xz | |
Use a dedicated copy function to copy dsfs.
Previously we were duplicating the contents of a dsf using straight-up
memcpy. Now there's a dsf_copy function wrapping the same memcpy.
For the moment, this still has to take a size parameter, because the
size isn't stored inside the dsf itself. But once we make a proper
data type, it will be.
| -rw-r--r-- | bridges.c | 8 | ||||
| -rw-r--r-- | dsf.c | 5 | ||||
| -rw-r--r-- | loopy.c | 6 | ||||
| -rw-r--r-- | puzzles.h | 2 | ||||
| -rw-r--r-- | signpost.c | 2 |
5 files changed, 14 insertions, 9 deletions
@@ -1551,7 +1551,7 @@ static bool solve_island_stage3(struct island *is, bool *didsth_r) maxb = -1; /* We have to squirrel the dsf away and restore it afterwards; * it is additive only, and can't be removed from. */ - memcpy(ss->tmpdsf, ss->dsf, wh*sizeof(int)); + dsf_copy(ss->tmpdsf, ss->dsf, wh); for (n = curr+1; n <= curr+spc; n++) { solve_join(is, i, n, false); map_update_possibles(is->state); @@ -1567,7 +1567,7 @@ static bool solve_island_stage3(struct island *is, bool *didsth_r) } } solve_join(is, i, curr, false); /* put back to before. */ - memcpy(ss->dsf, ss->tmpdsf, wh*sizeof(int)); + dsf_copy(ss->dsf, ss->tmpdsf, wh); if (maxb != -1) { /*debug_state(is->state);*/ @@ -1636,7 +1636,7 @@ static bool solve_island_stage3(struct island *is, bool *didsth_r) is->adj.points[j].dx ? G_LINEH : G_LINEV); if (before[i] != 0) continue; /* this idea is pointless otherwise */ - memcpy(ss->tmpdsf, ss->dsf, wh*sizeof(int)); + dsf_copy(ss->tmpdsf, ss->dsf, wh); for (j = 0; j < is->adj.npoints; j++) { spc = island_adjspace(is, true, missing, j); @@ -1651,7 +1651,7 @@ static bool solve_island_stage3(struct island *is, bool *didsth_r) for (j = 0; j < is->adj.npoints; j++) solve_join(is, j, before[j], false); - memcpy(ss->dsf, ss->tmpdsf, wh*sizeof(int)); + dsf_copy(ss->dsf, ss->tmpdsf, wh); if (got) { debug(("island at (%d,%d) must connect in direction (%d,%d) to" @@ -74,6 +74,11 @@ void dsf_init(int *dsf, int size) * bits are the number of elements in the tree. */ } +void dsf_copy(int *to, int *from, int size) +{ + memcpy(to, from, size * sizeof(int)); +} + int *snew_dsf(int size) { int *ret; @@ -457,8 +457,7 @@ static solver_state *dup_solver_state(const solver_state *sstate) { ret->dotdsf = snewn(num_dots, int); ret->looplen = snewn(num_dots, int); - memcpy(ret->dotdsf, sstate->dotdsf, - num_dots * sizeof(int)); + dsf_copy(ret->dotdsf, sstate->dotdsf, num_dots); memcpy(ret->looplen, sstate->looplen, num_dots * sizeof(int)); @@ -487,8 +486,7 @@ static solver_state *dup_solver_state(const solver_state *sstate) { if (sstate->linedsf) { ret->linedsf = snewn(num_edges, int); - memcpy(ret->linedsf, sstate->linedsf, - num_edges * sizeof(int)); + dsf_copy(ret->linedsf, sstate->linedsf, num_edges); } else { ret->linedsf = NULL; } @@ -431,6 +431,8 @@ void dsf_free(int *dsf); void print_dsf(int *dsf, int size); +void dsf_copy(int *to, int *from, int size); + /* Return the canonical element of the equivalence class containing element * val. If 'inverse' is non-NULL, this function will put into it a flag * indicating whether the canonical element is inverse to val. */ @@ -482,7 +482,7 @@ static void dup_game_to(game_state *to, const game_state *from) memcpy(to->next, from->next, to->n*sizeof(int)); memcpy(to->prev, from->prev, to->n*sizeof(int)); - memcpy(to->dsf, from->dsf, to->n*sizeof(int)); + dsf_copy(to->dsf, from->dsf, to->n); memcpy(to->numsi, from->numsi, (to->n+1)*sizeof(int)); } |