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 }