X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/4496362fadb5f60b8ecf431fb220d26df7280f99..9537a20c2976c1a12380c91609eb8d383ef2c52e:/puzzles.h diff --git a/puzzles.h b/puzzles.h index 1561f4a..c9cca05 100644 --- a/puzzles.h +++ b/puzzles.h @@ -253,7 +253,7 @@ char *midend_get_game_id(midend *me); int midend_can_format_as_text_now(midend *me); char *midend_text_format(midend *me); char *midend_solve(midend *me); -int midend_is_solved(midend *me); +int midend_status(midend *me); int midend_can_undo(midend *me); int midend_can_redo(midend *me); void midend_supersede_game_desc(midend *me, char *desc, char *privdesc); @@ -348,6 +348,43 @@ void dsf_merge(int *dsf, int v1, int v2); void dsf_init(int *dsf, int len); /* + * tdq.c + */ + +/* + * Data structure implementing a 'to-do queue', a simple + * de-duplicating to-do list mechanism. + * + * Specification: a tdq is a queue which can hold integers from 0 to + * n-1, where n was some constant specified at tdq creation time. No + * integer may appear in the queue's current contents more than once; + * an attempt to add an already-present integer again will do nothing, + * so that that integer is removed from the queue at the position + * where it was _first_ inserted. The add and remove operations take + * constant time. + * + * The idea is that you might use this in applications like solvers: + * keep a tdq listing the indices of grid squares that you currently + * need to process in some way. Whenever you modify a square in a way + * that will require you to re-scan its neighbours, add them to the + * list with tdq_add; meanwhile you're constantly taking elements off + * the list when you need another square to process. In solvers where + * deductions are mostly localised, this should prevent repeated + * O(N^2) loops over the whole grid looking for something to do. (But + * if only _most_ of the deductions are localised, then you should + * respond to an empty to-do list by re-adding everything using + * tdq_fill, so _then_ you rescan the whole grid looking for newly + * enabled non-local deductions. Only if you've done that and emptied + * the list again finding nothing new to do are you actually done.) + */ +typedef struct tdq tdq; +tdq *tdq_new(int n); +void tdq_free(tdq *tdq); +void tdq_add(tdq *tdq, int k); +int tdq_remove(tdq *tdq); /* returns -1 if nothing available */ +void tdq_fill(tdq *tdq); /* add everything to the tdq at once */ + +/* * laydomino.c */ int *domino_layout(int w, int h, random_state *rs); @@ -462,8 +499,8 @@ struct game { void (*decode_ui)(game_ui *ui, char *encoding); void (*changed_state)(game_ui *ui, game_state *oldstate, game_state *newstate); - char *(*interpret_move)(game_state *state, game_ui *ui, game_drawstate *ds, - int x, int y, int button); + char *(*interpret_move)(game_state *state, game_ui *ui, + const game_drawstate *ds, int x, int y, int button); game_state *(*execute_move)(game_state *state, char *move); int preferred_tilesize; void (*compute_size)(game_params *params, int tilesize, int *x, int *y); @@ -479,7 +516,7 @@ struct game { game_ui *ui); float (*flash_length)(game_state *oldstate, game_state *newstate, int dir, game_ui *ui); - int (*is_solved)(game_state *state); + int (*status)(game_state *state); int can_print, can_print_in_colour; void (*print_size)(game_params *params, float *x, float *y); void (*print)(drawing *dr, game_state *state, int tilesize);