1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#ifndef SOLVE_H
#define SOLVE_H
#include "moves.h"
#define MAX_SOLVERS 99
typedef struct dfsarg DfsArg;
typedef struct threader Threader;
typedef struct solver Solver;
/* TODO: add solver and threader in DfsData, remove from dispatch args and similar */
struct dfsarg {
void * cubedata;
void * threaddata;
SolveOptions * opts;
int d;
bool niss;
Alg * current_alg;
};
struct threader {
void (*append_sol)(Alg *, void *);
void (*dispatch)(DfsArg *, AlgList *, Solver *, Threader *);
int (*get_nsol)(void *);
/* TODO: threader should have param, like solver? */
};
struct solver {
Moveset * moveset;
bool (*move_check_stop)(void *, DfsArg *, Threader *);
Alg * (*validate_solution)(void *, Alg *);
bool (*niss_makes_sense)(void *, void *, Alg *);
/* TODO: move param to somewhere where it makes more sense */
void * param;
/* TODO: the following should be part of a generic cube description */
/* TODO: remove alloc? */
/* TODO: revisit apply_move, maybe apply_alg? or both? */
void * (*alloc_cubedata)(void *);
void (*copy_cubedata)(void *, void *, void *);
void (*free_cubedata)(void *, void *);
void (*invert_cube)(void *, void *);
bool (*is_solved)(void *, void *);
void (*apply_move)(void *, void *, Move);
/* TODO: remove dependence on Cube, preparation should be done before */
void * (*prepare_cube)(void *, Cube *);
};
void dfs(DfsArg *, Solver *, Threader *);
/* TODO: remove dependence on Cube, preparation should be done before */
AlgList * solve(Cube *, SolveOptions *, Solver **, Threader *);
#endif
|