Simon Tatham e6cdd70df8 grid.c: allocate face/edge/dot arrays incrementally.
Previously, the 'faces', 'edges' and 'dots' arrays in a grid structure
were arrays of actual grid_face, grid_edge and grid_dot structures,
physically containing all the data about the grid. But they also
referred to each other by pointers, which meant that they were hard to
realloc larger (you'd have to go through and rewrite all the pointers
whenever the base of an array moved). And _that_ meant that every grid
type had to figure out a reasonably good upper bound on the number of
all those things it was going to need, so that it could allocate those
arrays the right size to begin with, and not have to grow them
painfully later.

For some grid types - particularly the new aperiodic ones - that was
actually a painful part of the job. So I think enough is enough:
counting up how much memory you're going to need before using it is a
mug's game, and we should instead realloc on the fly.

So now g->faces, g->edges and g->dots have an extra level of
indirection. Instead of being arrays of actual structs, they're arrays
of pointers, and each struct in them is individually allocated. Once a
grid_face has been allocated, it never moves again, even if the array
of pointers changes size.

The old code had a common idiom of recovering the array index of a
particular element by subtracting it from the array base, e.g. writing
'f - g->faces' or 'e - g->edges'. To make that lookup remain possible,
I've added an 'index' field to each sub-structure, which is
initialised at the point where we decide what array index it will live
at.

This should involve no functional change, but the code that previously
had to figure out max_faces and max_dots up front for each grid type
is now completely gone, and nobody has to solve those problems in
advance any more.
2023-07-07 18:17:02 +01:00
2023-07-05 19:39:57 +01:00
2021-04-25 09:59:15 +01:00
2023-04-20 18:42:50 +01:00
2023-07-05 19:39:57 +01:00
2023-07-05 19:39:57 +01:00
2023-06-11 00:33:27 +01:00
2023-01-15 20:59:22 +00:00
2023-06-11 00:33:27 +01:00
2023-03-26 20:32:38 +01:00
2023-06-11 00:33:27 +01:00
2023-06-16 19:04:50 +01:00
2023-06-11 00:33:27 +01:00
2023-06-26 09:17:01 +01:00
2023-06-16 19:04:50 +01:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2023-06-16 19:04:50 +01:00
2023-06-16 19:04:50 +01:00
2023-04-02 14:35:12 +01:00
2017-09-20 18:03:44 +01:00
2021-05-21 09:10:53 +01:00
2023-06-11 00:33:27 +01:00
2021-03-29 19:02:23 +01:00
2023-06-11 00:33:27 +01:00
2023-06-16 19:04:50 +01:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2018-11-13 21:48:24 +00:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2023-06-11 00:33:27 +01:00
2023-06-16 19:04:50 +01:00
2023-06-11 00:33:27 +01:00
2023-06-16 19:04:50 +01:00
2023-06-11 00:33:27 +01:00
2017-05-07 16:25:56 +01:00

This is the README accompanying the source code to Simon Tatham's
puzzle collection. The collection's web site is at
<https://www.chiark.greenend.org.uk/~sgtatham/puzzles/>.

The puzzle collection is built using CMake <https://cmake.org/>. To
compile in the simplest way (on any of Linux, Windows or Mac), run
these commands in the source directory:

  cmake .
  cmake --build .

The manual is provided in Windows Help format for the Windows build;
in text format for anyone who needs it; and in HTML for the Mac OS X
application and for the web site. It is generated from a Halibut
source file (puzzles.but), which is the preferred form for
modification. To generate the manual in other formats, rebuild it,
or learn about Halibut, visit the Halibut website at
<https://www.chiark.greenend.org.uk/~sgtatham/halibut/>.
Description
No description provided
Readme 26 MiB
Languages
C 93.3%
JavaScript 1.4%
Objective-C 1.1%
CMake 1.1%
HTML 0.8%
Other 2.2%