nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

dispatch.h (2529B)


      1 typedef struct {
      2 	const char *solvername;
      3 	const char *prefix;
      4 	long long (*dataid)(const char *, char [static NISSY_SIZE_DATAID]);
      5 	long long (*gendata)(
      6 	    const char *, unsigned long long, unsigned char *);
      7 	long long (*checkdata)(
      8 	    const char *, unsigned long long, const unsigned char *);
      9 	long long (*solve)(oriented_cube_t, const char *, unsigned, unsigned,
     10 	    unsigned, unsigned, unsigned, unsigned, unsigned long long,
     11 	    const unsigned char *, unsigned, char *,
     12 	    long long [static NISSY_SIZE_SOLVE_STATS],
     13 	    int (*)(void *), void *);
     14 } solver_dispatch_t;
     15 
     16 STATIC solver_dispatch_t match_solver(const char *);
     17 
     18 solver_dispatch_t solver_dispatchers[] = {
     19 {
     20 	.prefix = "h48",
     21 	.dataid = dataid_h48,
     22 	.gendata = gendata_h48_dispatch,
     23 	.checkdata = checkdata_h48,
     24 	.solve = solve_h48_dispatch,
     25 },
     26 {
     27 	.prefix = "coord_",
     28 	.dataid = dataid_coord,
     29 	.gendata = gendata_coord_dispatch,
     30 	.checkdata = checkdata_coord_dispatch,
     31 	.solve = solve_coord_dispatch,
     32 },
     33 {
     34 	.prefix = "mcoord_",
     35 	.dataid = dataid_coord,
     36 	.gendata = gendata_coord_dispatch,
     37 	.checkdata = checkdata_coord_dispatch,
     38 	.solve = solve_multicoord_dispatch,
     39 },
     40 {
     41 	.prefix = NULL
     42 }
     43 };
     44 
     45 const char *solver_aliases[][2] = {
     46 	{ "optimal", "h48h7" },
     47 	{ "eofb", "coord_EO_UF" },
     48 	{ "eorl", "coord_EO_UR" },
     49 	{ "eoud", "coord_EO_FD" },
     50 	{ "drud", "coord_DR_UF" },
     51 	{ "drrl", "coord_DR_RF" },
     52 	{ "drfb", "coord_DR_FD" },
     53 	{ "drudslice", "coord_DRSLICE_UF" },
     54 	{ "drrlslice", "coord_DRSLICE_LF" },
     55 	{ "drfbslice", "coord_DRSLICE_BU" },
     56 	{ "drud-eofb", "coord_DREO_UF" },
     57 	{ "drrl-eofb", "coord_DREO_RF" },
     58 	{ "drud-eorl", "coord_DREO_UR" },
     59 	{ "drfb-eorl", "coord_DREO_RU" },
     60 	{ "drrl-eoud", "coord_DREO_FR" },
     61 	{ "drfb-eoud", "coord_DREO_FD" },
     62 	{ "drudfin", "mcoord_DRFIN_UF" },
     63 	{ "drrlfin", "mcoord_DRFIN_LF" },
     64 	{ "drfbfin", "mcoord_DRFIN_BU" },
     65 	{ "htr-drud", "coord_HTR_UF" },
     66 	{ "htr-drrl", "coord_HTR_LF" },
     67 	{ "htr-drfb", "coord_HTR_BU" },
     68 	{ "corners", "coord_CORNERS_UF" },
     69 	{ "cornersx", "coord_CORNERSX_UF" },
     70 	{ NULL, NULL }
     71 };
     72 
     73 STATIC solver_dispatch_t
     74 match_solver(const char *name)
     75 {
     76 	const char *prefix;
     77 	solver_dispatch_t ret;
     78 	int i;
     79 
     80 	for (i = 0; solver_aliases[i][0] != NULL; i++)
     81 		if (!strcmp(name, solver_aliases[i][0]))
     82 			return match_solver(solver_aliases[i][1]);
     83 
     84 	for (i = 0; solver_dispatchers[i].prefix != NULL; i++) {
     85 		prefix = solver_dispatchers[i].prefix;
     86 		if (!strncmp(name, prefix, strlen(prefix))) {
     87 			ret = solver_dispatchers[i];
     88 			ret.solvername = name;
     89 			return ret;
     90 		}
     91 	}
     92 
     93 	return solver_dispatchers[i];
     94 }