diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/common.h | 14 | ||||
| -rw-r--r-- | src/core/constant_cubes.h | 229 | ||||
| -rw-r--r-- | src/core/constants.h | 734 | ||||
| -rw-r--r-- | src/core/core.h | 3 | ||||
| -rw-r--r-- | src/core/core_types.h | 4 | ||||
| -rw-r--r-- | src/core/cube.h | 95 | ||||
| -rw-r--r-- | src/core/moves.h | 12 | ||||
| -rw-r--r-- | src/core/transform.h | 13 | ||||
| -rw-r--r-- | src/nissy.c | 77 | ||||
| -rw-r--r-- | src/nissy.h | 25 | ||||
| -rw-r--r-- | src/solvers/h48/solve.h | 4 | ||||
| -rw-r--r-- | src/utils/constants.h | 442 |
12 files changed, 846 insertions, 806 deletions
diff --git a/src/arch/common.h b/src/arch/common.h index e57fba9..922ea51 100644 --- a/src/arch/common.h +++ b/src/arch/common.h | |||
| @@ -1,3 +1,17 @@ | |||
| 1 | #define EOSHIFT UINT8_C(4) | ||
| 2 | #define COSHIFT UINT8_C(5) | ||
| 3 | |||
| 4 | #define PBITS UINT8_C(0xF) | ||
| 5 | #define ESEPBIT_1 UINT8_C(0x4) | ||
| 6 | #define ESEPBIT_2 UINT8_C(0x8) | ||
| 7 | #define CSEPBIT UINT8_C(0x4) | ||
| 8 | #define EOBIT UINT8_C(0x10) | ||
| 9 | #define COBITS UINT8_C(0xF0) | ||
| 10 | #define COBITS_2 UINT8_C(0x60) | ||
| 11 | #define CTWIST_CW UINT8_C(0x20) | ||
| 12 | #define CTWIST_CCW UINT8_C(0x40) | ||
| 13 | #define EFLIP UINT8_C(0x10) | ||
| 14 | |||
| 1 | STATIC_INLINE int popcount_u32(uint32_t); | 15 | STATIC_INLINE int popcount_u32(uint32_t); |
| 2 | 16 | ||
| 3 | STATIC void pieces(cube_t [static 1], uint8_t [static 8], uint8_t [static 12]); | 17 | STATIC void pieces(cube_t [static 1], uint8_t [static 8], uint8_t [static 12]); |
diff --git a/src/core/constant_cubes.h b/src/core/constant_cubes.h deleted file mode 100644 index 9657e1a..0000000 --- a/src/core/constant_cubes.h +++ /dev/null | |||
| @@ -1,229 +0,0 @@ | |||
| 1 | #define MOVE_CUBE_U STATIC_CUBE( \ | ||
| 2 | 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11) | ||
| 3 | #define MOVE_CUBE_U2 STATIC_CUBE( \ | ||
| 4 | 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11) | ||
| 5 | #define MOVE_CUBE_U3 STATIC_CUBE( \ | ||
| 6 | 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11) | ||
| 7 | #define MOVE_CUBE_D STATIC_CUBE( \ | ||
| 8 | 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11) | ||
| 9 | #define MOVE_CUBE_D2 STATIC_CUBE( \ | ||
| 10 | 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11) | ||
| 11 | #define MOVE_CUBE_D3 STATIC_CUBE( \ | ||
| 12 | 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11) | ||
| 13 | #define MOVE_CUBE_R STATIC_CUBE( \ | ||
| 14 | 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4) | ||
| 15 | #define MOVE_CUBE_R2 STATIC_CUBE( \ | ||
| 16 | 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8) | ||
| 17 | #define MOVE_CUBE_R3 STATIC_CUBE( \ | ||
| 18 | 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7) | ||
| 19 | #define MOVE_CUBE_L STATIC_CUBE( \ | ||
| 20 | 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11) | ||
| 21 | #define MOVE_CUBE_L2 STATIC_CUBE( \ | ||
| 22 | 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11) | ||
| 23 | #define MOVE_CUBE_L3 STATIC_CUBE( \ | ||
| 24 | 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11) | ||
| 25 | #define MOVE_CUBE_F STATIC_CUBE( \ | ||
| 26 | 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11) | ||
| 27 | #define MOVE_CUBE_F2 STATIC_CUBE( \ | ||
| 28 | 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11) | ||
| 29 | #define MOVE_CUBE_F3 STATIC_CUBE( \ | ||
| 30 | 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11) | ||
| 31 | #define MOVE_CUBE_B STATIC_CUBE( \ | ||
| 32 | 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18) | ||
| 33 | #define MOVE_CUBE_B2 STATIC_CUBE( \ | ||
| 34 | 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10) | ||
| 35 | #define MOVE_CUBE_B3 STATIC_CUBE( \ | ||
| 36 | 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17) | ||
| 37 | |||
| 38 | #define TRANS_CUBE_UFr STATIC_CUBE( \ | ||
| 39 | 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) | ||
| 40 | #define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \ | ||
| 41 | 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) | ||
| 42 | #define TRANS_CUBE_ULr STATIC_CUBE( \ | ||
| 43 | 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) | ||
| 44 | #define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \ | ||
| 45 | 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) | ||
| 46 | #define TRANS_CUBE_UBr STATIC_CUBE( \ | ||
| 47 | 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) | ||
| 48 | #define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \ | ||
| 49 | 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) | ||
| 50 | #define TRANS_CUBE_URr STATIC_CUBE( \ | ||
| 51 | 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) | ||
| 52 | #define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \ | ||
| 53 | 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) | ||
| 54 | #define TRANS_CUBE_DFr STATIC_CUBE( \ | ||
| 55 | 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) | ||
| 56 | #define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \ | ||
| 57 | 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) | ||
| 58 | #define TRANS_CUBE_DLr STATIC_CUBE( \ | ||
| 59 | 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) | ||
| 60 | #define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \ | ||
| 61 | 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) | ||
| 62 | #define TRANS_CUBE_DBr STATIC_CUBE( \ | ||
| 63 | 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) | ||
| 64 | #define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \ | ||
| 65 | 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) | ||
| 66 | #define TRANS_CUBE_DRr STATIC_CUBE( \ | ||
| 67 | 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) | ||
| 68 | #define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \ | ||
| 69 | 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) | ||
| 70 | #define TRANS_CUBE_RUr STATIC_CUBE( \ | ||
| 71 | 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) | ||
| 72 | #define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \ | ||
| 73 | 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) | ||
| 74 | #define TRANS_CUBE_RFr STATIC_CUBE( \ | ||
| 75 | 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) | ||
| 76 | #define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \ | ||
| 77 | 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) | ||
| 78 | #define TRANS_CUBE_RDr STATIC_CUBE( \ | ||
| 79 | 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) | ||
| 80 | #define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \ | ||
| 81 | 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) | ||
| 82 | #define TRANS_CUBE_RBr STATIC_CUBE( \ | ||
| 83 | 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) | ||
| 84 | #define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \ | ||
| 85 | 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) | ||
| 86 | #define TRANS_CUBE_LUr STATIC_CUBE( \ | ||
| 87 | 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) | ||
| 88 | #define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \ | ||
| 89 | 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) | ||
| 90 | #define TRANS_CUBE_LFr STATIC_CUBE( \ | ||
| 91 | 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) | ||
| 92 | #define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \ | ||
| 93 | 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) | ||
| 94 | #define TRANS_CUBE_LDr STATIC_CUBE( \ | ||
| 95 | 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) | ||
| 96 | #define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \ | ||
| 97 | 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) | ||
| 98 | #define TRANS_CUBE_LBr STATIC_CUBE( \ | ||
| 99 | 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) | ||
| 100 | #define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \ | ||
| 101 | 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) | ||
| 102 | #define TRANS_CUBE_FUr STATIC_CUBE( \ | ||
| 103 | 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) | ||
| 104 | #define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \ | ||
| 105 | 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) | ||
| 106 | #define TRANS_CUBE_FRr STATIC_CUBE( \ | ||
| 107 | 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) | ||
| 108 | #define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \ | ||
| 109 | 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) | ||
| 110 | #define TRANS_CUBE_FDr STATIC_CUBE( \ | ||
| 111 | 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) | ||
| 112 | #define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \ | ||
| 113 | 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) | ||
| 114 | #define TRANS_CUBE_FLr STATIC_CUBE( \ | ||
| 115 | 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) | ||
| 116 | #define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \ | ||
| 117 | 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) | ||
| 118 | #define TRANS_CUBE_BUr STATIC_CUBE( \ | ||
| 119 | 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) | ||
| 120 | #define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \ | ||
| 121 | 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) | ||
| 122 | #define TRANS_CUBE_BRr STATIC_CUBE( \ | ||
| 123 | 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) | ||
| 124 | #define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \ | ||
| 125 | 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) | ||
| 126 | #define TRANS_CUBE_BDr STATIC_CUBE( \ | ||
| 127 | 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) | ||
| 128 | #define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \ | ||
| 129 | 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) | ||
| 130 | #define TRANS_CUBE_BLr STATIC_CUBE( \ | ||
| 131 | 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) | ||
| 132 | #define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \ | ||
| 133 | 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) | ||
| 134 | #define TRANS_CUBE_UFm STATIC_CUBE( \ | ||
| 135 | 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) | ||
| 136 | #define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \ | ||
| 137 | 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) | ||
| 138 | #define TRANS_CUBE_ULm STATIC_CUBE( \ | ||
| 139 | 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) | ||
| 140 | #define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \ | ||
| 141 | 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) | ||
| 142 | #define TRANS_CUBE_UBm STATIC_CUBE( \ | ||
| 143 | 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) | ||
| 144 | #define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \ | ||
| 145 | 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) | ||
| 146 | #define TRANS_CUBE_URm STATIC_CUBE( \ | ||
| 147 | 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) | ||
| 148 | #define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \ | ||
| 149 | 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) | ||
| 150 | #define TRANS_CUBE_DFm STATIC_CUBE( \ | ||
| 151 | 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) | ||
| 152 | #define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \ | ||
| 153 | 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) | ||
| 154 | #define TRANS_CUBE_DLm STATIC_CUBE( \ | ||
| 155 | 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) | ||
| 156 | #define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \ | ||
| 157 | 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) | ||
| 158 | #define TRANS_CUBE_DBm STATIC_CUBE( \ | ||
| 159 | 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) | ||
| 160 | #define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \ | ||
| 161 | 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) | ||
| 162 | #define TRANS_CUBE_DRm STATIC_CUBE( \ | ||
| 163 | 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) | ||
| 164 | #define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \ | ||
| 165 | 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) | ||
| 166 | #define TRANS_CUBE_RUm STATIC_CUBE( \ | ||
| 167 | 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) | ||
| 168 | #define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \ | ||
| 169 | 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) | ||
| 170 | #define TRANS_CUBE_RFm STATIC_CUBE( \ | ||
| 171 | 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) | ||
| 172 | #define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \ | ||
| 173 | 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) | ||
| 174 | #define TRANS_CUBE_RDm STATIC_CUBE( \ | ||
| 175 | 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) | ||
| 176 | #define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \ | ||
| 177 | 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) | ||
| 178 | #define TRANS_CUBE_RBm STATIC_CUBE( \ | ||
| 179 | 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) | ||
| 180 | #define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \ | ||
| 181 | 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) | ||
| 182 | #define TRANS_CUBE_LUm STATIC_CUBE( \ | ||
| 183 | 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) | ||
| 184 | #define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \ | ||
| 185 | 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) | ||
| 186 | #define TRANS_CUBE_LFm STATIC_CUBE( \ | ||
| 187 | 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) | ||
| 188 | #define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \ | ||
| 189 | 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) | ||
| 190 | #define TRANS_CUBE_LDm STATIC_CUBE( \ | ||
| 191 | 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) | ||
| 192 | #define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \ | ||
| 193 | 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) | ||
| 194 | #define TRANS_CUBE_LBm STATIC_CUBE( \ | ||
| 195 | 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) | ||
| 196 | #define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \ | ||
| 197 | 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) | ||
| 198 | #define TRANS_CUBE_FUm STATIC_CUBE( \ | ||
| 199 | 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) | ||
| 200 | #define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \ | ||
| 201 | 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) | ||
| 202 | #define TRANS_CUBE_FRm STATIC_CUBE( \ | ||
| 203 | 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) | ||
| 204 | #define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \ | ||
| 205 | 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) | ||
| 206 | #define TRANS_CUBE_FDm STATIC_CUBE( \ | ||
| 207 | 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) | ||
| 208 | #define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \ | ||
| 209 | 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) | ||
| 210 | #define TRANS_CUBE_FLm STATIC_CUBE( \ | ||
| 211 | 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) | ||
| 212 | #define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \ | ||
| 213 | 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) | ||
| 214 | #define TRANS_CUBE_BUm STATIC_CUBE( \ | ||
| 215 | 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) | ||
| 216 | #define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \ | ||
| 217 | 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) | ||
| 218 | #define TRANS_CUBE_BRm STATIC_CUBE( \ | ||
| 219 | 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) | ||
| 220 | #define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \ | ||
| 221 | 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) | ||
| 222 | #define TRANS_CUBE_BDm STATIC_CUBE( \ | ||
| 223 | 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) | ||
| 224 | #define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \ | ||
| 225 | 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) | ||
| 226 | #define TRANS_CUBE_BLm STATIC_CUBE( \ | ||
| 227 | 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) | ||
| 228 | #define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \ | ||
| 229 | 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) | ||
diff --git a/src/core/constants.h b/src/core/constants.h new file mode 100644 index 0000000..e8b80ae --- /dev/null +++ b/src/core/constants.h | |||
| @@ -0,0 +1,734 @@ | |||
| 1 | #define ZERO_ORIENTED_CUBE ((oriented_cube_t) {0}) | ||
| 2 | #define SOLVED_ORIENTED_CUBE \ | ||
| 3 | ((oriented_cube_t) { .cube = SOLVED_CUBE, .orientation = 0 }) | ||
| 4 | |||
| 5 | #define MOVE_CUBE_U STATIC_CUBE( \ | ||
| 6 | 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11) | ||
| 7 | #define MOVE_CUBE_U2 STATIC_CUBE( \ | ||
| 8 | 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11) | ||
| 9 | #define MOVE_CUBE_U3 STATIC_CUBE( \ | ||
| 10 | 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11) | ||
| 11 | #define MOVE_CUBE_D STATIC_CUBE( \ | ||
| 12 | 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11) | ||
| 13 | #define MOVE_CUBE_D2 STATIC_CUBE( \ | ||
| 14 | 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11) | ||
| 15 | #define MOVE_CUBE_D3 STATIC_CUBE( \ | ||
| 16 | 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11) | ||
| 17 | #define MOVE_CUBE_R STATIC_CUBE( \ | ||
| 18 | 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4) | ||
| 19 | #define MOVE_CUBE_R2 STATIC_CUBE( \ | ||
| 20 | 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8) | ||
| 21 | #define MOVE_CUBE_R3 STATIC_CUBE( \ | ||
| 22 | 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7) | ||
| 23 | #define MOVE_CUBE_L STATIC_CUBE( \ | ||
| 24 | 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11) | ||
| 25 | #define MOVE_CUBE_L2 STATIC_CUBE( \ | ||
| 26 | 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11) | ||
| 27 | #define MOVE_CUBE_L3 STATIC_CUBE( \ | ||
| 28 | 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11) | ||
| 29 | #define MOVE_CUBE_F STATIC_CUBE( \ | ||
| 30 | 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11) | ||
| 31 | #define MOVE_CUBE_F2 STATIC_CUBE( \ | ||
| 32 | 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11) | ||
| 33 | #define MOVE_CUBE_F3 STATIC_CUBE( \ | ||
| 34 | 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11) | ||
| 35 | #define MOVE_CUBE_B STATIC_CUBE( \ | ||
| 36 | 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18) | ||
| 37 | #define MOVE_CUBE_B2 STATIC_CUBE( \ | ||
| 38 | 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10) | ||
| 39 | #define MOVE_CUBE_B3 STATIC_CUBE( \ | ||
| 40 | 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17) | ||
| 41 | |||
| 42 | #define TRANS_CUBE_UFr STATIC_CUBE( \ | ||
| 43 | 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) | ||
| 44 | #define TRANS_CUBE_UFr_INVERSE STATIC_CUBE( \ | ||
| 45 | 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) | ||
| 46 | #define TRANS_CUBE_ULr STATIC_CUBE( \ | ||
| 47 | 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) | ||
| 48 | #define TRANS_CUBE_ULr_INVERSE STATIC_CUBE( \ | ||
| 49 | 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) | ||
| 50 | #define TRANS_CUBE_UBr STATIC_CUBE( \ | ||
| 51 | 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) | ||
| 52 | #define TRANS_CUBE_UBr_INVERSE STATIC_CUBE( \ | ||
| 53 | 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9) | ||
| 54 | #define TRANS_CUBE_URr STATIC_CUBE( \ | ||
| 55 | 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26) | ||
| 56 | #define TRANS_CUBE_URr_INVERSE STATIC_CUBE( \ | ||
| 57 | 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24) | ||
| 58 | #define TRANS_CUBE_DFr STATIC_CUBE( \ | ||
| 59 | 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) | ||
| 60 | #define TRANS_CUBE_DFr_INVERSE STATIC_CUBE( \ | ||
| 61 | 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10) | ||
| 62 | #define TRANS_CUBE_DLr STATIC_CUBE( \ | ||
| 63 | 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) | ||
| 64 | #define TRANS_CUBE_DLr_INVERSE STATIC_CUBE( \ | ||
| 65 | 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27) | ||
| 66 | #define TRANS_CUBE_DBr STATIC_CUBE( \ | ||
| 67 | 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) | ||
| 68 | #define TRANS_CUBE_DBr_INVERSE STATIC_CUBE( \ | ||
| 69 | 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8) | ||
| 70 | #define TRANS_CUBE_DRr STATIC_CUBE( \ | ||
| 71 | 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) | ||
| 72 | #define TRANS_CUBE_DRr_INVERSE STATIC_CUBE( \ | ||
| 73 | 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25) | ||
| 74 | #define TRANS_CUBE_RUr STATIC_CUBE( \ | ||
| 75 | 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) | ||
| 76 | #define TRANS_CUBE_RUr_INVERSE STATIC_CUBE( \ | ||
| 77 | 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) | ||
| 78 | #define TRANS_CUBE_RFr STATIC_CUBE( \ | ||
| 79 | 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) | ||
| 80 | #define TRANS_CUBE_RFr_INVERSE STATIC_CUBE( \ | ||
| 81 | 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) | ||
| 82 | #define TRANS_CUBE_RDr STATIC_CUBE( \ | ||
| 83 | 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) | ||
| 84 | #define TRANS_CUBE_RDr_INVERSE STATIC_CUBE( \ | ||
| 85 | 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) | ||
| 86 | #define TRANS_CUBE_RBr STATIC_CUBE( \ | ||
| 87 | 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) | ||
| 88 | #define TRANS_CUBE_RBr_INVERSE STATIC_CUBE( \ | ||
| 89 | 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16) | ||
| 90 | #define TRANS_CUBE_LUr STATIC_CUBE( \ | ||
| 91 | 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) | ||
| 92 | #define TRANS_CUBE_LUr_INVERSE STATIC_CUBE( \ | ||
| 93 | 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) | ||
| 94 | #define TRANS_CUBE_LFr STATIC_CUBE( \ | ||
| 95 | 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17) | ||
| 96 | #define TRANS_CUBE_LFr_INVERSE STATIC_CUBE( \ | ||
| 97 | 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18) | ||
| 98 | #define TRANS_CUBE_LDr STATIC_CUBE( \ | ||
| 99 | 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) | ||
| 100 | #define TRANS_CUBE_LDr_INVERSE STATIC_CUBE( \ | ||
| 101 | 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) | ||
| 102 | #define TRANS_CUBE_LBr STATIC_CUBE( \ | ||
| 103 | 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) | ||
| 104 | #define TRANS_CUBE_LBr_INVERSE STATIC_CUBE( \ | ||
| 105 | 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19) | ||
| 106 | #define TRANS_CUBE_FUr STATIC_CUBE( \ | ||
| 107 | 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) | ||
| 108 | #define TRANS_CUBE_FUr_INVERSE STATIC_CUBE( \ | ||
| 109 | 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6) | ||
| 110 | #define TRANS_CUBE_FRr STATIC_CUBE( \ | ||
| 111 | 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21) | ||
| 112 | #define TRANS_CUBE_FRr_INVERSE STATIC_CUBE( \ | ||
| 113 | 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3) | ||
| 114 | #define TRANS_CUBE_FDr STATIC_CUBE( \ | ||
| 115 | 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) | ||
| 116 | #define TRANS_CUBE_FDr_INVERSE STATIC_CUBE( \ | ||
| 117 | 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) | ||
| 118 | #define TRANS_CUBE_FLr STATIC_CUBE( \ | ||
| 119 | 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23) | ||
| 120 | #define TRANS_CUBE_FLr_INVERSE STATIC_CUBE( \ | ||
| 121 | 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2) | ||
| 122 | #define TRANS_CUBE_BUr STATIC_CUBE( \ | ||
| 123 | 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7) | ||
| 124 | #define TRANS_CUBE_BUr_INVERSE STATIC_CUBE( \ | ||
| 125 | 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4) | ||
| 126 | #define TRANS_CUBE_BRr STATIC_CUBE( \ | ||
| 127 | 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22) | ||
| 128 | #define TRANS_CUBE_BRr_INVERSE STATIC_CUBE( \ | ||
| 129 | 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0) | ||
| 130 | #define TRANS_CUBE_BDr STATIC_CUBE( \ | ||
| 131 | 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) | ||
| 132 | #define TRANS_CUBE_BDr_INVERSE STATIC_CUBE( \ | ||
| 133 | 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5) | ||
| 134 | #define TRANS_CUBE_BLr STATIC_CUBE( \ | ||
| 135 | 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20) | ||
| 136 | #define TRANS_CUBE_BLr_INVERSE STATIC_CUBE( \ | ||
| 137 | 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1) | ||
| 138 | #define TRANS_CUBE_UFm STATIC_CUBE( \ | ||
| 139 | 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) | ||
| 140 | #define TRANS_CUBE_UFm_INVERSE STATIC_CUBE( \ | ||
| 141 | 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10) | ||
| 142 | #define TRANS_CUBE_ULm STATIC_CUBE( \ | ||
| 143 | 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) | ||
| 144 | #define TRANS_CUBE_ULm_INVERSE STATIC_CUBE( \ | ||
| 145 | 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25) | ||
| 146 | #define TRANS_CUBE_UBm STATIC_CUBE( \ | ||
| 147 | 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) | ||
| 148 | #define TRANS_CUBE_UBm_INVERSE STATIC_CUBE( \ | ||
| 149 | 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8) | ||
| 150 | #define TRANS_CUBE_URm STATIC_CUBE( \ | ||
| 151 | 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) | ||
| 152 | #define TRANS_CUBE_URm_INVERSE STATIC_CUBE( \ | ||
| 153 | 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27) | ||
| 154 | #define TRANS_CUBE_DFm STATIC_CUBE( \ | ||
| 155 | 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) | ||
| 156 | #define TRANS_CUBE_DFm_INVERSE STATIC_CUBE( \ | ||
| 157 | 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11) | ||
| 158 | #define TRANS_CUBE_DLm STATIC_CUBE( \ | ||
| 159 | 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) | ||
| 160 | #define TRANS_CUBE_DLm_INVERSE STATIC_CUBE( \ | ||
| 161 | 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) | ||
| 162 | #define TRANS_CUBE_DBm STATIC_CUBE( \ | ||
| 163 | 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) | ||
| 164 | #define TRANS_CUBE_DBm_INVERSE STATIC_CUBE( \ | ||
| 165 | 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9) | ||
| 166 | #define TRANS_CUBE_DRm STATIC_CUBE( \ | ||
| 167 | 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24) | ||
| 168 | #define TRANS_CUBE_DRm_INVERSE STATIC_CUBE( \ | ||
| 169 | 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26) | ||
| 170 | #define TRANS_CUBE_RUm STATIC_CUBE( \ | ||
| 171 | 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) | ||
| 172 | #define TRANS_CUBE_RUm_INVERSE STATIC_CUBE( \ | ||
| 173 | 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) | ||
| 174 | #define TRANS_CUBE_RFm STATIC_CUBE( \ | ||
| 175 | 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) | ||
| 176 | #define TRANS_CUBE_RFm_INVERSE STATIC_CUBE( \ | ||
| 177 | 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18) | ||
| 178 | #define TRANS_CUBE_RDm STATIC_CUBE( \ | ||
| 179 | 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) | ||
| 180 | #define TRANS_CUBE_RDm_INVERSE STATIC_CUBE( \ | ||
| 181 | 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) | ||
| 182 | #define TRANS_CUBE_RBm STATIC_CUBE( \ | ||
| 183 | 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) | ||
| 184 | #define TRANS_CUBE_RBm_INVERSE STATIC_CUBE( \ | ||
| 185 | 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) | ||
| 186 | #define TRANS_CUBE_LUm STATIC_CUBE( \ | ||
| 187 | 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) | ||
| 188 | #define TRANS_CUBE_LUm_INVERSE STATIC_CUBE( \ | ||
| 189 | 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) | ||
| 190 | #define TRANS_CUBE_LFm STATIC_CUBE( \ | ||
| 191 | 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) | ||
| 192 | #define TRANS_CUBE_LFm_INVERSE STATIC_CUBE( \ | ||
| 193 | 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17) | ||
| 194 | #define TRANS_CUBE_LDm STATIC_CUBE( \ | ||
| 195 | 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) | ||
| 196 | #define TRANS_CUBE_LDm_INVERSE STATIC_CUBE( \ | ||
| 197 | 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) | ||
| 198 | #define TRANS_CUBE_LBm STATIC_CUBE( \ | ||
| 199 | 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19) | ||
| 200 | #define TRANS_CUBE_LBm_INVERSE STATIC_CUBE( \ | ||
| 201 | 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16) | ||
| 202 | #define TRANS_CUBE_FUm STATIC_CUBE( \ | ||
| 203 | 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) | ||
| 204 | #define TRANS_CUBE_FUm_INVERSE STATIC_CUBE( \ | ||
| 205 | 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7) | ||
| 206 | #define TRANS_CUBE_FRm STATIC_CUBE( \ | ||
| 207 | 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20) | ||
| 208 | #define TRANS_CUBE_FRm_INVERSE STATIC_CUBE( \ | ||
| 209 | 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2) | ||
| 210 | #define TRANS_CUBE_FDm STATIC_CUBE( \ | ||
| 211 | 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) | ||
| 212 | #define TRANS_CUBE_FDm_INVERSE STATIC_CUBE( \ | ||
| 213 | 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) | ||
| 214 | #define TRANS_CUBE_FLm STATIC_CUBE( \ | ||
| 215 | 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22) | ||
| 216 | #define TRANS_CUBE_FLm_INVERSE STATIC_CUBE( \ | ||
| 217 | 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3) | ||
| 218 | #define TRANS_CUBE_BUm STATIC_CUBE( \ | ||
| 219 | 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6) | ||
| 220 | #define TRANS_CUBE_BUm_INVERSE STATIC_CUBE( \ | ||
| 221 | 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5) | ||
| 222 | #define TRANS_CUBE_BRm STATIC_CUBE( \ | ||
| 223 | 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23) | ||
| 224 | #define TRANS_CUBE_BRm_INVERSE STATIC_CUBE( \ | ||
| 225 | 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1) | ||
| 226 | #define TRANS_CUBE_BDm STATIC_CUBE( \ | ||
| 227 | 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) | ||
| 228 | #define TRANS_CUBE_BDm_INVERSE STATIC_CUBE( \ | ||
| 229 | 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4) | ||
| 230 | #define TRANS_CUBE_BLm STATIC_CUBE( \ | ||
| 231 | 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21) | ||
| 232 | #define TRANS_CUBE_BLm_INVERSE STATIC_CUBE( \ | ||
| 233 | 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0) | ||
| 234 | |||
| 235 | #define MOVE_U UINT8_C(0) | ||
| 236 | #define MOVE_U2 UINT8_C(1) | ||
| 237 | #define MOVE_U3 UINT8_C(2) | ||
| 238 | #define MOVE_D UINT8_C(3) | ||
| 239 | #define MOVE_D2 UINT8_C(4) | ||
| 240 | #define MOVE_D3 UINT8_C(5) | ||
| 241 | #define MOVE_R UINT8_C(6) | ||
| 242 | #define MOVE_R2 UINT8_C(7) | ||
| 243 | #define MOVE_R3 UINT8_C(8) | ||
| 244 | #define MOVE_L UINT8_C(9) | ||
| 245 | #define MOVE_L2 UINT8_C(10) | ||
| 246 | #define MOVE_L3 UINT8_C(11) | ||
| 247 | #define MOVE_F UINT8_C(12) | ||
| 248 | #define MOVE_F2 UINT8_C(13) | ||
| 249 | #define MOVE_F3 UINT8_C(14) | ||
| 250 | #define MOVE_B UINT8_C(15) | ||
| 251 | #define MOVE_B2 UINT8_C(16) | ||
| 252 | #define MOVE_B3 UINT8_C(17) | ||
| 253 | |||
| 254 | #define MOVE_Uw UINT8_C(18) | ||
| 255 | #define MOVE_Uw2 UINT8_C(19) | ||
| 256 | #define MOVE_Uw3 UINT8_C(20) | ||
| 257 | #define MOVE_Dw UINT8_C(21) | ||
| 258 | #define MOVE_Dw2 UINT8_C(22) | ||
| 259 | #define MOVE_Dw3 UINT8_C(23) | ||
| 260 | #define MOVE_Rw UINT8_C(24) | ||
| 261 | #define MOVE_Rw2 UINT8_C(25) | ||
| 262 | #define MOVE_Rw3 UINT8_C(26) | ||
| 263 | #define MOVE_Lw UINT8_C(27) | ||
| 264 | #define MOVE_Lw2 UINT8_C(28) | ||
| 265 | #define MOVE_Lw3 UINT8_C(29) | ||
| 266 | #define MOVE_Fw UINT8_C(30) | ||
| 267 | #define MOVE_Fw2 UINT8_C(31) | ||
| 268 | #define MOVE_Fw3 UINT8_C(32) | ||
| 269 | #define MOVE_Bw UINT8_C(33) | ||
| 270 | #define MOVE_Bw2 UINT8_C(34) | ||
| 271 | #define MOVE_Bw3 UINT8_C(35) | ||
| 272 | |||
| 273 | #define MOVE_M UINT8_C(36) | ||
| 274 | #define MOVE_M2 UINT8_C(37) | ||
| 275 | #define MOVE_M3 UINT8_C(38) | ||
| 276 | #define MOVE_S UINT8_C(39) | ||
| 277 | #define MOVE_S2 UINT8_C(40) | ||
| 278 | #define MOVE_S3 UINT8_C(41) | ||
| 279 | #define MOVE_E UINT8_C(42) | ||
| 280 | #define MOVE_E2 UINT8_C(43) | ||
| 281 | #define MOVE_E3 UINT8_C(44) | ||
| 282 | |||
| 283 | #define MOVE_x UINT8_C(45) | ||
| 284 | #define MOVE_x2 UINT8_C(46) | ||
| 285 | #define MOVE_x3 UINT8_C(47) | ||
| 286 | #define MOVE_y UINT8_C(48) | ||
| 287 | #define MOVE_y2 UINT8_C(49) | ||
| 288 | #define MOVE_y3 UINT8_C(50) | ||
| 289 | #define MOVE_z UINT8_C(51) | ||
| 290 | #define MOVE_z2 UINT8_C(52) | ||
| 291 | #define MOVE_z3 UINT8_C(53) | ||
| 292 | |||
| 293 | #define TRANS_UFr UINT8_C(0) | ||
| 294 | #define TRANS_ULr UINT8_C(1) | ||
| 295 | #define TRANS_UBr UINT8_C(2) | ||
| 296 | #define TRANS_URr UINT8_C(3) | ||
| 297 | #define TRANS_DFr UINT8_C(4) | ||
| 298 | #define TRANS_DLr UINT8_C(5) | ||
| 299 | #define TRANS_DBr UINT8_C(6) | ||
| 300 | #define TRANS_DRr UINT8_C(7) | ||
| 301 | #define TRANS_RUr UINT8_C(8) | ||
| 302 | #define TRANS_RFr UINT8_C(9) | ||
| 303 | #define TRANS_RDr UINT8_C(10) | ||
| 304 | #define TRANS_RBr UINT8_C(11) | ||
| 305 | #define TRANS_LUr UINT8_C(12) | ||
| 306 | #define TRANS_LFr UINT8_C(13) | ||
| 307 | #define TRANS_LDr UINT8_C(14) | ||
| 308 | #define TRANS_LBr UINT8_C(15) | ||
| 309 | #define TRANS_FUr UINT8_C(16) | ||
| 310 | #define TRANS_FRr UINT8_C(17) | ||
| 311 | #define TRANS_FDr UINT8_C(18) | ||
| 312 | #define TRANS_FLr UINT8_C(19) | ||
| 313 | #define TRANS_BUr UINT8_C(20) | ||
| 314 | #define TRANS_BRr UINT8_C(21) | ||
| 315 | #define TRANS_BDr UINT8_C(22) | ||
| 316 | #define TRANS_BLr UINT8_C(23) | ||
| 317 | |||
| 318 | #define TRANS_UFm UINT8_C(24) | ||
| 319 | #define TRANS_ULm UINT8_C(25) | ||
| 320 | #define TRANS_UBm UINT8_C(26) | ||
| 321 | #define TRANS_URm UINT8_C(27) | ||
| 322 | #define TRANS_DFm UINT8_C(28) | ||
| 323 | #define TRANS_DLm UINT8_C(29) | ||
| 324 | #define TRANS_DBm UINT8_C(30) | ||
| 325 | #define TRANS_DRm UINT8_C(31) | ||
| 326 | #define TRANS_RUm UINT8_C(32) | ||
| 327 | #define TRANS_RFm UINT8_C(33) | ||
| 328 | #define TRANS_RDm UINT8_C(34) | ||
| 329 | #define TRANS_RBm UINT8_C(35) | ||
| 330 | #define TRANS_LUm UINT8_C(36) | ||
| 331 | #define TRANS_LFm UINT8_C(37) | ||
| 332 | #define TRANS_LDm UINT8_C(38) | ||
| 333 | #define TRANS_LBm UINT8_C(39) | ||
| 334 | #define TRANS_FUm UINT8_C(40) | ||
| 335 | #define TRANS_FRm UINT8_C(41) | ||
| 336 | #define TRANS_FDm UINT8_C(42) | ||
| 337 | #define TRANS_FLm UINT8_C(43) | ||
| 338 | #define TRANS_BUm UINT8_C(44) | ||
| 339 | #define TRANS_BRm UINT8_C(45) | ||
| 340 | #define TRANS_BDm UINT8_C(46) | ||
| 341 | #define TRANS_BLm UINT8_C(47) | ||
| 342 | |||
| 343 | #define AXIS_UD UINT8_C(0) | ||
| 344 | #define AXIS_RL UINT8_C(1) | ||
| 345 | #define AXIS_FB UINT8_C(2) | ||
| 346 | |||
| 347 | #define NMOVES (1+MOVE_B3) | ||
| 348 | #define NMOVES_EXTENDED (1+MOVE_z3) | ||
| 349 | #define NTRANS (1+TRANS_BLm) | ||
| 350 | |||
| 351 | #define MM_ALLMOVES UINT32_C(0x3FFFF) | ||
| 352 | #define MM_NOHALFTURNS UINT32_C(0x2DB6D) | ||
| 353 | #define MM_SINGLE(m) (UINT32_C(1) << (uint32_t)(m)) | ||
| 354 | #define MM_FACE(m) (UINT32_C(7) << (uint32_t)(m)) | ||
| 355 | #define MM_EO (\ | ||
| 356 | MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\ | ||
| 357 | MM_FACE(MOVE_R) | MM_FACE(MOVE_L) |\ | ||
| 358 | MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2)) | ||
| 359 | #define MM_DR (\ | ||
| 360 | MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\ | ||
| 361 | MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\ | ||
| 362 | MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2)) | ||
| 363 | #define MM_HTR (MM_ALLMOVES & ~MM_NOHALFTURNS) | ||
| 364 | |||
| 365 | #define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF) | ||
| 366 | #define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t)) | ||
| 367 | #define TM_UDRLFIX (\ | ||
| 368 | TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \ | ||
| 369 | TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \ | ||
| 370 | TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm)) | ||
| 371 | #define TM_UDFIX (\ | ||
| 372 | TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \ | ||
| 373 | TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \ | ||
| 374 | TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \ | ||
| 375 | TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \ | ||
| 376 | TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \ | ||
| 377 | TM_SINGLE(TRANS_DLm)) | ||
| 378 | |||
| 379 | #define CORNER_UFR UINT8_C(0) | ||
| 380 | #define CORNER_UBL UINT8_C(1) | ||
| 381 | #define CORNER_DFL UINT8_C(2) | ||
| 382 | #define CORNER_DBR UINT8_C(3) | ||
| 383 | #define CORNER_UFL UINT8_C(4) | ||
| 384 | #define CORNER_UBR UINT8_C(5) | ||
| 385 | #define CORNER_DFR UINT8_C(6) | ||
| 386 | #define CORNER_DBL UINT8_C(7) | ||
| 387 | |||
| 388 | #define EDGE_UF UINT8_C(0) | ||
| 389 | #define EDGE_UB UINT8_C(1) | ||
| 390 | #define EDGE_DB UINT8_C(2) | ||
| 391 | #define EDGE_DF UINT8_C(3) | ||
| 392 | #define EDGE_UR UINT8_C(4) | ||
| 393 | #define EDGE_UL UINT8_C(5) | ||
| 394 | #define EDGE_DL UINT8_C(6) | ||
| 395 | #define EDGE_DR UINT8_C(7) | ||
| 396 | #define EDGE_FR UINT8_C(8) | ||
| 397 | #define EDGE_FL UINT8_C(9) | ||
| 398 | #define EDGE_BL UINT8_C(10) | ||
| 399 | #define EDGE_BR UINT8_C(11) | ||
| 400 | |||
| 401 | #define ORIENTATION_UF UINT8_C(0) | ||
| 402 | #define ORIENTATION_UR UINT8_C(1) | ||
| 403 | #define ORIENTATION_UB UINT8_C(2) | ||
| 404 | #define ORIENTATION_UL UINT8_C(3) | ||
| 405 | #define ORIENTATION_DF UINT8_C(4) | ||
| 406 | #define ORIENTATION_DR UINT8_C(5) | ||
| 407 | #define ORIENTATION_DB UINT8_C(6) | ||
| 408 | #define ORIENTATION_DL UINT8_C(7) | ||
| 409 | #define ORIENTATION_RF UINT8_C(8) | ||
| 410 | #define ORIENTATION_RD UINT8_C(9) | ||
| 411 | #define ORIENTATION_RB UINT8_C(10) | ||
| 412 | #define ORIENTATION_RU UINT8_C(11) | ||
| 413 | #define ORIENTATION_LF UINT8_C(12) | ||
| 414 | #define ORIENTATION_LD UINT8_C(13) | ||
| 415 | #define ORIENTATION_LB UINT8_C(14) | ||
| 416 | #define ORIENTATION_LU UINT8_C(15) | ||
| 417 | #define ORIENTATION_FD UINT8_C(16) | ||
| 418 | #define ORIENTATION_FR UINT8_C(17) | ||
| 419 | #define ORIENTATION_FU UINT8_C(18) | ||
| 420 | #define ORIENTATION_FL UINT8_C(19) | ||
| 421 | #define ORIENTATION_BD UINT8_C(20) | ||
| 422 | #define ORIENTATION_BR UINT8_C(21) | ||
| 423 | #define ORIENTATION_BU UINT8_C(22) | ||
| 424 | #define ORIENTATION_BL UINT8_C(23) | ||
| 425 | |||
| 426 | STATIC const uint32_t allowedmask[] = { | ||
| 427 | UINT32_C(0x3FFF8), | ||
| 428 | UINT32_C(0x3FFC0), | ||
| 429 | UINT32_C(0x3FE3F), | ||
| 430 | UINT32_C(0x3F03F), | ||
| 431 | UINT32_C(0x38FFF), | ||
| 432 | UINT32_C(0x00FFF) | ||
| 433 | }; | ||
| 434 | |||
| 435 | STATIC const char *cornerstr[] = { | ||
| 436 | [CORNER_UFR] = "UFR", | ||
| 437 | [CORNER_UBL] = "UBL", | ||
| 438 | [CORNER_DFL] = "DFL", | ||
| 439 | [CORNER_DBR] = "DBR", | ||
| 440 | [CORNER_UFL] = "UFL", | ||
| 441 | [CORNER_UBR] = "UBR", | ||
| 442 | [CORNER_DFR] = "DFR", | ||
| 443 | [CORNER_DBL] = "DBL" | ||
| 444 | }; | ||
| 445 | |||
| 446 | STATIC const char *cornerstralt[] = { | ||
| 447 | [CORNER_UFR] = "URF", | ||
| 448 | [CORNER_UBL] = "ULB", | ||
| 449 | [CORNER_DFL] = "DLF", | ||
| 450 | [CORNER_DBR] = "DRB", | ||
| 451 | [CORNER_UFL] = "ULF", | ||
| 452 | [CORNER_UBR] = "URB", | ||
| 453 | [CORNER_DFR] = "DRF", | ||
| 454 | [CORNER_DBL] = "DLB" | ||
| 455 | }; | ||
| 456 | |||
| 457 | STATIC const char *edgestr[] = { | ||
| 458 | [EDGE_UF] = "UF", | ||
| 459 | [EDGE_UB] = "UB", | ||
| 460 | [EDGE_DB] = "DB", | ||
| 461 | [EDGE_DF] = "DF", | ||
| 462 | [EDGE_UR] = "UR", | ||
| 463 | [EDGE_UL] = "UL", | ||
| 464 | [EDGE_DL] = "DL", | ||
| 465 | [EDGE_DR] = "DR", | ||
| 466 | [EDGE_FR] = "FR", | ||
| 467 | [EDGE_FL] = "FL", | ||
| 468 | [EDGE_BL] = "BL", | ||
| 469 | [EDGE_BR] = "BR" | ||
| 470 | }; | ||
| 471 | |||
| 472 | STATIC const char *movestr[] = { | ||
| 473 | [MOVE_U] = "U", | ||
| 474 | [MOVE_U2] = "U2", | ||
| 475 | [MOVE_U3] = "U'", | ||
| 476 | [MOVE_D] = "D", | ||
| 477 | [MOVE_D2] = "D2", | ||
| 478 | [MOVE_D3] = "D'", | ||
| 479 | [MOVE_R] = "R", | ||
| 480 | [MOVE_R2] = "R2", | ||
| 481 | [MOVE_R3] = "R'", | ||
| 482 | [MOVE_L] = "L", | ||
| 483 | [MOVE_L2] = "L2", | ||
| 484 | [MOVE_L3] = "L'", | ||
| 485 | [MOVE_F] = "F", | ||
| 486 | [MOVE_F2] = "F2", | ||
| 487 | [MOVE_F3] = "F'", | ||
| 488 | [MOVE_B] = "B", | ||
| 489 | [MOVE_B2] = "B2", | ||
| 490 | [MOVE_B3] = "B'", | ||
| 491 | |||
| 492 | [MOVE_Uw] = "Uw", | ||
| 493 | [MOVE_Uw2] = "Uw2", | ||
| 494 | [MOVE_Uw3] = "Uw'", | ||
| 495 | [MOVE_Dw] = "Dw", | ||
| 496 | [MOVE_Dw2] = "Dw2", | ||
| 497 | [MOVE_Dw3] = "Dw'", | ||
| 498 | [MOVE_Rw] = "Rw", | ||
| 499 | [MOVE_Rw2] = "Rw2", | ||
| 500 | [MOVE_Rw3] = "Rw'", | ||
| 501 | [MOVE_Lw] = "Lw", | ||
| 502 | [MOVE_Lw2] = "Lw2", | ||
| 503 | [MOVE_Lw3] = "Lw'", | ||
| 504 | [MOVE_Fw] = "Fw", | ||
| 505 | [MOVE_Fw2] = "Fw2", | ||
| 506 | [MOVE_Fw3] = "Fw'", | ||
| 507 | [MOVE_Bw] = "Bw", | ||
| 508 | [MOVE_Bw2] = "Bw2", | ||
| 509 | [MOVE_Bw3] = "Bw'", | ||
| 510 | |||
| 511 | [MOVE_M] = "M", | ||
| 512 | [MOVE_M2] = "M2", | ||
| 513 | [MOVE_M3] = "M'", | ||
| 514 | [MOVE_S] = "S", | ||
| 515 | [MOVE_S2] = "S2", | ||
| 516 | [MOVE_S3] = "S'", | ||
| 517 | [MOVE_E] = "E", | ||
| 518 | [MOVE_E2] = "E2", | ||
| 519 | [MOVE_E3] = "E'", | ||
| 520 | |||
| 521 | [MOVE_x] = "x", | ||
| 522 | [MOVE_x2] = "x2", | ||
| 523 | [MOVE_x3] = "x'", | ||
| 524 | [MOVE_y] = "y", | ||
| 525 | [MOVE_y2] = "y2", | ||
| 526 | [MOVE_y3] = "y'", | ||
| 527 | [MOVE_z] = "z", | ||
| 528 | [MOVE_z2] = "z2", | ||
| 529 | [MOVE_z3] = "z'", | ||
| 530 | }; | ||
| 531 | |||
| 532 | STATIC const char *transstr[] = { | ||
| 533 | [TRANS_UFr] = "rotation UF", | ||
| 534 | [TRANS_UFm] = "mirrored UF", | ||
| 535 | [TRANS_ULr] = "rotation UL", | ||
| 536 | [TRANS_ULm] = "mirrored UL", | ||
| 537 | [TRANS_UBr] = "rotation UB", | ||
| 538 | [TRANS_UBm] = "mirrored UB", | ||
| 539 | [TRANS_URr] = "rotation UR", | ||
| 540 | [TRANS_URm] = "mirrored UR", | ||
| 541 | [TRANS_DFr] = "rotation DF", | ||
| 542 | [TRANS_DFm] = "mirrored DF", | ||
| 543 | [TRANS_DLr] = "rotation DL", | ||
| 544 | [TRANS_DLm] = "mirrored DL", | ||
| 545 | [TRANS_DBr] = "rotation DB", | ||
| 546 | [TRANS_DBm] = "mirrored DB", | ||
| 547 | [TRANS_DRr] = "rotation DR", | ||
| 548 | [TRANS_DRm] = "mirrored DR", | ||
| 549 | [TRANS_RUr] = "rotation RU", | ||
| 550 | [TRANS_RUm] = "mirrored RU", | ||
| 551 | [TRANS_RFr] = "rotation RF", | ||
| 552 | [TRANS_RFm] = "mirrored RF", | ||
| 553 | [TRANS_RDr] = "rotation RD", | ||
| 554 | [TRANS_RDm] = "mirrored RD", | ||
| 555 | [TRANS_RBr] = "rotation RB", | ||
| 556 | [TRANS_RBm] = "mirrored RB", | ||
| 557 | [TRANS_LUr] = "rotation LU", | ||
| 558 | [TRANS_LUm] = "mirrored LU", | ||
| 559 | [TRANS_LFr] = "rotation LF", | ||
| 560 | [TRANS_LFm] = "mirrored LF", | ||
| 561 | [TRANS_LDr] = "rotation LD", | ||
| 562 | [TRANS_LDm] = "mirrored LD", | ||
| 563 | [TRANS_LBr] = "rotation LB", | ||
| 564 | [TRANS_LBm] = "mirrored LB", | ||
| 565 | [TRANS_FUr] = "rotation FU", | ||
| 566 | [TRANS_FUm] = "mirrored FU", | ||
| 567 | [TRANS_FRr] = "rotation FR", | ||
| 568 | [TRANS_FRm] = "mirrored FR", | ||
| 569 | [TRANS_FDr] = "rotation FD", | ||
| 570 | [TRANS_FDm] = "mirrored FD", | ||
| 571 | [TRANS_FLr] = "rotation FL", | ||
| 572 | [TRANS_FLm] = "mirrored FL", | ||
| 573 | [TRANS_BUr] = "rotation BU", | ||
| 574 | [TRANS_BUm] = "mirrored BU", | ||
| 575 | [TRANS_BRr] = "rotation BR", | ||
| 576 | [TRANS_BRm] = "mirrored BR", | ||
| 577 | [TRANS_BDr] = "rotation BD", | ||
| 578 | [TRANS_BDm] = "mirrored BD", | ||
| 579 | [TRANS_BLr] = "rotation BL", | ||
| 580 | [TRANS_BLm] = "mirrored BL", | ||
| 581 | }; | ||
| 582 | |||
| 583 | static uint8_t inverse_trans_table[] = { | ||
| 584 | [TRANS_UFr] = TRANS_UFr, | ||
| 585 | [TRANS_UFm] = TRANS_UFm, | ||
| 586 | [TRANS_ULr] = TRANS_URr, | ||
| 587 | [TRANS_ULm] = TRANS_ULm, | ||
| 588 | [TRANS_UBr] = TRANS_UBr, | ||
| 589 | [TRANS_UBm] = TRANS_UBm, | ||
| 590 | [TRANS_URr] = TRANS_ULr, | ||
| 591 | [TRANS_URm] = TRANS_URm, | ||
| 592 | [TRANS_DFr] = TRANS_DFr, | ||
| 593 | [TRANS_DFm] = TRANS_DFm, | ||
| 594 | [TRANS_DLr] = TRANS_DLr, | ||
| 595 | [TRANS_DLm] = TRANS_DRm, | ||
| 596 | [TRANS_DBr] = TRANS_DBr, | ||
| 597 | [TRANS_DBm] = TRANS_DBm, | ||
| 598 | [TRANS_DRr] = TRANS_DRr, | ||
| 599 | [TRANS_DRm] = TRANS_DLm, | ||
| 600 | [TRANS_RUr] = TRANS_FRr, | ||
| 601 | [TRANS_RUm] = TRANS_FLm, | ||
| 602 | [TRANS_RFr] = TRANS_LFr, | ||
| 603 | [TRANS_RFm] = TRANS_RFm, | ||
| 604 | [TRANS_RDr] = TRANS_BLr, | ||
| 605 | [TRANS_RDm] = TRANS_BRm, | ||
| 606 | [TRANS_RBr] = TRANS_RBr, | ||
| 607 | [TRANS_RBm] = TRANS_LBm, | ||
| 608 | [TRANS_LUr] = TRANS_FLr, | ||
| 609 | [TRANS_LUm] = TRANS_FRm, | ||
| 610 | [TRANS_LFr] = TRANS_RFr, | ||
| 611 | [TRANS_LFm] = TRANS_LFm, | ||
| 612 | [TRANS_LDr] = TRANS_BRr, | ||
| 613 | [TRANS_LDm] = TRANS_BLm, | ||
| 614 | [TRANS_LBr] = TRANS_LBr, | ||
| 615 | [TRANS_LBm] = TRANS_RBm, | ||
| 616 | [TRANS_FUr] = TRANS_FUr, | ||
| 617 | [TRANS_FUm] = TRANS_FUm, | ||
| 618 | [TRANS_FRr] = TRANS_RUr, | ||
| 619 | [TRANS_FRm] = TRANS_LUm, | ||
| 620 | [TRANS_FDr] = TRANS_BUr, | ||
| 621 | [TRANS_FDm] = TRANS_BUm, | ||
| 622 | [TRANS_FLr] = TRANS_LUr, | ||
| 623 | [TRANS_FLm] = TRANS_RUm, | ||
| 624 | [TRANS_BUr] = TRANS_FDr, | ||
| 625 | [TRANS_BUm] = TRANS_FDm, | ||
| 626 | [TRANS_BRr] = TRANS_LDr, | ||
| 627 | [TRANS_BRm] = TRANS_RDm, | ||
| 628 | [TRANS_BDr] = TRANS_BDr, | ||
| 629 | [TRANS_BDm] = TRANS_BDm, | ||
| 630 | [TRANS_BLr] = TRANS_RDr, | ||
| 631 | [TRANS_BLm] = TRANS_LDm, | ||
| 632 | }; | ||
| 633 | |||
| 634 | static uint8_t trans_move_table[][3] = { | ||
| 635 | [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F }, | ||
| 636 | [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F }, | ||
| 637 | [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L }, | ||
| 638 | [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R }, | ||
| 639 | [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B }, | ||
| 640 | [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B }, | ||
| 641 | [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R }, | ||
| 642 | [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L }, | ||
| 643 | [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F }, | ||
| 644 | [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F }, | ||
| 645 | [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L }, | ||
| 646 | [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R }, | ||
| 647 | [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B }, | ||
| 648 | [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B }, | ||
| 649 | [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R }, | ||
| 650 | [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L }, | ||
| 651 | [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U }, | ||
| 652 | [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U }, | ||
| 653 | [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F }, | ||
| 654 | [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F }, | ||
| 655 | [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D }, | ||
| 656 | [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D }, | ||
| 657 | [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B }, | ||
| 658 | [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B }, | ||
| 659 | [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U }, | ||
| 660 | [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U }, | ||
| 661 | [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F }, | ||
| 662 | [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F }, | ||
| 663 | [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D }, | ||
| 664 | [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D }, | ||
| 665 | [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B }, | ||
| 666 | [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B }, | ||
| 667 | [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U }, | ||
| 668 | [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U }, | ||
| 669 | [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R }, | ||
| 670 | [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L }, | ||
| 671 | [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D }, | ||
| 672 | [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D }, | ||
| 673 | [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L }, | ||
| 674 | [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R }, | ||
| 675 | [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U }, | ||
| 676 | [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U }, | ||
| 677 | [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R }, | ||
| 678 | [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L }, | ||
| 679 | [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D }, | ||
| 680 | [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D }, | ||
| 681 | [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L }, | ||
| 682 | [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R }, | ||
| 683 | }; | ||
| 684 | |||
| 685 | static uint8_t orientation_transition_table[][3] = { | ||
| 686 | [ORIENTATION_UF] = { ORIENTATION_FD, ORIENTATION_UR, ORIENTATION_LF }, | ||
| 687 | [ORIENTATION_UR] = { ORIENTATION_RD, ORIENTATION_UB, ORIENTATION_FR }, | ||
| 688 | [ORIENTATION_UB] = { ORIENTATION_BD, ORIENTATION_UL, ORIENTATION_RB }, | ||
| 689 | [ORIENTATION_UL] = { ORIENTATION_LD, ORIENTATION_UF, ORIENTATION_BL }, | ||
| 690 | [ORIENTATION_DF] = { ORIENTATION_FU, ORIENTATION_DL, ORIENTATION_RF }, | ||
| 691 | [ORIENTATION_DR] = { ORIENTATION_RU, ORIENTATION_DF, ORIENTATION_BR }, | ||
| 692 | [ORIENTATION_DB] = { ORIENTATION_BU, ORIENTATION_DR, ORIENTATION_LB }, | ||
| 693 | [ORIENTATION_DL] = { ORIENTATION_LU, ORIENTATION_DB, ORIENTATION_FL }, | ||
| 694 | [ORIENTATION_RF] = { ORIENTATION_FL, ORIENTATION_RD, ORIENTATION_UF }, | ||
| 695 | [ORIENTATION_RD] = { ORIENTATION_DL, ORIENTATION_RB, ORIENTATION_FD }, | ||
| 696 | [ORIENTATION_RB] = { ORIENTATION_BL, ORIENTATION_RU, ORIENTATION_DB }, | ||
| 697 | [ORIENTATION_RU] = { ORIENTATION_UL, ORIENTATION_RF, ORIENTATION_BU }, | ||
| 698 | [ORIENTATION_LF] = { ORIENTATION_FR, ORIENTATION_LU, ORIENTATION_DF }, | ||
| 699 | [ORIENTATION_LD] = { ORIENTATION_DR, ORIENTATION_LB, ORIENTATION_BD }, | ||
| 700 | [ORIENTATION_LB] = { ORIENTATION_BR, ORIENTATION_LD, ORIENTATION_UB }, | ||
| 701 | [ORIENTATION_LU] = { ORIENTATION_UR, ORIENTATION_LF, ORIENTATION_FU }, | ||
| 702 | [ORIENTATION_FD] = { ORIENTATION_DB, ORIENTATION_FR, ORIENTATION_LD }, | ||
| 703 | [ORIENTATION_FR] = { ORIENTATION_RB, ORIENTATION_FU, ORIENTATION_DR }, | ||
| 704 | [ORIENTATION_FU] = { ORIENTATION_UB, ORIENTATION_FL, ORIENTATION_RU }, | ||
| 705 | [ORIENTATION_FL] = { ORIENTATION_LB, ORIENTATION_FD, ORIENTATION_UL }, | ||
| 706 | [ORIENTATION_BD] = { ORIENTATION_DF, ORIENTATION_BL, ORIENTATION_RD }, | ||
| 707 | [ORIENTATION_BR] = { ORIENTATION_RF, ORIENTATION_BU, ORIENTATION_UR }, | ||
| 708 | [ORIENTATION_BU] = { ORIENTATION_UF, ORIENTATION_BR, ORIENTATION_LU }, | ||
| 709 | [ORIENTATION_BL] = { ORIENTATION_LF, ORIENTATION_BD, ORIENTATION_DL }, | ||
| 710 | }; | ||
| 711 | |||
| 712 | static struct { | ||
| 713 | uint8_t moves[3]; | ||
| 714 | uint8_t rotations[6]; | ||
| 715 | } equivalent_move_table[] = { | ||
| 716 | [MOVE_U] = { { MOVE_U, UINT8_MAX }, {UINT8_MAX} }, | ||
| 717 | [MOVE_U2] = { { MOVE_U2, UINT8_MAX }, {UINT8_MAX} }, | ||
| 718 | [MOVE_U3] = { { MOVE_U3, UINT8_MAX }, {UINT8_MAX} }, | ||
| 719 | [MOVE_D] = { { MOVE_D, UINT8_MAX }, {UINT8_MAX} }, | ||
| 720 | [MOVE_D2] = { { MOVE_D2, UINT8_MAX }, {UINT8_MAX} }, | ||
| 721 | [MOVE_D3] = { { MOVE_D3, UINT8_MAX }, {UINT8_MAX} }, | ||
| 722 | [MOVE_R] = { { MOVE_R, UINT8_MAX }, {UINT8_MAX} }, | ||
| 723 | [MOVE_R2] = { { MOVE_R2, UINT8_MAX }, {UINT8_MAX} }, | ||
| 724 | [MOVE_R3] = { { MOVE_R3, UINT8_MAX }, {UINT8_MAX} }, | ||
| 725 | [MOVE_L] = { { MOVE_L, UINT8_MAX }, {UINT8_MAX} }, | ||
| 726 | [MOVE_L2] = { { MOVE_L2, UINT8_MAX }, {UINT8_MAX} }, | ||
| 727 | [MOVE_L3] = { { MOVE_L3, UINT8_MAX }, {UINT8_MAX} }, | ||
| 728 | [MOVE_F] = { { MOVE_F, UINT8_MAX }, {UINT8_MAX} }, | ||
| 729 | [MOVE_F2] = { { MOVE_F2, UINT8_MAX }, {UINT8_MAX} }, | ||
| 730 | [MOVE_F3] = { { MOVE_F3, UINT8_MAX }, {UINT8_MAX} }, | ||
| 731 | [MOVE_B] = { { MOVE_B, UINT8_MAX }, {UINT8_MAX} }, | ||
| 732 | [MOVE_B2] = { { MOVE_B2, UINT8_MAX }, {UINT8_MAX} }, | ||
| 733 | [MOVE_B3] = { { MOVE_B3, UINT8_MAX }, {UINT8_MAX} }, | ||
| 734 | }; | ||
diff --git a/src/core/core.h b/src/core/core.h index fce1751..b56106e 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | #include "constant_cubes.h" | 1 | #include "core_types.h" |
| 2 | #include "constants.h" | ||
| 2 | #include "cube.h" | 3 | #include "cube.h" |
| 3 | #include "moves.h" | 4 | #include "moves.h" |
| 4 | #include "transform.h" | 5 | #include "transform.h" |
diff --git a/src/core/core_types.h b/src/core/core_types.h new file mode 100644 index 0000000..2ad8938 --- /dev/null +++ b/src/core/core_types.h | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | typedef struct { | ||
| 2 | cube_t cube; | ||
| 3 | uint8_t orientation; | ||
| 4 | } oriented_cube_t; | ||
diff --git a/src/core/cube.h b/src/core/cube.h index a045e55..91bb284 100644 --- a/src/core/cube.h +++ b/src/core/cube.h | |||
| @@ -1,17 +1,29 @@ | |||
| 1 | STATIC cube_t solvedcube(void); | 1 | STATIC oriented_cube_t solvedcube(void); |
| 2 | STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]); | 2 | STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]); |
| 3 | STATIC bool isconsistent(cube_t); | 3 | STATIC bool isconsistent(oriented_cube_t); |
| 4 | STATIC bool issolvable(cube_t); | 4 | STATIC bool issolvable(oriented_cube_t); |
| 5 | STATIC bool issolved(cube_t); | 5 | STATIC bool issolved(oriented_cube_t); |
| 6 | STATIC bool iserror(cube_t); | 6 | STATIC bool iserror(oriented_cube_t); |
| 7 | STATIC void getcube_fix(long long *, long long *, long long *, long long *); | 7 | STATIC void getcube_fix(long long *, long long *, long long *, long long *); |
| 8 | STATIC cube_t getcube(int64_t, int64_t, int64_t, int64_t); | 8 | STATIC cube_t getcube(int64_t, int64_t, int64_t, int64_t); |
| 9 | 9 | ||
| 10 | /* This is used only in tests, use SOLVED_CUBE directly everywhere else */ | 10 | STATIC oriented_cube_t readcube(const char *); |
| 11 | STATIC cube_t | 11 | STATIC int64_t writecube(oriented_cube_t, size_t n, char [n]); |
| 12 | STATIC uint8_t readco(const char *); | ||
| 13 | STATIC uint8_t readcp(const char *); | ||
| 14 | STATIC uint8_t readeo(const char *); | ||
| 15 | STATIC uint8_t readep(const char *); | ||
| 16 | |||
| 17 | STATIC uint8_t b32toedge(char); | ||
| 18 | STATIC uint8_t b32tocorner(char); | ||
| 19 | STATIC char edgetob32(uint8_t); | ||
| 20 | STATIC char cornertob32(uint8_t); | ||
| 21 | |||
| 22 | /* This is used only in tests, use SOLVED_ORIENTED_CUBE everywhere else */ | ||
| 23 | STATIC oriented_cube_t | ||
| 12 | solvedcube(void) | 24 | solvedcube(void) |
| 13 | { | 25 | { |
| 14 | return SOLVED_CUBE; | 26 | return SOLVED_ORIENTED_CUBE; |
| 15 | } | 27 | } |
| 16 | 28 | ||
| 17 | STATIC cube_t | 29 | STATIC cube_t |
| @@ -24,12 +36,12 @@ cubefromarray(uint8_t c[static 8], uint8_t e[static 12]) | |||
| 24 | } | 36 | } |
| 25 | 37 | ||
| 26 | STATIC bool | 38 | STATIC bool |
| 27 | isconsistent(cube_t cube) | 39 | isconsistent(oriented_cube_t cube) |
| 28 | { | 40 | { |
| 29 | uint8_t i, p, e, piece, corner[8], edge[12]; | 41 | uint8_t i, p, e, piece, corner[8], edge[12]; |
| 30 | bool found[12]; | 42 | bool found[12]; |
| 31 | 43 | ||
| 32 | pieces(&cube, corner, edge); | 44 | pieces(&cube.cube, corner, edge); |
| 33 | 45 | ||
| 34 | for (i = 0; i < 12; i++) | 46 | for (i = 0; i < 12; i++) |
| 35 | found[i] = false; | 47 | found[i] = false; |
| @@ -63,25 +75,29 @@ isconsistent(cube_t cube) | |||
| 63 | if (!found[i]) | 75 | if (!found[i]) |
| 64 | goto inconsistent_cp; | 76 | goto inconsistent_cp; |
| 65 | 77 | ||
| 78 | if (cube.orientation >= 24) | ||
| 79 | goto inconsistent_orientation; | ||
| 80 | |||
| 66 | return true; | 81 | return true; |
| 67 | 82 | ||
| 68 | inconsistent_ep: | 83 | inconsistent_ep: |
| 69 | inconsistent_cp: | 84 | inconsistent_cp: |
| 70 | inconsistent_eo: | 85 | inconsistent_eo: |
| 71 | inconsistent_co: | 86 | inconsistent_co: |
| 72 | /* We used to do more logging here, hence the 4 different labels */ | 87 | inconsistent_orientation: |
| 88 | /* We used to do more logging here, hence the different labels */ | ||
| 73 | return false; | 89 | return false; |
| 74 | } | 90 | } |
| 75 | 91 | ||
| 76 | STATIC bool | 92 | STATIC bool |
| 77 | issolvable(cube_t cube) | 93 | issolvable(oriented_cube_t cube) |
| 78 | { | 94 | { |
| 79 | uint8_t i, eo, co, piece, edge[12], corner[8], ep[12], cp[8]; | 95 | uint8_t i, eo, co, piece, edge[12], corner[8], ep[12], cp[8]; |
| 80 | 96 | ||
| 81 | DBG_ASSERT(isconsistent(cube), false, | 97 | DBG_ASSERT(isconsistent(cube), false, |
| 82 | "issolvable: cube is inconsistent\n"); | 98 | "issolvable: cube is inconsistent\n"); |
| 83 | 99 | ||
| 84 | pieces(&cube, corner, edge); | 100 | pieces(&cube.cube, corner, edge); |
| 85 | for (i = 0; i < 12; i++) | 101 | for (i = 0; i < 12; i++) |
| 86 | ep[i] = edge[i] & PBITS; | 102 | ep[i] = edge[i] & PBITS; |
| 87 | for (i = 0; i < 8; i++) | 103 | for (i = 0; i < 8; i++) |
| @@ -120,15 +136,15 @@ issolvable_co: | |||
| 120 | } | 136 | } |
| 121 | 137 | ||
| 122 | bool | 138 | bool |
| 123 | issolved(cube_t cube) | 139 | issolved(oriented_cube_t cube) |
| 124 | { | 140 | { |
| 125 | return equal(cube, SOLVED_CUBE); | 141 | return equal(cube.cube, SOLVED_CUBE); |
| 126 | } | 142 | } |
| 127 | 143 | ||
| 128 | bool | 144 | bool |
| 129 | iserror(cube_t cube) | 145 | iserror(oriented_cube_t cube) |
| 130 | { | 146 | { |
| 131 | return equal(cube, ZERO_CUBE); | 147 | return equal(cube.cube, ZERO_CUBE); |
| 132 | } | 148 | } |
| 133 | 149 | ||
| 134 | STATIC void | 150 | STATIC void |
| @@ -175,21 +191,6 @@ getcube(int64_t ep, int64_t eo, int64_t cp, int64_t co) | |||
| 175 | return cubefromarray(carr, earr); | 191 | return cubefromarray(carr, earr); |
| 176 | } | 192 | } |
| 177 | 193 | ||
| 178 | |||
| 179 | /******************************************************************************/ | ||
| 180 | |||
| 181 | STATIC cube_t readcube(const char *); | ||
| 182 | STATIC int64_t writecube(cube_t, size_t n, char [n]); | ||
| 183 | STATIC uint8_t readco(const char *); | ||
| 184 | STATIC uint8_t readcp(const char *); | ||
| 185 | STATIC uint8_t readeo(const char *); | ||
| 186 | STATIC uint8_t readep(const char *); | ||
| 187 | |||
| 188 | STATIC uint8_t b32toedge(char); | ||
| 189 | STATIC uint8_t b32tocorner(char); | ||
| 190 | STATIC char edgetob32(uint8_t); | ||
| 191 | STATIC char cornertob32(uint8_t); | ||
| 192 | |||
| 193 | STATIC uint8_t | 194 | STATIC uint8_t |
| 194 | readco(const char *str) | 195 | readco(const char *str) |
| 195 | { | 196 | { |
| @@ -243,11 +244,11 @@ readep(const char *str) | |||
| 243 | return UINT8_ERROR; | 244 | return UINT8_ERROR; |
| 244 | } | 245 | } |
| 245 | 246 | ||
| 246 | STATIC cube_t | 247 | STATIC oriented_cube_t |
| 247 | readcube(const char *buf) | 248 | readcube(const char *buf) |
| 248 | { | 249 | { |
| 249 | int i; | 250 | int i; |
| 250 | uint8_t c[8], e[12]; | 251 | uint8_t c[8], e[12], orientation; |
| 251 | 252 | ||
| 252 | for (i = 0; i < 8; i++) { | 253 | for (i = 0; i < 8; i++) { |
| 253 | c[i] = b32tocorner(buf[i]); | 254 | c[i] = b32tocorner(buf[i]); |
| @@ -258,14 +259,14 @@ readcube(const char *buf) | |||
| 258 | } else { | 259 | } else { |
| 259 | LOG("(char '%c')\n", buf[i]); | 260 | LOG("(char '%c')\n", buf[i]); |
| 260 | } | 261 | } |
| 261 | return ZERO_CUBE; | 262 | return ZERO_ORIENTED_CUBE; |
| 262 | } | 263 | } |
| 263 | } | 264 | } |
| 264 | 265 | ||
| 265 | if (buf[8] != '=') { | 266 | if (buf[8] != '=') { |
| 266 | LOG("Error reading separator: a single '=' " | 267 | LOG("Error reading separator: a single '=' " |
| 267 | "must be used to separate edges and corners\n"); | 268 | "must be used to separate edges and corners\n"); |
| 268 | return ZERO_CUBE; | 269 | return ZERO_ORIENTED_CUBE; |
| 269 | } | 270 | } |
| 270 | 271 | ||
| 271 | for (i = 0; i < 12; i++) { | 272 | for (i = 0; i < 12; i++) { |
| @@ -277,15 +278,25 @@ readcube(const char *buf) | |||
| 277 | } else { | 278 | } else { |
| 278 | LOG("(char '%c')\n", buf[i+9]); | 279 | LOG("(char '%c')\n", buf[i+9]); |
| 279 | } | 280 | } |
| 280 | return ZERO_CUBE; | 281 | return ZERO_ORIENTED_CUBE; |
| 281 | } | 282 | } |
| 282 | } | 283 | } |
| 283 | 284 | ||
| 284 | return cubefromarray(c, e); | 285 | orientation = (uint8_t)(buf[22] - 'A'); |
| 286 | if (orientation >= 24) { | ||
| 287 | LOG("Error reading orientation: impossible value %" PRIu8 | ||
| 288 | " (%c)\n", orientation, buf[22]); | ||
| 289 | return ZERO_ORIENTED_CUBE; | ||
| 290 | } | ||
| 291 | |||
| 292 | return (oriented_cube_t) { | ||
| 293 | .cube = cubefromarray(c, e), | ||
| 294 | .orientation = orientation | ||
| 295 | }; | ||
| 285 | } | 296 | } |
| 286 | 297 | ||
| 287 | STATIC int64_t | 298 | STATIC int64_t |
| 288 | writecube(cube_t cube, size_t buf_size, char buf[buf_size]) | 299 | writecube(oriented_cube_t cube, size_t buf_size, char buf[buf_size]) |
| 289 | { | 300 | { |
| 290 | int i; | 301 | int i; |
| 291 | uint8_t corner[8], edge[12]; | 302 | uint8_t corner[8], edge[12]; |
| @@ -297,7 +308,7 @@ writecube(cube_t cube, size_t buf_size, char buf[buf_size]) | |||
| 297 | return NISSY_ERROR_BUFFER_SIZE; | 308 | return NISSY_ERROR_BUFFER_SIZE; |
| 298 | } | 309 | } |
| 299 | 310 | ||
| 300 | pieces(&cube, corner, edge); | 311 | pieces(&cube.cube, corner, edge); |
| 301 | 312 | ||
| 302 | for (i = 0; i < 8; i++) | 313 | for (i = 0; i < 8; i++) |
| 303 | buf[i] = cornertob32(corner[i]); | 314 | buf[i] = cornertob32(corner[i]); |
| @@ -307,9 +318,8 @@ writecube(cube_t cube, size_t buf_size, char buf[buf_size]) | |||
| 307 | for (i = 0; i < 12; i++) | 318 | for (i = 0; i < 12; i++) |
| 308 | buf[i+9] = edgetob32(edge[i]); | 319 | buf[i+9] = edgetob32(edge[i]); |
| 309 | 320 | ||
| 310 | /* TODO */ | ||
| 311 | buf[21] = '='; | 321 | buf[21] = '='; |
| 312 | buf[22] = 'A'; | 322 | buf[22] = (char)cube.orientation + 'A'; |
| 313 | buf[23] = '\0'; | 323 | buf[23] = '\0'; |
| 314 | 324 | ||
| 315 | return NISSY_OK; | 325 | return NISSY_OK; |
| @@ -351,4 +361,3 @@ cornertob32(uint8_t corner) | |||
| 351 | 361 | ||
| 352 | return val < 26 ? 'A' + (char)val : 'a' + (char)(val - 26); | 362 | return val < 26 ? 'A' + (char)val : 'a' + (char)(val - 26); |
| 353 | } | 363 | } |
| 354 | /******************************************************************************/ | ||
diff --git a/src/core/moves.h b/src/core/moves.h index bbc8e7c..8ed267d 100644 --- a/src/core/moves.h +++ b/src/core/moves.h | |||
| @@ -21,7 +21,7 @@ STATIC uint8_t inverse_move(uint8_t); | |||
| 21 | STATIC void sortparallel_moves(size_t n, uint8_t [n]); | 21 | STATIC void sortparallel_moves(size_t n, uint8_t [n]); |
| 22 | STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]); | 22 | STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]); |
| 23 | 23 | ||
| 24 | STATIC cube_t applymoves(cube_t, const char *); | 24 | STATIC oriented_cube_t applymoves(oriented_cube_t, const char *); |
| 25 | 25 | ||
| 26 | #define FOREACH_READMOVE(ARG_BUF, ARG_MOVE, ARG_C, ARG_MAX, \ | 26 | #define FOREACH_READMOVE(ARG_BUF, ARG_MOVE, ARG_C, ARG_MAX, \ |
| 27 | RET_ERROR, ARG_ACTION) \ | 27 | RET_ERROR, ARG_ACTION) \ |
| @@ -335,17 +335,17 @@ are_lastmoves_singlecw(size_t n, const uint8_t moves[n]) | |||
| 335 | return isbase(moves[n-1]) && (!two || isbase(moves[n-2])); | 335 | return isbase(moves[n-1]) && (!two || isbase(moves[n-2])); |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | STATIC cube_t | 338 | STATIC oriented_cube_t |
| 339 | applymoves(cube_t cube, const char *buf) | 339 | applymoves(oriented_cube_t cube, const char *buf) |
| 340 | { | 340 | { |
| 341 | int c; | 341 | int c; |
| 342 | uint8_t m; | 342 | uint8_t m; |
| 343 | 343 | ||
| 344 | DBG_ASSERT(isconsistent(cube), ZERO_CUBE, | 344 | DBG_ASSERT(isconsistent(cube), ZERO_ORIENTED_CUBE, |
| 345 | "move error: inconsistent cube\n"); | 345 | "move error: inconsistent cube\n"); |
| 346 | 346 | ||
| 347 | FOREACH_READMOVE(buf, m, c, -1, ZERO_CUBE, | 347 | FOREACH_READMOVE(buf, m, c, -1, ZERO_ORIENTED_CUBE, |
| 348 | cube = move(cube, m); | 348 | cube.cube = move(cube.cube, m); |
| 349 | ) | 349 | ) |
| 350 | 350 | ||
| 351 | return cube; | 351 | return cube; |
diff --git a/src/core/transform.h b/src/core/transform.h index 28b8d93..763a4ae 100644 --- a/src/core/transform.h +++ b/src/core/transform.h | |||
| @@ -23,7 +23,7 @@ STATIC void writetrans(uint8_t, char [static NISSY_SIZE_TRANSFORMATION]); | |||
| 23 | STATIC cube_t transform_edges(cube_t, uint8_t); | 23 | STATIC cube_t transform_edges(cube_t, uint8_t); |
| 24 | STATIC cube_t transform_corners(cube_t, uint8_t); | 24 | STATIC cube_t transform_corners(cube_t, uint8_t); |
| 25 | STATIC cube_t transform(cube_t, uint8_t); | 25 | STATIC cube_t transform(cube_t, uint8_t); |
| 26 | STATIC cube_t applytrans(cube_t, const char *); | 26 | STATIC oriented_cube_t applytrans(oriented_cube_t, const char *); |
| 27 | STATIC_INLINE uint8_t inverse_trans(uint8_t); | 27 | STATIC_INLINE uint8_t inverse_trans(uint8_t); |
| 28 | STATIC uint8_t transform_move(uint8_t, uint8_t); | 28 | STATIC uint8_t transform_move(uint8_t, uint8_t); |
| 29 | STATIC uint64_t symmetry_mask(cube_t); | 29 | STATIC uint64_t symmetry_mask(cube_t); |
| @@ -367,12 +367,12 @@ transform(cube_t c, uint8_t t) | |||
| 367 | } | 367 | } |
| 368 | } | 368 | } |
| 369 | 369 | ||
| 370 | STATIC cube_t | 370 | STATIC oriented_cube_t |
| 371 | applytrans(cube_t cube, const char *buf) | 371 | applytrans(oriented_cube_t cube, const char *buf) |
| 372 | { | 372 | { |
| 373 | uint8_t t; | 373 | uint8_t t; |
| 374 | 374 | ||
| 375 | DBG_ASSERT(isconsistent(cube), ZERO_CUBE, | 375 | DBG_ASSERT(isconsistent(cube), ZERO_ORIENTED_CUBE, |
| 376 | "transformation error: inconsistent cube\n"); | 376 | "transformation error: inconsistent cube\n"); |
| 377 | 377 | ||
| 378 | t = readtrans(buf); | 378 | t = readtrans(buf); |
| @@ -380,7 +380,10 @@ applytrans(cube_t cube, const char *buf) | |||
| 380 | if (t == UINT8_ERROR) | 380 | if (t == UINT8_ERROR) |
| 381 | LOG("Unknown transformation: %s\n", buf); | 381 | LOG("Unknown transformation: %s\n", buf); |
| 382 | 382 | ||
| 383 | return transform(cube, t); | 383 | return (oriented_cube_t){ |
| 384 | .cube = transform(cube.cube, t), | ||
| 385 | .orientation = cube.orientation | ||
| 386 | }; | ||
| 384 | } | 387 | } |
| 385 | 388 | ||
| 386 | STATIC_INLINE uint8_t | 389 | STATIC_INLINE uint8_t |
diff --git a/src/nissy.c b/src/nissy.c index 8aa0334..27f2b35 100644 --- a/src/nissy.c +++ b/src/nissy.c | |||
| @@ -17,7 +17,7 @@ long long parse_h48_solver( | |||
| 17 | STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); | 17 | STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); |
| 18 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], | 18 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], |
| 19 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); | 19 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); |
| 20 | STATIC long long write_result(cube_t, char [static NISSY_SIZE_CUBE]); | 20 | STATIC long long write_result(oriented_cube_t, char [static NISSY_SIZE_CUBE]); |
| 21 | STATIC size_t my_strnlen(const char *, size_t); | 21 | STATIC size_t my_strnlen(const char *, size_t); |
| 22 | STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); | 22 | STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); |
| 23 | STATIC long long nissy_gendata_unsafe( | 23 | STATIC long long nissy_gendata_unsafe( |
| @@ -117,7 +117,7 @@ distribution_equal( | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | STATIC long long | 119 | STATIC long long |
| 120 | write_result(cube_t cube, char result[static NISSY_SIZE_CUBE]) | 120 | write_result(oriented_cube_t cube, char result[static NISSY_SIZE_CUBE]) |
| 121 | { | 121 | { |
| 122 | writecube(cube, NISSY_SIZE_CUBE, result); | 122 | writecube(cube, NISSY_SIZE_CUBE, result); |
| 123 | 123 | ||
| @@ -142,53 +142,12 @@ my_strnlen(const char *str, size_t maxlen) | |||
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | long long | 144 | long long |
| 145 | nissy_compose( | ||
| 146 | const char cube[static NISSY_SIZE_CUBE], | ||
| 147 | const char permutation[static NISSY_SIZE_CUBE], | ||
| 148 | char result[static NISSY_SIZE_CUBE] | ||
| 149 | ) | ||
| 150 | { | ||
| 151 | cube_t c, p, res; | ||
| 152 | long long err; | ||
| 153 | |||
| 154 | c = readcube(cube); | ||
| 155 | |||
| 156 | if (!isconsistent(c)) { | ||
| 157 | LOG("[compose] Error: the given cube is invalid\n"); | ||
| 158 | err = NISSY_ERROR_INVALID_CUBE; | ||
| 159 | goto nissy_compose_error; | ||
| 160 | } | ||
| 161 | |||
| 162 | p = readcube(permutation); | ||
| 163 | |||
| 164 | if (!isconsistent(p)) { | ||
| 165 | LOG("[compose] Error: given permutation is invalid\n"); | ||
| 166 | err = NISSY_ERROR_INVALID_CUBE; | ||
| 167 | goto nissy_compose_error; | ||
| 168 | } | ||
| 169 | |||
| 170 | res = compose(c, p); | ||
| 171 | |||
| 172 | if (!isconsistent(res)) { | ||
| 173 | LOG("[compose] Unknown error: resulting cube is invalid\n"); | ||
| 174 | err = NISSY_ERROR_UNKNOWN; | ||
| 175 | goto nissy_compose_error; | ||
| 176 | } | ||
| 177 | |||
| 178 | return write_result(res, result); | ||
| 179 | |||
| 180 | nissy_compose_error: | ||
| 181 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | ||
| 182 | return err; | ||
| 183 | } | ||
| 184 | |||
| 185 | long long | ||
| 186 | nissy_inverse( | 145 | nissy_inverse( |
| 187 | const char cube[static NISSY_SIZE_CUBE], | 146 | const char cube[static NISSY_SIZE_CUBE], |
| 188 | char result[static NISSY_SIZE_CUBE] | 147 | char result[static NISSY_SIZE_CUBE] |
| 189 | ) | 148 | ) |
| 190 | { | 149 | { |
| 191 | cube_t c, res; | 150 | oriented_cube_t c, res; |
| 192 | long long err; | 151 | long long err; |
| 193 | 152 | ||
| 194 | c = readcube(cube); | 153 | c = readcube(cube); |
| @@ -199,7 +158,10 @@ nissy_inverse( | |||
| 199 | goto nissy_inverse_error; | 158 | goto nissy_inverse_error; |
| 200 | } | 159 | } |
| 201 | 160 | ||
| 202 | res = inverse(c); | 161 | res = (oriented_cube_t) { |
| 162 | .cube = inverse(c.cube), | ||
| 163 | .orientation = c.orientation | ||
| 164 | }; | ||
| 203 | 165 | ||
| 204 | if (!isconsistent(res)) { | 166 | if (!isconsistent(res)) { |
| 205 | LOG("[inverse] Unknown error: inverted cube is invalid\n"); | 167 | LOG("[inverse] Unknown error: inverted cube is invalid\n"); |
| @@ -210,7 +172,7 @@ nissy_inverse( | |||
| 210 | return write_result(res, result); | 172 | return write_result(res, result); |
| 211 | 173 | ||
| 212 | nissy_inverse_error: | 174 | nissy_inverse_error: |
| 213 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 175 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 214 | return err; | 176 | return err; |
| 215 | } | 177 | } |
| 216 | 178 | ||
| @@ -221,7 +183,7 @@ nissy_applymoves( | |||
| 221 | char result[static NISSY_SIZE_CUBE] | 183 | char result[static NISSY_SIZE_CUBE] |
| 222 | ) | 184 | ) |
| 223 | { | 185 | { |
| 224 | cube_t c, res; | 186 | oriented_cube_t c, res; |
| 225 | long long err; | 187 | long long err; |
| 226 | 188 | ||
| 227 | if (moves == NULL) { | 189 | if (moves == NULL) { |
| @@ -249,7 +211,7 @@ nissy_applymoves( | |||
| 249 | return write_result(res, result); | 211 | return write_result(res, result); |
| 250 | 212 | ||
| 251 | nissy_applymoves_error: | 213 | nissy_applymoves_error: |
| 252 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 214 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 253 | return err; | 215 | return err; |
| 254 | } | 216 | } |
| 255 | 217 | ||
| @@ -260,7 +222,7 @@ nissy_applytrans( | |||
| 260 | char result[static NISSY_SIZE_CUBE] | 222 | char result[static NISSY_SIZE_CUBE] |
| 261 | ) | 223 | ) |
| 262 | { | 224 | { |
| 263 | cube_t c, res; | 225 | oriented_cube_t c, res; |
| 264 | long long err; | 226 | long long err; |
| 265 | 227 | ||
| 266 | c = readcube(cube); | 228 | c = readcube(cube); |
| @@ -282,7 +244,7 @@ nissy_applytrans( | |||
| 282 | return write_result(res, result); | 244 | return write_result(res, result); |
| 283 | 245 | ||
| 284 | nissy_applytrans_error: | 246 | nissy_applytrans_error: |
| 285 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 247 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 286 | return err; | 248 | return err; |
| 287 | } | 249 | } |
| 288 | 250 | ||
| @@ -310,13 +272,14 @@ nissy_getcube( | |||
| 310 | 272 | ||
| 311 | c = getcube(ep, eo, cp, co); | 273 | c = getcube(ep, eo, cp, co); |
| 312 | 274 | ||
| 313 | if (!isconsistent(c)) { | 275 | if (!isconsistent((oriented_cube_t){ .cube = c, .orientation = 0 })) { |
| 314 | LOG("[getcube] Error: could not get cube with ep=%lld, " | 276 | LOG("[getcube] Error: could not get cube with ep=%lld, " |
| 315 | "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); | 277 | "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); |
| 316 | return NISSY_ERROR_OPTIONS; | 278 | return NISSY_ERROR_OPTIONS; |
| 317 | } | 279 | } |
| 318 | 280 | ||
| 319 | return write_result(c, result); | 281 | /* TODO: should support orientation */ |
| 282 | return write_result((oriented_cube_t){.cube = c, .orientation = 0}, result); | ||
| 320 | } | 283 | } |
| 321 | 284 | ||
| 322 | long long | 285 | long long |
| @@ -497,6 +460,7 @@ nissy_solve( | |||
| 497 | long long stats[static NISSY_SIZE_SOLVE_STATS] | 460 | long long stats[static NISSY_SIZE_SOLVE_STATS] |
| 498 | ) | 461 | ) |
| 499 | { | 462 | { |
| 463 | oriented_cube_t oc; | ||
| 500 | cube_t c; | 464 | cube_t c; |
| 501 | long long parse_ret; | 465 | long long parse_ret; |
| 502 | uint8_t h, k; | 466 | uint8_t h, k; |
| @@ -507,14 +471,17 @@ nissy_solve( | |||
| 507 | return NISSY_ERROR_NULL_POINTER; | 471 | return NISSY_ERROR_NULL_POINTER; |
| 508 | } | 472 | } |
| 509 | 473 | ||
| 510 | c = readcube(cube); | 474 | oc = readcube(cube); |
| 475 | c = oc.cube; | ||
| 511 | 476 | ||
| 512 | if (!isconsistent(c)) { | 477 | /* TODO: solve should handle oriented cubes */ |
| 478 | |||
| 479 | if (!isconsistent(oc)) { | ||
| 513 | LOG("[solve] Error: cube is invalid\n"); | 480 | LOG("[solve] Error: cube is invalid\n"); |
| 514 | return NISSY_ERROR_INVALID_CUBE; | 481 | return NISSY_ERROR_INVALID_CUBE; |
| 515 | } | 482 | } |
| 516 | 483 | ||
| 517 | if (!issolvable(c)) { | 484 | if (!issolvable((oriented_cube_t){ .cube = c, .orientation = 0})) { |
| 518 | /* TODO: this is step-dependent */ | 485 | /* TODO: this is step-dependent */ |
| 519 | LOG("[solve] Error: cube is not solvable\n"); | 486 | LOG("[solve] Error: cube is not solvable\n"); |
| 520 | return NISSY_ERROR_UNSOLVABLE_CUBE; | 487 | return NISSY_ERROR_UNSOLVABLE_CUBE; |
diff --git a/src/nissy.h b/src/nissy.h index 4b2d1eb..e7ae50e 100644 --- a/src/nissy.h +++ b/src/nissy.h | |||
| @@ -126,31 +126,6 @@ of this kind to sebastiano@tronto.net. Thanks! | |||
| 126 | /* Library functions *********************************************************/ | 126 | /* Library functions *********************************************************/ |
| 127 | 127 | ||
| 128 | /* | 128 | /* |
| 129 | Apply the secod argument as a permutation on the first argument. | ||
| 130 | |||
| 131 | Parameters: | ||
| 132 | cube - The first cube. | ||
| 133 | permutation - The second cub. This cube is treated as a permutation and | ||
| 134 | "applied" to the first cube. | ||
| 135 | result - The return parameter for the resulting cube. | ||
| 136 | |||
| 137 | Return values: | ||
| 138 | NISSY_OK - The cubes were composed succesfully. | ||
| 139 | NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is | ||
| 140 | either because at least on of the given cubes | ||
| 141 | was not solvable, or due to an unknown internal | ||
| 142 | error. | ||
| 143 | NISSY_ERROR_INVALID_CUBE - At least one of the given cubes is invalid. | ||
| 144 | NISSY_ERROR_UNKNOWN - An unknown error occurred. | ||
| 145 | */ | ||
| 146 | long long | ||
| 147 | nissy_compose( | ||
| 148 | const char cube[static NISSY_SIZE_CUBE], | ||
| 149 | const char permutation[static NISSY_SIZE_CUBE], | ||
| 150 | char result[static NISSY_SIZE_CUBE] | ||
| 151 | ); | ||
| 152 | |||
| 153 | /* | ||
| 154 | Compute the inverse of the given cube. | 129 | Compute the inverse of the given cube. |
| 155 | 130 | ||
| 156 | Parameters: | 131 | Parameters: |
diff --git a/src/solvers/h48/solve.h b/src/solvers/h48/solve.h index cf7095c..d19309b 100644 --- a/src/solvers/h48/solve.h +++ b/src/solvers/h48/solve.h | |||
| @@ -155,7 +155,7 @@ solve_h48_dfs(dfsarg_solve_h48_t arg[static 1]) | |||
| 155 | bool ulbi, ulbn; | 155 | bool ulbi, ulbn; |
| 156 | cube_t backup_cube, backup_inverse; | 156 | cube_t backup_cube, backup_inverse; |
| 157 | 157 | ||
| 158 | if (issolved(arg->cube)) { | 158 | if (equal(arg->cube, SOLVED_CUBE)) { |
| 159 | nm = arg->solution_moves->nmoves | 159 | nm = arg->solution_moves->nmoves |
| 160 | + arg->solution_moves->npremoves; | 160 | + arg->solution_moves->npremoves; |
| 161 | if (arg->target_depth != nm) | 161 | if (arg->target_depth != nm) |
| @@ -282,7 +282,7 @@ solve_h48_maketasks( | |||
| 282 | cube_t backup_cube; | 282 | cube_t backup_cube; |
| 283 | solution_moves_t moves; | 283 | solution_moves_t moves; |
| 284 | 284 | ||
| 285 | if (issolved(maketasks_arg->cube)) { | 285 | if (equal(maketasks_arg->cube, SOLVED_CUBE)) { |
| 286 | if (maketasks_arg->nmoves > maketasks_arg->maxmoves || | 286 | if (maketasks_arg->nmoves > maketasks_arg->maxmoves || |
| 287 | maketasks_arg->nmoves < maketasks_arg->minmoves || | 287 | maketasks_arg->nmoves < maketasks_arg->minmoves || |
| 288 | solutions_done(solve_arg->solution_list, | 288 | solutions_done(solve_arg->solution_list, |
diff --git a/src/utils/constants.h b/src/utils/constants.h index d6d48cc..da0a813 100644 --- a/src/utils/constants.h +++ b/src/utils/constants.h | |||
| @@ -9,6 +9,8 @@ | |||
| 9 | #define COMB_12_4 INT64_C(495) | 9 | #define COMB_12_4 INT64_C(495) |
| 10 | #define COMB_8_4 INT64_C(70) | 10 | #define COMB_8_4 INT64_C(70) |
| 11 | 11 | ||
| 12 | #define UINT8_ERROR UINT8_MAX | ||
| 13 | |||
| 12 | STATIC int64_t binomial[12][12] = { | 14 | STATIC int64_t binomial[12][12] = { |
| 13 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 15 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 14 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 16 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| @@ -23,443 +25,3 @@ STATIC int64_t binomial[12][12] = { | |||
| 23 | {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0}, | 25 | {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0}, |
| 24 | {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1}, | 26 | {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1}, |
| 25 | }; | 27 | }; |
| 26 | |||
| 27 | #define MOVE_U UINT8_C(0) | ||
| 28 | #define MOVE_U2 UINT8_C(1) | ||
| 29 | #define MOVE_U3 UINT8_C(2) | ||
| 30 | #define MOVE_D UINT8_C(3) | ||
| 31 | #define MOVE_D2 UINT8_C(4) | ||
| 32 | #define MOVE_D3 UINT8_C(5) | ||
| 33 | #define MOVE_R UINT8_C(6) | ||
| 34 | #define MOVE_R2 UINT8_C(7) | ||
| 35 | #define MOVE_R3 UINT8_C(8) | ||
| 36 | #define MOVE_L UINT8_C(9) | ||
| 37 | #define MOVE_L2 UINT8_C(10) | ||
| 38 | #define MOVE_L3 UINT8_C(11) | ||
| 39 | #define MOVE_F UINT8_C(12) | ||
| 40 | #define MOVE_F2 UINT8_C(13) | ||
| 41 | #define MOVE_F3 UINT8_C(14) | ||
| 42 | #define MOVE_B UINT8_C(15) | ||
| 43 | #define MOVE_B2 UINT8_C(16) | ||
| 44 | #define MOVE_B3 UINT8_C(17) | ||
| 45 | |||
| 46 | #define MOVE_Uw UINT8_C(18) | ||
| 47 | #define MOVE_Uw2 UINT8_C(19) | ||
| 48 | #define MOVE_Uw3 UINT8_C(20) | ||
| 49 | #define MOVE_Dw UINT8_C(21) | ||
| 50 | #define MOVE_Dw2 UINT8_C(22) | ||
| 51 | #define MOVE_Dw3 UINT8_C(23) | ||
| 52 | #define MOVE_Rw UINT8_C(24) | ||
| 53 | #define MOVE_Rw2 UINT8_C(25) | ||
| 54 | #define MOVE_Rw3 UINT8_C(26) | ||
| 55 | #define MOVE_Lw UINT8_C(27) | ||
| 56 | #define MOVE_Lw2 UINT8_C(28) | ||
| 57 | #define MOVE_Lw3 UINT8_C(29) | ||
| 58 | #define MOVE_Fw UINT8_C(30) | ||
| 59 | #define MOVE_Fw2 UINT8_C(31) | ||
| 60 | #define MOVE_Fw3 UINT8_C(32) | ||
| 61 | #define MOVE_Bw UINT8_C(33) | ||
| 62 | #define MOVE_Bw2 UINT8_C(34) | ||
| 63 | #define MOVE_Bw3 UINT8_C(35) | ||
| 64 | |||
| 65 | #define MOVE_M UINT8_C(36) | ||
| 66 | #define MOVE_M2 UINT8_C(37) | ||
| 67 | #define MOVE_M3 UINT8_C(38) | ||
| 68 | #define MOVE_S UINT8_C(39) | ||
| 69 | #define MOVE_S2 UINT8_C(40) | ||
| 70 | #define MOVE_S3 UINT8_C(41) | ||
| 71 | #define MOVE_E UINT8_C(42) | ||
| 72 | #define MOVE_E2 UINT8_C(43) | ||
| 73 | #define MOVE_E3 UINT8_C(44) | ||
| 74 | |||
| 75 | #define MOVE_x UINT8_C(45) | ||
| 76 | #define MOVE_x2 UINT8_C(46) | ||
| 77 | #define MOVE_x3 UINT8_C(47) | ||
| 78 | #define MOVE_y UINT8_C(48) | ||
| 79 | #define MOVE_y2 UINT8_C(49) | ||
| 80 | #define MOVE_y3 UINT8_C(50) | ||
| 81 | #define MOVE_z UINT8_C(51) | ||
| 82 | #define MOVE_z2 UINT8_C(52) | ||
| 83 | #define MOVE_z3 UINT8_C(53) | ||
| 84 | |||
| 85 | #define TRANS_UFr UINT8_C(0) | ||
| 86 | #define TRANS_ULr UINT8_C(1) | ||
| 87 | #define TRANS_UBr UINT8_C(2) | ||
| 88 | #define TRANS_URr UINT8_C(3) | ||
| 89 | #define TRANS_DFr UINT8_C(4) | ||
| 90 | #define TRANS_DLr UINT8_C(5) | ||
| 91 | #define TRANS_DBr UINT8_C(6) | ||
| 92 | #define TRANS_DRr UINT8_C(7) | ||
| 93 | #define TRANS_RUr UINT8_C(8) | ||
| 94 | #define TRANS_RFr UINT8_C(9) | ||
| 95 | #define TRANS_RDr UINT8_C(10) | ||
| 96 | #define TRANS_RBr UINT8_C(11) | ||
| 97 | #define TRANS_LUr UINT8_C(12) | ||
| 98 | #define TRANS_LFr UINT8_C(13) | ||
| 99 | #define TRANS_LDr UINT8_C(14) | ||
| 100 | #define TRANS_LBr UINT8_C(15) | ||
| 101 | #define TRANS_FUr UINT8_C(16) | ||
| 102 | #define TRANS_FRr UINT8_C(17) | ||
| 103 | #define TRANS_FDr UINT8_C(18) | ||
| 104 | #define TRANS_FLr UINT8_C(19) | ||
| 105 | #define TRANS_BUr UINT8_C(20) | ||
| 106 | #define TRANS_BRr UINT8_C(21) | ||
| 107 | #define TRANS_BDr UINT8_C(22) | ||
| 108 | #define TRANS_BLr UINT8_C(23) | ||
| 109 | |||
| 110 | #define TRANS_UFm UINT8_C(24) | ||
| 111 | #define TRANS_ULm UINT8_C(25) | ||
| 112 | #define TRANS_UBm UINT8_C(26) | ||
| 113 | #define TRANS_URm UINT8_C(27) | ||
| 114 | #define TRANS_DFm UINT8_C(28) | ||
| 115 | #define TRANS_DLm UINT8_C(29) | ||
| 116 | #define TRANS_DBm UINT8_C(30) | ||
| 117 | #define TRANS_DRm UINT8_C(31) | ||
| 118 | #define TRANS_RUm UINT8_C(32) | ||
| 119 | #define TRANS_RFm UINT8_C(33) | ||
| 120 | #define TRANS_RDm UINT8_C(34) | ||
| 121 | #define TRANS_RBm UINT8_C(35) | ||
| 122 | #define TRANS_LUm UINT8_C(36) | ||
| 123 | #define TRANS_LFm UINT8_C(37) | ||
| 124 | #define TRANS_LDm UINT8_C(38) | ||
| 125 | #define TRANS_LBm UINT8_C(39) | ||
| 126 | #define TRANS_FUm UINT8_C(40) | ||
| 127 | #define TRANS_FRm UINT8_C(41) | ||
| 128 | #define TRANS_FDm UINT8_C(42) | ||
| 129 | #define TRANS_FLm UINT8_C(43) | ||
| 130 | #define TRANS_BUm UINT8_C(44) | ||
| 131 | #define TRANS_BRm UINT8_C(45) | ||
| 132 | #define TRANS_BDm UINT8_C(46) | ||
| 133 | #define TRANS_BLm UINT8_C(47) | ||
| 134 | |||
| 135 | #define AXIS_UD UINT8_C(0) | ||
| 136 | #define AXIS_RL UINT8_C(1) | ||
| 137 | #define AXIS_FB UINT8_C(2) | ||
| 138 | |||
| 139 | #define NMOVES (1+MOVE_B3) | ||
| 140 | #define NMOVES_EXTENDED (1+MOVE_z3) | ||
| 141 | #define NTRANS (1+TRANS_BLm) | ||
| 142 | |||
| 143 | #define MM_ALLMOVES UINT32_C(0x3FFFF) | ||
| 144 | #define MM_NOHALFTURNS UINT32_C(0x2DB6D) | ||
| 145 | #define MM_SINGLE(m) (UINT32_C(1) << (uint32_t)(m)) | ||
| 146 | #define MM_FACE(m) (UINT32_C(7) << (uint32_t)(m)) | ||
| 147 | #define MM_EO (\ | ||
| 148 | MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\ | ||
| 149 | MM_FACE(MOVE_R) | MM_FACE(MOVE_L) |\ | ||
| 150 | MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2)) | ||
| 151 | #define MM_DR (\ | ||
| 152 | MM_FACE(MOVE_U) | MM_FACE(MOVE_D) |\ | ||
| 153 | MM_SINGLE(MOVE_R2) | MM_SINGLE(MOVE_L2) |\ | ||
| 154 | MM_SINGLE(MOVE_F2) | MM_SINGLE(MOVE_B2)) | ||
| 155 | #define MM_HTR (MM_ALLMOVES & ~MM_NOHALFTURNS) | ||
| 156 | |||
| 157 | #define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF) | ||
| 158 | #define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t)) | ||
| 159 | #define TM_UDRLFIX (\ | ||
| 160 | TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_UFm) | \ | ||
| 161 | TM_SINGLE(TRANS_UBm) | TM_SINGLE(TRANS_DFr) | TM_SINGLE(TRANS_DBr) | \ | ||
| 162 | TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm)) | ||
| 163 | #define TM_UDFIX (\ | ||
| 164 | TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \ | ||
| 165 | TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \ | ||
| 166 | TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \ | ||
| 167 | TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \ | ||
| 168 | TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \ | ||
| 169 | TM_SINGLE(TRANS_DLm)) | ||
| 170 | |||
| 171 | #define CORNER_UFR UINT8_C(0) | ||
| 172 | #define CORNER_UBL UINT8_C(1) | ||
| 173 | #define CORNER_DFL UINT8_C(2) | ||
| 174 | #define CORNER_DBR UINT8_C(3) | ||
| 175 | #define CORNER_UFL UINT8_C(4) | ||
| 176 | #define CORNER_UBR UINT8_C(5) | ||
| 177 | #define CORNER_DFR UINT8_C(6) | ||
| 178 | #define CORNER_DBL UINT8_C(7) | ||
| 179 | |||
| 180 | #define EDGE_UF UINT8_C(0) | ||
| 181 | #define EDGE_UB UINT8_C(1) | ||
| 182 | #define EDGE_DB UINT8_C(2) | ||
| 183 | #define EDGE_DF UINT8_C(3) | ||
| 184 | #define EDGE_UR UINT8_C(4) | ||
| 185 | #define EDGE_UL UINT8_C(5) | ||
| 186 | #define EDGE_DL UINT8_C(6) | ||
| 187 | #define EDGE_DR UINT8_C(7) | ||
| 188 | #define EDGE_FR UINT8_C(8) | ||
| 189 | #define EDGE_FL UINT8_C(9) | ||
| 190 | #define EDGE_BL UINT8_C(10) | ||
| 191 | #define EDGE_BR UINT8_C(11) | ||
| 192 | |||
| 193 | #define EOSHIFT UINT8_C(4) | ||
| 194 | #define COSHIFT UINT8_C(5) | ||
| 195 | |||
| 196 | #define PBITS UINT8_C(0xF) | ||
| 197 | #define ESEPBIT_1 UINT8_C(0x4) | ||
| 198 | #define ESEPBIT_2 UINT8_C(0x8) | ||
| 199 | #define CSEPBIT UINT8_C(0x4) | ||
| 200 | #define EOBIT UINT8_C(0x10) | ||
| 201 | #define COBITS UINT8_C(0xF0) | ||
| 202 | #define COBITS_2 UINT8_C(0x60) | ||
| 203 | #define CTWIST_CW UINT8_C(0x20) | ||
| 204 | #define CTWIST_CCW UINT8_C(0x40) | ||
| 205 | #define EFLIP UINT8_C(0x10) | ||
| 206 | #define UINT8_ERROR UINT8_MAX | ||
| 207 | |||
| 208 | STATIC const uint32_t allowedmask[] = { | ||
| 209 | UINT32_C(0x3FFF8), | ||
| 210 | UINT32_C(0x3FFC0), | ||
| 211 | UINT32_C(0x3FE3F), | ||
| 212 | UINT32_C(0x3F03F), | ||
| 213 | UINT32_C(0x38FFF), | ||
| 214 | UINT32_C(0x00FFF) | ||
| 215 | }; | ||
| 216 | |||
| 217 | STATIC const char *cornerstr[] = { | ||
| 218 | [CORNER_UFR] = "UFR", | ||
| 219 | [CORNER_UBL] = "UBL", | ||
| 220 | [CORNER_DFL] = "DFL", | ||
| 221 | [CORNER_DBR] = "DBR", | ||
| 222 | [CORNER_UFL] = "UFL", | ||
| 223 | [CORNER_UBR] = "UBR", | ||
| 224 | [CORNER_DFR] = "DFR", | ||
| 225 | [CORNER_DBL] = "DBL" | ||
| 226 | }; | ||
| 227 | |||
| 228 | STATIC const char *cornerstralt[] = { | ||
| 229 | [CORNER_UFR] = "URF", | ||
| 230 | [CORNER_UBL] = "ULB", | ||
| 231 | [CORNER_DFL] = "DLF", | ||
| 232 | [CORNER_DBR] = "DRB", | ||
| 233 | [CORNER_UFL] = "ULF", | ||
| 234 | [CORNER_UBR] = "URB", | ||
| 235 | [CORNER_DFR] = "DRF", | ||
| 236 | [CORNER_DBL] = "DLB" | ||
| 237 | }; | ||
| 238 | |||
| 239 | STATIC const char *edgestr[] = { | ||
| 240 | [EDGE_UF] = "UF", | ||
| 241 | [EDGE_UB] = "UB", | ||
| 242 | [EDGE_DB] = "DB", | ||
| 243 | [EDGE_DF] = "DF", | ||
| 244 | [EDGE_UR] = "UR", | ||
| 245 | [EDGE_UL] = "UL", | ||
| 246 | [EDGE_DL] = "DL", | ||
| 247 | [EDGE_DR] = "DR", | ||
| 248 | [EDGE_FR] = "FR", | ||
| 249 | [EDGE_FL] = "FL", | ||
| 250 | [EDGE_BL] = "BL", | ||
| 251 | [EDGE_BR] = "BR" | ||
| 252 | }; | ||
| 253 | |||
| 254 | STATIC const char *movestr[] = { | ||
| 255 | [MOVE_U] = "U", | ||
| 256 | [MOVE_U2] = "U2", | ||
| 257 | [MOVE_U3] = "U'", | ||
| 258 | [MOVE_D] = "D", | ||
| 259 | [MOVE_D2] = "D2", | ||
| 260 | [MOVE_D3] = "D'", | ||
| 261 | [MOVE_R] = "R", | ||
| 262 | [MOVE_R2] = "R2", | ||
| 263 | [MOVE_R3] = "R'", | ||
| 264 | [MOVE_L] = "L", | ||
| 265 | [MOVE_L2] = "L2", | ||
| 266 | [MOVE_L3] = "L'", | ||
| 267 | [MOVE_F] = "F", | ||
| 268 | [MOVE_F2] = "F2", | ||
| 269 | [MOVE_F3] = "F'", | ||
| 270 | [MOVE_B] = "B", | ||
| 271 | [MOVE_B2] = "B2", | ||
| 272 | [MOVE_B3] = "B'", | ||
| 273 | |||
| 274 | [MOVE_Uw] = "Uw", | ||
| 275 | [MOVE_Uw2] = "Uw2", | ||
| 276 | [MOVE_Uw3] = "Uw'", | ||
| 277 | [MOVE_Dw] = "Dw", | ||
| 278 | [MOVE_Dw2] = "Dw2", | ||
| 279 | [MOVE_Dw3] = "Dw'", | ||
| 280 | [MOVE_Rw] = "Rw", | ||
| 281 | [MOVE_Rw2] = "Rw2", | ||
| 282 | [MOVE_Rw3] = "Rw'", | ||
| 283 | [MOVE_Lw] = "Lw", | ||
| 284 | [MOVE_Lw2] = "Lw2", | ||
| 285 | [MOVE_Lw3] = "Lw'", | ||
| 286 | [MOVE_Fw] = "Fw", | ||
| 287 | [MOVE_Fw2] = "Fw2", | ||
| 288 | [MOVE_Fw3] = "Fw'", | ||
| 289 | [MOVE_Bw] = "Bw", | ||
| 290 | [MOVE_Bw2] = "Bw2", | ||
| 291 | [MOVE_Bw3] = "Bw'", | ||
| 292 | |||
| 293 | [MOVE_M] = "M", | ||
| 294 | [MOVE_M2] = "M2", | ||
| 295 | [MOVE_M3] = "M'", | ||
| 296 | [MOVE_S] = "S", | ||
| 297 | [MOVE_S2] = "S2", | ||
| 298 | [MOVE_S3] = "S'", | ||
| 299 | [MOVE_E] = "E", | ||
| 300 | [MOVE_E2] = "E2", | ||
| 301 | [MOVE_E3] = "E'", | ||
| 302 | |||
| 303 | [MOVE_x] = "x", | ||
| 304 | [MOVE_x2] = "x2", | ||
| 305 | [MOVE_x3] = "x'", | ||
| 306 | [MOVE_y] = "y", | ||
| 307 | [MOVE_y2] = "y2", | ||
| 308 | [MOVE_y3] = "y'", | ||
| 309 | [MOVE_z] = "z", | ||
| 310 | [MOVE_z2] = "z2", | ||
| 311 | [MOVE_z3] = "z'", | ||
| 312 | }; | ||
| 313 | |||
| 314 | STATIC const char *transstr[] = { | ||
| 315 | [TRANS_UFr] = "rotation UF", | ||
| 316 | [TRANS_UFm] = "mirrored UF", | ||
| 317 | [TRANS_ULr] = "rotation UL", | ||
| 318 | [TRANS_ULm] = "mirrored UL", | ||
| 319 | [TRANS_UBr] = "rotation UB", | ||
| 320 | [TRANS_UBm] = "mirrored UB", | ||
| 321 | [TRANS_URr] = "rotation UR", | ||
| 322 | [TRANS_URm] = "mirrored UR", | ||
| 323 | [TRANS_DFr] = "rotation DF", | ||
| 324 | [TRANS_DFm] = "mirrored DF", | ||
| 325 | [TRANS_DLr] = "rotation DL", | ||
| 326 | [TRANS_DLm] = "mirrored DL", | ||
| 327 | [TRANS_DBr] = "rotation DB", | ||
| 328 | [TRANS_DBm] = "mirrored DB", | ||
| 329 | [TRANS_DRr] = "rotation DR", | ||
| 330 | [TRANS_DRm] = "mirrored DR", | ||
| 331 | [TRANS_RUr] = "rotation RU", | ||
| 332 | [TRANS_RUm] = "mirrored RU", | ||
| 333 | [TRANS_RFr] = "rotation RF", | ||
| 334 | [TRANS_RFm] = "mirrored RF", | ||
| 335 | [TRANS_RDr] = "rotation RD", | ||
| 336 | [TRANS_RDm] = "mirrored RD", | ||
| 337 | [TRANS_RBr] = "rotation RB", | ||
| 338 | [TRANS_RBm] = "mirrored RB", | ||
| 339 | [TRANS_LUr] = "rotation LU", | ||
| 340 | [TRANS_LUm] = "mirrored LU", | ||
| 341 | [TRANS_LFr] = "rotation LF", | ||
| 342 | [TRANS_LFm] = "mirrored LF", | ||
| 343 | [TRANS_LDr] = "rotation LD", | ||
| 344 | [TRANS_LDm] = "mirrored LD", | ||
| 345 | [TRANS_LBr] = "rotation LB", | ||
| 346 | [TRANS_LBm] = "mirrored LB", | ||
| 347 | [TRANS_FUr] = "rotation FU", | ||
| 348 | [TRANS_FUm] = "mirrored FU", | ||
| 349 | [TRANS_FRr] = "rotation FR", | ||
| 350 | [TRANS_FRm] = "mirrored FR", | ||
| 351 | [TRANS_FDr] = "rotation FD", | ||
| 352 | [TRANS_FDm] = "mirrored FD", | ||
| 353 | [TRANS_FLr] = "rotation FL", | ||
| 354 | [TRANS_FLm] = "mirrored FL", | ||
| 355 | [TRANS_BUr] = "rotation BU", | ||
| 356 | [TRANS_BUm] = "mirrored BU", | ||
| 357 | [TRANS_BRr] = "rotation BR", | ||
| 358 | [TRANS_BRm] = "mirrored BR", | ||
| 359 | [TRANS_BDr] = "rotation BD", | ||
| 360 | [TRANS_BDm] = "mirrored BD", | ||
| 361 | [TRANS_BLr] = "rotation BL", | ||
| 362 | [TRANS_BLm] = "mirrored BL", | ||
| 363 | }; | ||
| 364 | |||
| 365 | static uint8_t inverse_trans_table[48] = { | ||
| 366 | [TRANS_UFr] = TRANS_UFr, | ||
| 367 | [TRANS_UFm] = TRANS_UFm, | ||
| 368 | [TRANS_ULr] = TRANS_URr, | ||
| 369 | [TRANS_ULm] = TRANS_ULm, | ||
| 370 | [TRANS_UBr] = TRANS_UBr, | ||
| 371 | [TRANS_UBm] = TRANS_UBm, | ||
| 372 | [TRANS_URr] = TRANS_ULr, | ||
| 373 | [TRANS_URm] = TRANS_URm, | ||
| 374 | [TRANS_DFr] = TRANS_DFr, | ||
| 375 | [TRANS_DFm] = TRANS_DFm, | ||
| 376 | [TRANS_DLr] = TRANS_DLr, | ||
| 377 | [TRANS_DLm] = TRANS_DRm, | ||
| 378 | [TRANS_DBr] = TRANS_DBr, | ||
| 379 | [TRANS_DBm] = TRANS_DBm, | ||
| 380 | [TRANS_DRr] = TRANS_DRr, | ||
| 381 | [TRANS_DRm] = TRANS_DLm, | ||
| 382 | [TRANS_RUr] = TRANS_FRr, | ||
| 383 | [TRANS_RUm] = TRANS_FLm, | ||
| 384 | [TRANS_RFr] = TRANS_LFr, | ||
| 385 | [TRANS_RFm] = TRANS_RFm, | ||
| 386 | [TRANS_RDr] = TRANS_BLr, | ||
| 387 | [TRANS_RDm] = TRANS_BRm, | ||
| 388 | [TRANS_RBr] = TRANS_RBr, | ||
| 389 | [TRANS_RBm] = TRANS_LBm, | ||
| 390 | [TRANS_LUr] = TRANS_FLr, | ||
| 391 | [TRANS_LUm] = TRANS_FRm, | ||
| 392 | [TRANS_LFr] = TRANS_RFr, | ||
| 393 | [TRANS_LFm] = TRANS_LFm, | ||
| 394 | [TRANS_LDr] = TRANS_BRr, | ||
| 395 | [TRANS_LDm] = TRANS_BLm, | ||
| 396 | [TRANS_LBr] = TRANS_LBr, | ||
| 397 | [TRANS_LBm] = TRANS_RBm, | ||
| 398 | [TRANS_FUr] = TRANS_FUr, | ||
| 399 | [TRANS_FUm] = TRANS_FUm, | ||
| 400 | [TRANS_FRr] = TRANS_RUr, | ||
| 401 | [TRANS_FRm] = TRANS_LUm, | ||
| 402 | [TRANS_FDr] = TRANS_BUr, | ||
| 403 | [TRANS_FDm] = TRANS_BUm, | ||
| 404 | [TRANS_FLr] = TRANS_LUr, | ||
| 405 | [TRANS_FLm] = TRANS_RUm, | ||
| 406 | [TRANS_BUr] = TRANS_FDr, | ||
| 407 | [TRANS_BUm] = TRANS_FDm, | ||
| 408 | [TRANS_BRr] = TRANS_LDr, | ||
| 409 | [TRANS_BRm] = TRANS_RDm, | ||
| 410 | [TRANS_BDr] = TRANS_BDr, | ||
| 411 | [TRANS_BDm] = TRANS_BDm, | ||
| 412 | [TRANS_BLr] = TRANS_RDr, | ||
| 413 | [TRANS_BLm] = TRANS_LDm, | ||
| 414 | }; | ||
| 415 | |||
| 416 | static uint8_t trans_move_table[48][3] = { | ||
| 417 | [TRANS_UFr] = { MOVE_U, MOVE_R, MOVE_F }, | ||
| 418 | [TRANS_UFm] = { MOVE_U, MOVE_L, MOVE_F }, | ||
| 419 | [TRANS_ULr] = { MOVE_U, MOVE_F, MOVE_L }, | ||
| 420 | [TRANS_ULm] = { MOVE_U, MOVE_F, MOVE_R }, | ||
| 421 | [TRANS_UBr] = { MOVE_U, MOVE_L, MOVE_B }, | ||
| 422 | [TRANS_UBm] = { MOVE_U, MOVE_R, MOVE_B }, | ||
| 423 | [TRANS_URr] = { MOVE_U, MOVE_B, MOVE_R }, | ||
| 424 | [TRANS_URm] = { MOVE_U, MOVE_B, MOVE_L }, | ||
| 425 | [TRANS_DFr] = { MOVE_D, MOVE_L, MOVE_F }, | ||
| 426 | [TRANS_DFm] = { MOVE_D, MOVE_R, MOVE_F }, | ||
| 427 | [TRANS_DLr] = { MOVE_D, MOVE_B, MOVE_L }, | ||
| 428 | [TRANS_DLm] = { MOVE_D, MOVE_B, MOVE_R }, | ||
| 429 | [TRANS_DBr] = { MOVE_D, MOVE_R, MOVE_B }, | ||
| 430 | [TRANS_DBm] = { MOVE_D, MOVE_L, MOVE_B }, | ||
| 431 | [TRANS_DRr] = { MOVE_D, MOVE_F, MOVE_R }, | ||
| 432 | [TRANS_DRm] = { MOVE_D, MOVE_F, MOVE_L }, | ||
| 433 | [TRANS_RUr] = { MOVE_R, MOVE_F, MOVE_U }, | ||
| 434 | [TRANS_RUm] = { MOVE_L, MOVE_F, MOVE_U }, | ||
| 435 | [TRANS_RFr] = { MOVE_R, MOVE_D, MOVE_F }, | ||
| 436 | [TRANS_RFm] = { MOVE_L, MOVE_D, MOVE_F }, | ||
| 437 | [TRANS_RDr] = { MOVE_R, MOVE_B, MOVE_D }, | ||
| 438 | [TRANS_RDm] = { MOVE_L, MOVE_B, MOVE_D }, | ||
| 439 | [TRANS_RBr] = { MOVE_R, MOVE_U, MOVE_B }, | ||
| 440 | [TRANS_RBm] = { MOVE_L, MOVE_U, MOVE_B }, | ||
| 441 | [TRANS_LUr] = { MOVE_L, MOVE_B, MOVE_U }, | ||
| 442 | [TRANS_LUm] = { MOVE_R, MOVE_B, MOVE_U }, | ||
| 443 | [TRANS_LFr] = { MOVE_L, MOVE_U, MOVE_F }, | ||
| 444 | [TRANS_LFm] = { MOVE_R, MOVE_U, MOVE_F }, | ||
| 445 | [TRANS_LDr] = { MOVE_L, MOVE_F, MOVE_D }, | ||
| 446 | [TRANS_LDm] = { MOVE_R, MOVE_F, MOVE_D }, | ||
| 447 | [TRANS_LBr] = { MOVE_L, MOVE_D, MOVE_B }, | ||
| 448 | [TRANS_LBm] = { MOVE_R, MOVE_D, MOVE_B }, | ||
| 449 | [TRANS_FUr] = { MOVE_F, MOVE_L, MOVE_U }, | ||
| 450 | [TRANS_FUm] = { MOVE_F, MOVE_R, MOVE_U }, | ||
| 451 | [TRANS_FRr] = { MOVE_F, MOVE_U, MOVE_R }, | ||
| 452 | [TRANS_FRm] = { MOVE_F, MOVE_U, MOVE_L }, | ||
| 453 | [TRANS_FDr] = { MOVE_F, MOVE_R, MOVE_D }, | ||
| 454 | [TRANS_FDm] = { MOVE_F, MOVE_L, MOVE_D }, | ||
| 455 | [TRANS_FLr] = { MOVE_F, MOVE_D, MOVE_L }, | ||
| 456 | [TRANS_FLm] = { MOVE_F, MOVE_D, MOVE_R }, | ||
| 457 | [TRANS_BUr] = { MOVE_B, MOVE_R, MOVE_U }, | ||
| 458 | [TRANS_BUm] = { MOVE_B, MOVE_L, MOVE_U }, | ||
| 459 | [TRANS_BRr] = { MOVE_B, MOVE_D, MOVE_R }, | ||
| 460 | [TRANS_BRm] = { MOVE_B, MOVE_D, MOVE_L }, | ||
| 461 | [TRANS_BDr] = { MOVE_B, MOVE_L, MOVE_D }, | ||
| 462 | [TRANS_BDm] = { MOVE_B, MOVE_R, MOVE_D }, | ||
| 463 | [TRANS_BLr] = { MOVE_B, MOVE_U, MOVE_L }, | ||
| 464 | [TRANS_BLm] = { MOVE_B, MOVE_U, MOVE_R }, | ||
| 465 | }; | ||
