diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2024-08-18 14:26:45 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2024-08-18 14:26:45 +0200 |
| commit | 18c9a8b8905304cf5f8fc15825769046a3144866 (patch) | |
| tree | a7807bb32b0a5d9ded7d3cedccc598f64a9b00fe /src/core | |
| parent | f25a10e19eca294c4e6a99e4f80ce5cfd11a0e5f (diff) | |
| download | nissy-core-18c9a8b8905304cf5f8fc15825769046a3144866.tar.gz nissy-core-18c9a8b8905304cf5f8fc15825769046a3144866.zip | |
Reorganized folder structure
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/constant_cubes.h | 229 | ||||
| -rw-r--r-- | src/core/core.h | 13 | ||||
| -rw-r--r-- | src/core/cube.h | 291 | ||||
| -rw-r--r-- | src/core/io_cube.h | 348 | ||||
| -rw-r--r-- | src/core/io_moves.h | 62 | ||||
| -rw-r--r-- | src/core/io_trans.h | 25 | ||||
| -rw-r--r-- | src/core/moves.h | 47 | ||||
| -rw-r--r-- | src/core/transform.h | 176 | ||||
| -rw-r--r-- | src/core/transform_with_switch.h | 336 |
9 files changed, 1527 insertions, 0 deletions
diff --git a/src/core/constant_cubes.h b/src/core/constant_cubes.h new file mode 100644 index 0000000..b7748d8 --- /dev/null +++ b/src/core/constant_cubes.h | |||
| @@ -0,0 +1,229 @@ | |||
| 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/core.h b/src/core/core.h new file mode 100644 index 0000000..6ffd76f --- /dev/null +++ b/src/core/core.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #include "constant_cubes.h" | ||
| 2 | #include "io_moves.h" | ||
| 3 | #include "io_trans.h" | ||
| 4 | #include "cube.h" | ||
| 5 | #include "io_cube.h" | ||
| 6 | #include "moves.h" | ||
| 7 | |||
| 8 | /* TODO: work in progress */ | ||
| 9 | #if 0 | ||
| 10 | #include "transform.h" | ||
| 11 | #else | ||
| 12 | #include "transform_with_switch.h" | ||
| 13 | #endif | ||
diff --git a/src/core/cube.h b/src/core/cube.h new file mode 100644 index 0000000..fe36f90 --- /dev/null +++ b/src/core/cube.h | |||
| @@ -0,0 +1,291 @@ | |||
| 1 | #define _move(M, c) compose(c, _move_cube_ ## M) | ||
| 2 | #define _premove(M, c) compose(_move_cube_ ## M, c) | ||
| 3 | |||
| 4 | _static cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]); | ||
| 5 | _static cube_t solvedcube(void); | ||
| 6 | _static bool isconsistent(cube_t); | ||
| 7 | _static bool issolvable(cube_t); | ||
| 8 | _static bool issolved(cube_t); | ||
| 9 | _static bool iserror(cube_t); | ||
| 10 | _static cube_t applymoves(cube_t, const char *); | ||
| 11 | _static cube_t applytrans(cube_t, const char *); | ||
| 12 | _static cube_t frommoves(const char *); | ||
| 13 | _static void getcube_fix(int64_t *, int64_t *, int64_t *, int64_t *); | ||
| 14 | _static cube_t getcube(int64_t, int64_t, int64_t, int64_t); | ||
| 15 | |||
| 16 | _static cube_t move(cube_t, uint8_t); | ||
| 17 | _static cube_t transform_edges(cube_t, uint8_t); | ||
| 18 | _static cube_t transform_corners(cube_t, uint8_t); | ||
| 19 | _static cube_t transform(cube_t, uint8_t); | ||
| 20 | |||
| 21 | _static cube_t | ||
| 22 | cubefromarray(uint8_t c[static 8], uint8_t e[static 12]) | ||
| 23 | { | ||
| 24 | return static_cube( | ||
| 25 | c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], | ||
| 26 | e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], | ||
| 27 | e[8], e[9], e[10], e[11]); | ||
| 28 | } | ||
| 29 | |||
| 30 | _static cube_t | ||
| 31 | solvedcube(void) | ||
| 32 | { | ||
| 33 | return solved; | ||
| 34 | } | ||
| 35 | |||
| 36 | _static bool | ||
| 37 | isconsistent(cube_t cube) | ||
| 38 | { | ||
| 39 | uint8_t i, p, e, piece, corner[8], edge[12]; | ||
| 40 | bool found[12]; | ||
| 41 | |||
| 42 | pieces(&cube, corner, edge); | ||
| 43 | |||
| 44 | for (i = 0; i < 12; i++) | ||
| 45 | found[i] = false; | ||
| 46 | for (i = 0; i < 12; i++) { | ||
| 47 | piece = edge[i]; | ||
| 48 | p = piece & _pbits; | ||
| 49 | e = piece & _eobit; | ||
| 50 | if (p >= 12) | ||
| 51 | goto inconsistent_ep; | ||
| 52 | if (e != 0 && e != _eobit) | ||
| 53 | goto inconsistent_eo; | ||
| 54 | found[p] = true; | ||
| 55 | } | ||
| 56 | for (i = 0; i < 12; i++) | ||
| 57 | if (!found[i]) | ||
| 58 | goto inconsistent_ep; | ||
| 59 | |||
| 60 | for (i = 0; i < 8; i++) | ||
| 61 | found[i] = false; | ||
| 62 | for (i = 0; i < 8; i++) { | ||
| 63 | piece = corner[i]; | ||
| 64 | p = piece & _pbits; | ||
| 65 | e = piece & _cobits; | ||
| 66 | if (p >= 8) | ||
| 67 | goto inconsistent_cp; | ||
| 68 | if (e != 0 && e != _ctwist_cw && e != _ctwist_ccw) | ||
| 69 | goto inconsistent_co; | ||
| 70 | found[p] = true; | ||
| 71 | } | ||
| 72 | for (i = 0; i < 8; i++) | ||
| 73 | if (!found[i]) | ||
| 74 | goto inconsistent_co; | ||
| 75 | |||
| 76 | return true; | ||
| 77 | |||
| 78 | inconsistent_ep: | ||
| 79 | LOG("Inconsistent EP\n"); | ||
| 80 | return false; | ||
| 81 | inconsistent_cp: | ||
| 82 | LOG("Inconsistent CP\n"); | ||
| 83 | return false; | ||
| 84 | inconsistent_eo: | ||
| 85 | LOG("Inconsistent EO\n"); | ||
| 86 | return false; | ||
| 87 | inconsistent_co: | ||
| 88 | LOG("Inconsistent CO\n"); | ||
| 89 | return false; | ||
| 90 | } | ||
| 91 | |||
| 92 | _static bool | ||
| 93 | issolvable(cube_t cube) | ||
| 94 | { | ||
| 95 | uint8_t i, eo, co, piece, edge[12], corner[8], ep[12], cp[8]; | ||
| 96 | |||
| 97 | DBG_ASSERT(isconsistent(cube), false, | ||
| 98 | "issolvable: cube is inconsistent\n"); | ||
| 99 | |||
| 100 | pieces(&cube, corner, edge); | ||
| 101 | for (i = 0; i < 12; i++) | ||
| 102 | ep[i] = edge[i] & _pbits; | ||
| 103 | for (i = 0; i < 8; i++) | ||
| 104 | cp[i] = corner[i] & _pbits; | ||
| 105 | |||
| 106 | if (permsign(ep, 12) != permsign(cp, 8)) | ||
| 107 | goto issolvable_parity; | ||
| 108 | |||
| 109 | eo = 0; | ||
| 110 | for (i = 0; i < 12; i++) { | ||
| 111 | piece = edge[i]; | ||
| 112 | eo += (piece & _eobit) >> _eoshift; | ||
| 113 | } | ||
| 114 | if (eo % 2 != 0) | ||
| 115 | goto issolvable_eo; | ||
| 116 | |||
| 117 | co = 0; | ||
| 118 | for (i = 0; i < 8; i++) { | ||
| 119 | piece = corner[i]; | ||
| 120 | co += (piece & _cobits) >> _coshift; | ||
| 121 | } | ||
| 122 | if (co % 3 != 0) | ||
| 123 | goto issolvable_co; | ||
| 124 | |||
| 125 | return true; | ||
| 126 | |||
| 127 | issolvable_parity: | ||
| 128 | LOG("EP and CP parities are different\n"); | ||
| 129 | return false; | ||
| 130 | issolvable_eo: | ||
| 131 | LOG("Odd number of flipped edges\n"); | ||
| 132 | return false; | ||
| 133 | issolvable_co: | ||
| 134 | LOG("Sum of corner orientation is not multiple of 3\n"); | ||
| 135 | return false; | ||
| 136 | } | ||
| 137 | |||
| 138 | bool | ||
| 139 | issolved(cube_t cube) | ||
| 140 | { | ||
| 141 | return equal(cube, solved); | ||
| 142 | } | ||
| 143 | |||
| 144 | bool | ||
| 145 | iserror(cube_t cube) | ||
| 146 | { | ||
| 147 | return equal(cube, zero); | ||
| 148 | } | ||
| 149 | |||
| 150 | _static cube_t | ||
| 151 | applymoves(cube_t cube, const char *buf) | ||
| 152 | { | ||
| 153 | uint8_t r, m; | ||
| 154 | const char *b; | ||
| 155 | |||
| 156 | DBG_ASSERT(isconsistent(cube), zero, | ||
| 157 | "move error: inconsistent cube\n"); | ||
| 158 | |||
| 159 | for (b = buf; *b != '\0'; b++) { | ||
| 160 | while (*b == ' ' || *b == '\t' || *b == '\n') | ||
| 161 | b++; | ||
| 162 | if (*b == '\0') | ||
| 163 | goto applymoves_finish; | ||
| 164 | if ((r = readmove(*b)) == _error) | ||
| 165 | goto applymoves_error; | ||
| 166 | if ((m = readmodifier(*(b+1))) != 0) | ||
| 167 | b++; | ||
| 168 | cube = move(cube, r + m); | ||
| 169 | } | ||
| 170 | |||
| 171 | applymoves_finish: | ||
| 172 | return cube; | ||
| 173 | |||
| 174 | applymoves_error: | ||
| 175 | LOG("applymoves error\n"); | ||
| 176 | return zero; | ||
| 177 | } | ||
| 178 | |||
| 179 | _static cube_t | ||
| 180 | frommoves(const char *buf) | ||
| 181 | { | ||
| 182 | return applymoves(solved, buf); | ||
| 183 | } | ||
| 184 | |||
| 185 | _static void | ||
| 186 | getcube_fix(int64_t *ep, int64_t *eo, int64_t *cp, int64_t *co) | ||
| 187 | { | ||
| 188 | uint8_t e[12], c[8], coarr[8]; | ||
| 189 | |||
| 190 | *ep = (*ep % _12f + _12f) % _12f; | ||
| 191 | *eo = (*eo % _2p11 + _2p11) % _2p11; | ||
| 192 | *cp = (*cp % _8f + _8f) % _8f; | ||
| 193 | *co = (*cp % _3p7 + _3p7) % _3p7; | ||
| 194 | |||
| 195 | indextoperm(*ep, 12, e); | ||
| 196 | indextoperm(*cp, 8, c); | ||
| 197 | if (permsign(e, 12) != permsign(c, 8)) { | ||
| 198 | _swap(c[0], c[1]); | ||
| 199 | *cp = permtoindex(c, 8); | ||
| 200 | |||
| 201 | sumzerotodigits(*co, 8, 3, coarr); | ||
| 202 | _swap(coarr[0], coarr[1]); | ||
| 203 | *co = digitstosumzero(coarr, 8, 3); | ||
| 204 | } | ||
| 205 | } | ||
| 206 | |||
| 207 | _static cube_t | ||
| 208 | getcube(int64_t ep, int64_t eo, int64_t cp, int64_t co) | ||
| 209 | { | ||
| 210 | uint8_t i, earr[12], carr[8], eoarr[12], coarr[8]; | ||
| 211 | |||
| 212 | sumzerotodigits(eo, 12, 2, eoarr); | ||
| 213 | DBG_ASSERT(eoarr[0] != _error, zero, "Error making EO"); | ||
| 214 | indextoperm(ep, 12, earr); | ||
| 215 | DBG_ASSERT(earr[0] != _error, zero, "Error making EP"); | ||
| 216 | for (i = 0; i < 12; i++) | ||
| 217 | earr[i] |= eoarr[i] << _eoshift; | ||
| 218 | |||
| 219 | sumzerotodigits(co, 8, 3, coarr); | ||
| 220 | DBG_ASSERT(coarr[0] != _error, zero, "Error making CO"); | ||
| 221 | indextoperm(cp, 8, carr); | ||
| 222 | DBG_ASSERT(carr[0] != _error, zero, "Error making CP"); | ||
| 223 | for (i = 0; i < 8; i++) | ||
| 224 | carr[i] |= coarr[i] << _coshift; | ||
| 225 | |||
| 226 | return cubefromarray(carr, earr); | ||
| 227 | } | ||
| 228 | |||
| 229 | _static cube_t | ||
| 230 | applytrans(cube_t cube, const char *buf) | ||
| 231 | { | ||
| 232 | uint8_t t; | ||
| 233 | |||
| 234 | DBG_ASSERT(isconsistent(cube), zero, | ||
| 235 | "transformation error: inconsistent cube\n"); | ||
| 236 | |||
| 237 | t = readtrans(buf); | ||
| 238 | |||
| 239 | return transform(cube, t); | ||
| 240 | } | ||
| 241 | |||
| 242 | _static cube_t | ||
| 243 | move(cube_t c, uint8_t m) | ||
| 244 | { | ||
| 245 | switch (m) { | ||
| 246 | case _move_U: | ||
| 247 | return _move(U, c); | ||
| 248 | case _move_U2: | ||
| 249 | return _move(U2, c); | ||
| 250 | case _move_U3: | ||
| 251 | return _move(U3, c); | ||
| 252 | case _move_D: | ||
| 253 | return _move(D, c); | ||
| 254 | case _move_D2: | ||
| 255 | return _move(D2, c); | ||
| 256 | case _move_D3: | ||
| 257 | return _move(D3, c); | ||
| 258 | case _move_R: | ||
| 259 | return _move(R, c); | ||
| 260 | case _move_R2: | ||
| 261 | return _move(R2, c); | ||
| 262 | case _move_R3: | ||
| 263 | return _move(R3, c); | ||
| 264 | case _move_L: | ||
| 265 | return _move(L, c); | ||
| 266 | case _move_L2: | ||
| 267 | return _move(L2, c); | ||
| 268 | case _move_L3: | ||
| 269 | return _move(L3, c); | ||
| 270 | case _move_F: | ||
| 271 | return _move(F, c); | ||
| 272 | case _move_F2: | ||
| 273 | return _move(F2, c); | ||
| 274 | case _move_F3: | ||
| 275 | return _move(F3, c); | ||
| 276 | case _move_B: | ||
| 277 | return _move(B, c); | ||
| 278 | case _move_B2: | ||
| 279 | return _move(B2, c); | ||
| 280 | case _move_B3: | ||
| 281 | return _move(B3, c); | ||
| 282 | default: | ||
| 283 | LOG("move error, unknown move\n"); | ||
| 284 | return zero; | ||
| 285 | } | ||
| 286 | } | ||
| 287 | |||
| 288 | /* | ||
| 289 | TODO transform is now relegated to a separated file because it is too long. | ||
| 290 | It would be nice to make it shorter without loosing performance. | ||
| 291 | */ | ||
diff --git a/src/core/io_cube.h b/src/core/io_cube.h new file mode 100644 index 0000000..956494d --- /dev/null +++ b/src/core/io_cube.h | |||
| @@ -0,0 +1,348 @@ | |||
| 1 | _static uint8_t readco(const char *); | ||
| 2 | _static uint8_t readcp(const char *); | ||
| 3 | _static uint8_t readeo(const char *); | ||
| 4 | _static uint8_t readep(const char *); | ||
| 5 | _static cube_t readcube_B32(const char *); | ||
| 6 | _static cube_t readcube_H48(const char *); | ||
| 7 | _static uint8_t readpiece_LST(const char **); | ||
| 8 | _static cube_t readcube_LST(const char *); | ||
| 9 | |||
| 10 | _static int writepiece_LST(uint8_t, char *); | ||
| 11 | _static void writecube_B32(cube_t, char *); | ||
| 12 | _static void writecube_H48(cube_t, char *); | ||
| 13 | _static void writecube_LST(cube_t, char *); | ||
| 14 | |||
| 15 | _static uint8_t b32toedge(char); | ||
| 16 | _static uint8_t b32tocorner(char); | ||
| 17 | _static char edgetob32(uint8_t); | ||
| 18 | _static char cornertob32(uint8_t); | ||
| 19 | |||
| 20 | _static struct { | ||
| 21 | const char *name; | ||
| 22 | cube_t (*read)(const char *); | ||
| 23 | void (*write)(cube_t, char *); | ||
| 24 | } ioformat[] = | ||
| 25 | { | ||
| 26 | { .name = "B32", .read = readcube_B32, .write = writecube_B32 }, | ||
| 27 | { .name = "LST", .read = readcube_LST, .write = writecube_LST }, | ||
| 28 | { .name = "H48", .read = readcube_H48, .write = writecube_H48 }, | ||
| 29 | { .name = "NONE", .read = NULL, .write = NULL }, | ||
| 30 | }; | ||
| 31 | |||
| 32 | cube_t | ||
| 33 | readcube(const char *format, const char *buf) | ||
| 34 | { | ||
| 35 | int i; | ||
| 36 | |||
| 37 | for (i = 0; ioformat[i].read != NULL; i++) | ||
| 38 | if (!strcmp(format, ioformat[i].name)) | ||
| 39 | return ioformat[i].read(buf); | ||
| 40 | |||
| 41 | LOG("Cannot read cube in the given format\n"); | ||
| 42 | return zero; | ||
| 43 | } | ||
| 44 | |||
| 45 | void | ||
| 46 | writecube(const char *format, cube_t cube, char *buf) | ||
| 47 | { | ||
| 48 | char *errormsg; | ||
| 49 | size_t len; | ||
| 50 | |||
| 51 | if (!isconsistent(cube)) { | ||
| 52 | errormsg = "ERROR: inconsistent"; | ||
| 53 | goto writecube_error; | ||
| 54 | } | ||
| 55 | |||
| 56 | int i; | ||
| 57 | |||
| 58 | for (i = 0; ioformat[i].write != NULL; i++) { | ||
| 59 | if (!strcmp(format, ioformat[i].name)) { | ||
| 60 | ioformat[i].write(cube, buf); | ||
| 61 | return; | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | errormsg = "ERROR: format"; | ||
| 66 | |||
| 67 | writecube_error: | ||
| 68 | LOG("writecube error, see stdout for details\n"); | ||
| 69 | len = strlen(errormsg); | ||
| 70 | memcpy(buf, errormsg, len); | ||
| 71 | buf[len] = '\n'; | ||
| 72 | buf[len+1] = '\0'; | ||
| 73 | } | ||
| 74 | |||
| 75 | _static uint8_t | ||
| 76 | readco(const char *str) | ||
| 77 | { | ||
| 78 | if (*str == '0') | ||
| 79 | return 0; | ||
| 80 | if (*str == '1') | ||
| 81 | return _ctwist_cw; | ||
| 82 | if (*str == '2') | ||
| 83 | return _ctwist_ccw; | ||
| 84 | |||
| 85 | LOG("Error reading CO\n"); | ||
| 86 | return _error; | ||
| 87 | } | ||
| 88 | |||
| 89 | _static uint8_t | ||
| 90 | readcp(const char *str) | ||
| 91 | { | ||
| 92 | uint8_t c; | ||
| 93 | |||
| 94 | for (c = 0; c < 8; c++) | ||
| 95 | if (!strncmp(str, cornerstr[c], 3) || | ||
| 96 | !strncmp(str, cornerstralt[c], 3)) | ||
| 97 | return c; | ||
| 98 | |||
| 99 | LOG("Error reading CP\n"); | ||
| 100 | return _error; | ||
| 101 | } | ||
| 102 | |||
| 103 | _static uint8_t | ||
| 104 | readeo(const char *str) | ||
| 105 | { | ||
| 106 | if (*str == '0') | ||
| 107 | return 0; | ||
| 108 | if (*str == '1') | ||
| 109 | return _eflip; | ||
| 110 | |||
| 111 | LOG("Error reading EO\n"); | ||
| 112 | return _error; | ||
| 113 | } | ||
| 114 | |||
| 115 | _static uint8_t | ||
| 116 | readep(const char *str) | ||
| 117 | { | ||
| 118 | uint8_t e; | ||
| 119 | |||
| 120 | for (e = 0; e < 12; e++) | ||
| 121 | if (!strncmp(str, edgestr[e], 2)) | ||
| 122 | return e; | ||
| 123 | |||
| 124 | LOG("Error reading EP\n"); | ||
| 125 | return _error; | ||
| 126 | } | ||
| 127 | |||
| 128 | _static cube_t | ||
| 129 | readcube_B32(const char *buf) | ||
| 130 | { | ||
| 131 | int i; | ||
| 132 | uint8_t c[8], e[12]; | ||
| 133 | |||
| 134 | for (i = 0; i < 8; i++) { | ||
| 135 | c[i] = b32tocorner(buf[i]); | ||
| 136 | DBG_ASSERT(c[i] < 255, zero, | ||
| 137 | "Error reading B32 corner %d (char %d)\n", i, i); | ||
| 138 | } | ||
| 139 | |||
| 140 | for (i = 0; i < 12; i++) { | ||
| 141 | e[i] = b32toedge(buf[i+9]); | ||
| 142 | DBG_ASSERT(e[i] < 255, zero, | ||
| 143 | "Error reading B32 edge %d (char %d)\n", i, i+9); | ||
| 144 | } | ||
| 145 | |||
| 146 | return cubefromarray(c, e); | ||
| 147 | } | ||
| 148 | |||
| 149 | _static cube_t | ||
| 150 | readcube_H48(const char *buf) | ||
| 151 | { | ||
| 152 | int i; | ||
| 153 | uint8_t piece, orient, c[8], e[12]; | ||
| 154 | const char *b; | ||
| 155 | |||
| 156 | b = buf; | ||
| 157 | |||
| 158 | for (i = 0; i < 12; i++) { | ||
| 159 | while (*b == ' ' || *b == '\t' || *b == '\n') | ||
| 160 | b++; | ||
| 161 | if ((piece = readep(b)) == _error) | ||
| 162 | return zero; | ||
| 163 | b += 2; | ||
| 164 | if ((orient = readeo(b)) == _error) | ||
| 165 | return zero; | ||
| 166 | b++; | ||
| 167 | e[i] = piece | orient; | ||
| 168 | } | ||
| 169 | for (i = 0; i < 8; i++) { | ||
| 170 | while (*b == ' ' || *b == '\t' || *b == '\n') | ||
| 171 | b++; | ||
| 172 | if ((piece = readcp(b)) == _error) | ||
| 173 | return zero; | ||
| 174 | b += 3; | ||
| 175 | if ((orient = readco(b)) == _error) | ||
| 176 | return zero; | ||
| 177 | b++; | ||
| 178 | c[i] = piece | orient; | ||
| 179 | } | ||
| 180 | |||
| 181 | return cubefromarray(c, e); | ||
| 182 | } | ||
| 183 | |||
| 184 | _static uint8_t | ||
| 185 | readpiece_LST(const char **b) | ||
| 186 | { | ||
| 187 | uint8_t ret; | ||
| 188 | bool read; | ||
| 189 | |||
| 190 | while (**b == ',' || **b == ' ' || **b == '\t' || **b == '\n') | ||
| 191 | (*b)++; | ||
| 192 | |||
| 193 | for (ret = 0, read = false; **b >= '0' && **b <= '9'; (*b)++) { | ||
| 194 | read = true; | ||
| 195 | ret = ret * 10 + (**b) - '0'; | ||
| 196 | } | ||
| 197 | |||
| 198 | return read ? ret : _error; | ||
| 199 | } | ||
| 200 | |||
| 201 | _static cube_t | ||
| 202 | readcube_LST(const char *buf) | ||
| 203 | { | ||
| 204 | int i; | ||
| 205 | uint8_t c[8], e[12]; | ||
| 206 | |||
| 207 | for (i = 0; i < 8; i++) | ||
| 208 | c[i] = readpiece_LST(&buf); | ||
| 209 | |||
| 210 | for (i = 0; i < 12; i++) | ||
| 211 | e[i] = readpiece_LST(&buf); | ||
| 212 | |||
| 213 | return cubefromarray(c, e); | ||
| 214 | } | ||
| 215 | |||
| 216 | _static int | ||
| 217 | writepiece_LST(uint8_t piece, char *buf) | ||
| 218 | { | ||
| 219 | char digits[3]; | ||
| 220 | int i, len; | ||
| 221 | |||
| 222 | len = 0; | ||
| 223 | while (piece != 0) { | ||
| 224 | digits[len++] = (piece % 10) + '0'; | ||
| 225 | piece /= 10; | ||
| 226 | } | ||
| 227 | |||
| 228 | if (len == 0) | ||
| 229 | digits[len++] = '0'; | ||
| 230 | |||
| 231 | for (i = 0; i < len; i++) | ||
| 232 | buf[i] = digits[len-i-1]; | ||
| 233 | |||
| 234 | buf[len] = ','; | ||
| 235 | buf[len+1] = ' '; | ||
| 236 | |||
| 237 | return len+2; | ||
| 238 | } | ||
| 239 | |||
| 240 | _static void | ||
| 241 | writecube_B32(cube_t cube, char *buf) | ||
| 242 | { | ||
| 243 | int i; | ||
| 244 | uint8_t corner[8], edge[12]; | ||
| 245 | |||
| 246 | pieces(&cube, corner, edge); | ||
| 247 | |||
| 248 | for (i = 0; i < 8; i++) | ||
| 249 | buf[i] = cornertob32(corner[i]); | ||
| 250 | |||
| 251 | buf[8] = '='; | ||
| 252 | |||
| 253 | for (i = 0; i < 12; i++) | ||
| 254 | buf[i+9] = edgetob32(edge[i]); | ||
| 255 | |||
| 256 | buf[21] = '\0'; | ||
| 257 | } | ||
| 258 | |||
| 259 | _static void | ||
| 260 | writecube_H48(cube_t cube, char *buf) | ||
| 261 | { | ||
| 262 | uint8_t piece, perm, orient, corner[8], edge[12]; | ||
| 263 | int i; | ||
| 264 | |||
| 265 | pieces(&cube, corner, edge); | ||
| 266 | |||
| 267 | for (i = 0; i < 12; i++) { | ||
| 268 | piece = edge[i]; | ||
| 269 | perm = piece & _pbits; | ||
| 270 | orient = (piece & _eobit) >> _eoshift; | ||
| 271 | buf[4*i ] = edgestr[perm][0]; | ||
| 272 | buf[4*i + 1] = edgestr[perm][1]; | ||
| 273 | buf[4*i + 2] = orient + '0'; | ||
| 274 | buf[4*i + 3] = ' '; | ||
| 275 | } | ||
| 276 | for (i = 0; i < 8; i++) { | ||
| 277 | piece = corner[i]; | ||
| 278 | perm = piece & _pbits; | ||
| 279 | orient = (piece & _cobits) >> _coshift; | ||
| 280 | buf[48 + 5*i ] = cornerstr[perm][0]; | ||
| 281 | buf[48 + 5*i + 1] = cornerstr[perm][1]; | ||
| 282 | buf[48 + 5*i + 2] = cornerstr[perm][2]; | ||
| 283 | buf[48 + 5*i + 3] = orient + '0'; | ||
| 284 | buf[48 + 5*i + 4] = ' '; | ||
| 285 | } | ||
| 286 | |||
| 287 | buf[48+39] = '\0'; | ||
| 288 | } | ||
| 289 | |||
| 290 | _static void | ||
| 291 | writecube_LST(cube_t cube, char *buf) | ||
| 292 | { | ||
| 293 | int i; | ||
| 294 | size_t ptr; | ||
| 295 | uint8_t piece, corner[8], edge[12]; | ||
| 296 | |||
| 297 | ptr = 0; | ||
| 298 | pieces(&cube, corner, edge); | ||
| 299 | |||
| 300 | for (i = 0; i < 8; i++) { | ||
| 301 | piece = corner[i]; | ||
| 302 | ptr += writepiece_LST(piece, buf + ptr); | ||
| 303 | } | ||
| 304 | |||
| 305 | for (i = 0; i < 12; i++) { | ||
| 306 | piece = edge[i]; | ||
| 307 | ptr += writepiece_LST(piece, buf + ptr); | ||
| 308 | } | ||
| 309 | |||
| 310 | *(buf+ptr-2) = 0; | ||
| 311 | } | ||
| 312 | |||
| 313 | _static uint8_t | ||
| 314 | b32toedge(char c) | ||
| 315 | { | ||
| 316 | if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'f'))) | ||
| 317 | return 255; | ||
| 318 | |||
| 319 | return c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26; | ||
| 320 | } | ||
| 321 | |||
| 322 | _static uint8_t | ||
| 323 | b32tocorner(char c) { | ||
| 324 | uint8_t val; | ||
| 325 | |||
| 326 | if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'f'))) | ||
| 327 | return 255; | ||
| 328 | |||
| 329 | val = c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26; | ||
| 330 | |||
| 331 | return (val & 7) | ((val & 24) << 2); | ||
| 332 | } | ||
| 333 | |||
| 334 | _static char | ||
| 335 | edgetob32(uint8_t edge) | ||
| 336 | { | ||
| 337 | return edge < 26 ? 'A' + (char)edge : 'a' + (char)(edge - 26); | ||
| 338 | } | ||
| 339 | |||
| 340 | _static char | ||
| 341 | cornertob32(uint8_t corner) | ||
| 342 | { | ||
| 343 | uint8_t val; | ||
| 344 | |||
| 345 | val = (corner & 7) | ((corner & 96) >> 2); | ||
| 346 | |||
| 347 | return val < 26 ? 'A' + (char)val : 'a' + (char)(val - 26); | ||
| 348 | } | ||
diff --git a/src/core/io_moves.h b/src/core/io_moves.h new file mode 100644 index 0000000..eb6290e --- /dev/null +++ b/src/core/io_moves.h | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | _static uint8_t readmove(char); | ||
| 2 | _static uint8_t readmodifier(char); | ||
| 3 | _static int writemoves(uint8_t *, int, char *); | ||
| 4 | |||
| 5 | _static uint8_t | ||
| 6 | readmove(char c) | ||
| 7 | { | ||
| 8 | switch (c) { | ||
| 9 | case 'U': | ||
| 10 | return _move_U; | ||
| 11 | case 'D': | ||
| 12 | return _move_D; | ||
| 13 | case 'R': | ||
| 14 | return _move_R; | ||
| 15 | case 'L': | ||
| 16 | return _move_L; | ||
| 17 | case 'F': | ||
| 18 | return _move_F; | ||
| 19 | case 'B': | ||
| 20 | return _move_B; | ||
| 21 | default: | ||
| 22 | return _error; | ||
| 23 | } | ||
| 24 | } | ||
| 25 | |||
| 26 | _static uint8_t | ||
| 27 | readmodifier(char c) | ||
| 28 | { | ||
| 29 | switch (c) { | ||
| 30 | case '1': /* Fallthrough */ | ||
| 31 | case '2': /* Fallthrough */ | ||
| 32 | case '3': | ||
| 33 | return c - '0' - 1; | ||
| 34 | case '\'': | ||
| 35 | return 2; | ||
| 36 | default: | ||
| 37 | return 0; | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | _static int | ||
| 42 | writemoves(uint8_t *m, int n, char *buf) | ||
| 43 | { | ||
| 44 | int i; | ||
| 45 | size_t len; | ||
| 46 | const char *s; | ||
| 47 | char *b; | ||
| 48 | |||
| 49 | for (i = 0, b = buf; i < n; i++, b++) { | ||
| 50 | s = movestr[m[i]]; | ||
| 51 | len = strlen(s); | ||
| 52 | memcpy(b, s, len); | ||
| 53 | b += len; | ||
| 54 | *b = ' '; | ||
| 55 | } | ||
| 56 | |||
| 57 | if (b != buf) | ||
| 58 | b--; /* Remove last space */ | ||
| 59 | *b = '\0'; | ||
| 60 | |||
| 61 | return b - buf; | ||
| 62 | } | ||
diff --git a/src/core/io_trans.h b/src/core/io_trans.h new file mode 100644 index 0000000..7187b7a --- /dev/null +++ b/src/core/io_trans.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | _static uint8_t readtrans(const char *); | ||
| 2 | _static void writetrans(uint8_t, char *); | ||
| 3 | |||
| 4 | _static uint8_t | ||
| 5 | readtrans(const char *buf) | ||
| 6 | { | ||
| 7 | uint8_t t; | ||
| 8 | |||
| 9 | for (t = 0; t < 48; t++) | ||
| 10 | if (!strncmp(buf, transstr[t], 11)) | ||
| 11 | return t; | ||
| 12 | |||
| 13 | LOG("readtrans error\n"); | ||
| 14 | return _error; | ||
| 15 | } | ||
| 16 | |||
| 17 | _static void | ||
| 18 | writetrans(uint8_t t, char *buf) | ||
| 19 | { | ||
| 20 | if (t >= 48) | ||
| 21 | memcpy(buf, "error trans", 11); | ||
| 22 | else | ||
| 23 | memcpy(buf, transstr[t], 11); | ||
| 24 | buf[11] = '\0'; | ||
| 25 | } | ||
diff --git a/src/core/moves.h b/src/core/moves.h new file mode 100644 index 0000000..7da6405 --- /dev/null +++ b/src/core/moves.h | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | _static_inline bool allowednextmove(uint8_t *, uint8_t); | ||
| 2 | _static_inline uint8_t inverse_trans(uint8_t); | ||
| 3 | _static_inline uint8_t movebase(uint8_t); | ||
| 4 | _static_inline uint8_t moveaxis(uint8_t); | ||
| 5 | |||
| 6 | _static bool | ||
| 7 | allowednextmove(uint8_t *moves, uint8_t n) | ||
| 8 | { | ||
| 9 | uint8_t base[3], axis[3]; | ||
| 10 | |||
| 11 | if (n < 2) | ||
| 12 | return true; | ||
| 13 | |||
| 14 | base[0] = movebase(moves[n-1]); | ||
| 15 | axis[0] = moveaxis(moves[n-1]); | ||
| 16 | base[1] = movebase(moves[n-2]); | ||
| 17 | axis[1] = moveaxis(moves[n-2]); | ||
| 18 | |||
| 19 | if (base[0] == base[1] || (axis[0] == axis[1] && base[0] < base[1])) | ||
| 20 | return false; | ||
| 21 | |||
| 22 | if (n == 2) | ||
| 23 | return true; | ||
| 24 | |||
| 25 | base[2] = movebase(moves[n-3]); | ||
| 26 | axis[2] = moveaxis(moves[n-3]); | ||
| 27 | |||
| 28 | return axis[1] != axis[2] || base[0] != base[2]; | ||
| 29 | } | ||
| 30 | |||
| 31 | _static_inline uint8_t | ||
| 32 | inverse_trans(uint8_t t) | ||
| 33 | { | ||
| 34 | return inverse_trans_table[t]; | ||
| 35 | } | ||
| 36 | |||
| 37 | _static_inline uint8_t | ||
| 38 | movebase(uint8_t move) | ||
| 39 | { | ||
| 40 | return move / 3; | ||
| 41 | } | ||
| 42 | |||
| 43 | _static_inline uint8_t | ||
| 44 | moveaxis(uint8_t move) | ||
| 45 | { | ||
| 46 | return move / 6; | ||
| 47 | } | ||
diff --git a/src/core/transform.h b/src/core/transform.h new file mode 100644 index 0000000..358b051 --- /dev/null +++ b/src/core/transform.h | |||
| @@ -0,0 +1,176 @@ | |||
| 1 | /* TODO: remove these macros, if the below works */ | ||
| 2 | |||
| 3 | #define _trans_edges_rotation(T, c) \ | ||
| 4 | compose_edges(compose_edges(_trans_cube_ ## T, c), \ | ||
| 5 | _trans_cube_ ## T ## _inverse) | ||
| 6 | #define _trans_edges_mirrored(T, c) _trans_edges_rotation(T, c) | ||
| 7 | |||
| 8 | #define _trans_corners_rotation(T, c) \ | ||
| 9 | compose_corners(compose_corners(_trans_cube_ ## T, c), \ | ||
| 10 | _trans_cube_ ## T ## _inverse) | ||
| 11 | #define _trans_corners_mirrored(T, c) \ | ||
| 12 | invertco(compose_corners( \ | ||
| 13 | compose_corners(_trans_cube_ ## T, c), _trans_cube_ ## T ## _inverse)) | ||
| 14 | |||
| 15 | #define _trans_rotation(T, c) \ | ||
| 16 | compose(compose(_trans_cube_ ## T, c), \ | ||
| 17 | _trans_cube_ ## T ## _inverse) | ||
| 18 | #define _trans_mirrored(T, c) \ | ||
| 19 | invertco(compose(compose(_trans_cube_ ## T, c), \ | ||
| 20 | _trans_cube_ ## T ## _inverse)) | ||
| 21 | |||
| 22 | static cube_t cube_trans_table[48] = { | ||
| 23 | [_trans_UFr] = _trans_cube_UFr, | ||
| 24 | [_trans_UFm] = _trans_cube_UFm, | ||
| 25 | [_trans_ULr] = _trans_cube_URr, | ||
| 26 | [_trans_ULm] = _trans_cube_ULm, | ||
| 27 | [_trans_UBr] = _trans_cube_UBr, | ||
| 28 | [_trans_UBm] = _trans_cube_UBm, | ||
| 29 | [_trans_URr] = _trans_cube_ULr, | ||
| 30 | [_trans_URm] = _trans_cube_URm, | ||
| 31 | [_trans_DFr] = _trans_cube_DFr, | ||
| 32 | [_trans_DFm] = _trans_cube_DFm, | ||
| 33 | [_trans_DLr] = _trans_cube_DLr, | ||
| 34 | [_trans_DLm] = _trans_cube_DRm, | ||
| 35 | [_trans_DBr] = _trans_cube_DBr, | ||
| 36 | [_trans_DBm] = _trans_cube_DBm, | ||
| 37 | [_trans_DRr] = _trans_cube_DRr, | ||
| 38 | [_trans_DRm] = _trans_cube_DLm, | ||
| 39 | [_trans_RUr] = _trans_cube_FRr, | ||
| 40 | [_trans_RUm] = _trans_cube_FLm, | ||
| 41 | [_trans_RFr] = _trans_cube_LFr, | ||
| 42 | [_trans_RFm] = _trans_cube_RFm, | ||
| 43 | [_trans_RDr] = _trans_cube_BLr, | ||
| 44 | [_trans_RDm] = _trans_cube_BRm, | ||
| 45 | [_trans_RBr] = _trans_cube_RBr, | ||
| 46 | [_trans_RBm] = _trans_cube_LBm, | ||
| 47 | [_trans_LUr] = _trans_cube_FLr, | ||
| 48 | [_trans_LUm] = _trans_cube_FRm, | ||
| 49 | [_trans_LFr] = _trans_cube_RFr, | ||
| 50 | [_trans_LFm] = _trans_cube_LFm, | ||
| 51 | [_trans_LDr] = _trans_cube_BRr, | ||
| 52 | [_trans_LDm] = _trans_cube_BLm, | ||
| 53 | [_trans_LBr] = _trans_cube_LBr, | ||
| 54 | [_trans_LBm] = _trans_cube_RBm, | ||
| 55 | [_trans_FUr] = _trans_cube_FUr, | ||
| 56 | [_trans_FUm] = _trans_cube_FUm, | ||
| 57 | [_trans_FRr] = _trans_cube_RUr, | ||
| 58 | [_trans_FRm] = _trans_cube_LUm, | ||
| 59 | [_trans_FDr] = _trans_cube_BUr, | ||
| 60 | [_trans_FDm] = _trans_cube_BUm, | ||
| 61 | [_trans_FLr] = _trans_cube_LUr, | ||
| 62 | [_trans_FLm] = _trans_cube_RUm, | ||
| 63 | [_trans_BUr] = _trans_cube_FDr, | ||
| 64 | [_trans_BUm] = _trans_cube_FDm, | ||
| 65 | [_trans_BRr] = _trans_cube_LDr, | ||
| 66 | [_trans_BRm] = _trans_cube_RDm, | ||
| 67 | [_trans_BDr] = _trans_cube_BDr, | ||
| 68 | [_trans_BDm] = _trans_cube_BDm, | ||
| 69 | [_trans_BLr] = _trans_cube_RDr, | ||
| 70 | [_trans_BLm] = _trans_cube_LDm, | ||
| 71 | }; | ||
| 72 | |||
| 73 | static cube_t cube_trans_table_inverse[48] = { | ||
| 74 | [_trans_UFr] = _trans_cube_UFr_inverse, | ||
| 75 | [_trans_UFm] = _trans_cube_UFm_inverse, | ||
| 76 | [_trans_ULr] = _trans_cube_URr_inverse, | ||
| 77 | [_trans_ULm] = _trans_cube_ULm_inverse, | ||
| 78 | [_trans_UBr] = _trans_cube_UBr_inverse, | ||
| 79 | [_trans_UBm] = _trans_cube_UBm_inverse, | ||
| 80 | [_trans_URr] = _trans_cube_ULr_inverse, | ||
| 81 | [_trans_URm] = _trans_cube_URm_inverse, | ||
| 82 | [_trans_DFr] = _trans_cube_DFr_inverse, | ||
| 83 | [_trans_DFm] = _trans_cube_DFm_inverse, | ||
| 84 | [_trans_DLr] = _trans_cube_DLr_inverse, | ||
| 85 | [_trans_DLm] = _trans_cube_DRm_inverse, | ||
| 86 | [_trans_DBr] = _trans_cube_DBr_inverse, | ||
| 87 | [_trans_DBm] = _trans_cube_DBm_inverse, | ||
| 88 | [_trans_DRr] = _trans_cube_DRr_inverse, | ||
| 89 | [_trans_DRm] = _trans_cube_DLm_inverse, | ||
| 90 | [_trans_RUr] = _trans_cube_FRr_inverse, | ||
| 91 | [_trans_RUm] = _trans_cube_FLm_inverse, | ||
| 92 | [_trans_RFr] = _trans_cube_LFr_inverse, | ||
| 93 | [_trans_RFm] = _trans_cube_RFm_inverse, | ||
| 94 | [_trans_RDr] = _trans_cube_BLr_inverse, | ||
| 95 | [_trans_RDm] = _trans_cube_BRm_inverse, | ||
| 96 | [_trans_RBr] = _trans_cube_RBr_inverse, | ||
| 97 | [_trans_RBm] = _trans_cube_LBm_inverse, | ||
| 98 | [_trans_LUr] = _trans_cube_FLr_inverse, | ||
| 99 | [_trans_LUm] = _trans_cube_FRm_inverse, | ||
| 100 | [_trans_LFr] = _trans_cube_RFr_inverse, | ||
| 101 | [_trans_LFm] = _trans_cube_LFm_inverse, | ||
| 102 | [_trans_LDr] = _trans_cube_BRr_inverse, | ||
| 103 | [_trans_LDm] = _trans_cube_BLm_inverse, | ||
| 104 | [_trans_LBr] = _trans_cube_LBr_inverse, | ||
| 105 | [_trans_LBm] = _trans_cube_RBm_inverse, | ||
| 106 | [_trans_FUr] = _trans_cube_FUr_inverse, | ||
| 107 | [_trans_FUm] = _trans_cube_FUm_inverse, | ||
| 108 | [_trans_FRr] = _trans_cube_RUr_inverse, | ||
| 109 | [_trans_FRm] = _trans_cube_LUm_inverse, | ||
| 110 | [_trans_FDr] = _trans_cube_BUr_inverse, | ||
| 111 | [_trans_FDm] = _trans_cube_BUm_inverse, | ||
| 112 | [_trans_FLr] = _trans_cube_LUr_inverse, | ||
| 113 | [_trans_FLm] = _trans_cube_RUm_inverse, | ||
| 114 | [_trans_BUr] = _trans_cube_FDr_inverse, | ||
| 115 | [_trans_BUm] = _trans_cube_FDm_inverse, | ||
| 116 | [_trans_BRr] = _trans_cube_LDr_inverse, | ||
| 117 | [_trans_BRm] = _trans_cube_RDm_inverse, | ||
| 118 | [_trans_BDr] = _trans_cube_BDr_inverse, | ||
| 119 | [_trans_BDm] = _trans_cube_BDm_inverse, | ||
| 120 | [_trans_BLr] = _trans_cube_RDr_inverse, | ||
| 121 | [_trans_BLm] = _trans_cube_LDm_inverse, | ||
| 122 | }; | ||
| 123 | |||
| 124 | _static cube_t | ||
| 125 | transform_edges(cube_t c, uint8_t t) | ||
| 126 | { | ||
| 127 | cube_t ret, trans_cube, trans_inv; | ||
| 128 | |||
| 129 | DBG_ASSERT(t < 48, zero, | ||
| 130 | "transform: invalid transformation %" PRIu8 | ||
| 131 | ", must be between 0 and 47\n", t); | ||
| 132 | |||
| 133 | trans_cube = cube_trans_table[t]; | ||
| 134 | trans_inv = cube_trans_table_inverse[t]; | ||
| 135 | |||
| 136 | ret = compose_edges(trans_cube, c); | ||
| 137 | ret = compose_edges(ret, trans_inv); | ||
| 138 | |||
| 139 | return ret; | ||
| 140 | } | ||
| 141 | |||
| 142 | _static cube_t | ||
| 143 | transform_corners(cube_t c, uint8_t t) | ||
| 144 | { | ||
| 145 | cube_t ret, trans_cube, trans_inv; | ||
| 146 | |||
| 147 | DBG_ASSERT(t < 48, zero, | ||
| 148 | "transform: invalid transformation %" PRIu8 | ||
| 149 | ", must be between 0 and 47\n", t); | ||
| 150 | |||
| 151 | trans_cube = cube_trans_table[t]; | ||
| 152 | trans_inv = cube_trans_table_inverse[t]; | ||
| 153 | |||
| 154 | ret = compose_corners(trans_cube, c); | ||
| 155 | ret = compose_corners(ret, trans_inv); | ||
| 156 | |||
| 157 | return t < 24 ? ret : invertco(ret); | ||
| 158 | } | ||
| 159 | |||
| 160 | _static cube_t | ||
| 161 | transform(cube_t c, uint8_t t) | ||
| 162 | { | ||
| 163 | cube_t ret, trans_cube, trans_inv; | ||
| 164 | |||
| 165 | DBG_ASSERT(t < 48, zero, | ||
| 166 | "transform: invalid transformation %" PRIu8 | ||
| 167 | ", must be between 0 and 47\n", t); | ||
| 168 | |||
| 169 | trans_cube = cube_trans_table[t]; | ||
| 170 | trans_inv = cube_trans_table_inverse[t]; | ||
| 171 | |||
| 172 | ret = compose(trans_cube, c); | ||
| 173 | ret = compose(ret, trans_inv); | ||
| 174 | |||
| 175 | return t < 24 ? ret : invertco(ret); | ||
| 176 | } | ||
diff --git a/src/core/transform_with_switch.h b/src/core/transform_with_switch.h new file mode 100644 index 0000000..d3a108c --- /dev/null +++ b/src/core/transform_with_switch.h | |||
| @@ -0,0 +1,336 @@ | |||
| 1 | #define _trans_edges_rotation(T, c) \ | ||
| 2 | compose_edges(compose_edges(_trans_cube_ ## T, c), \ | ||
| 3 | _trans_cube_ ## T ## _inverse) | ||
| 4 | #define _trans_edges_mirrored(T, c) _trans_edges_rotation(T, c) | ||
| 5 | |||
| 6 | #define _trans_corners_rotation(T, c) \ | ||
| 7 | compose_corners(compose_corners(_trans_cube_ ## T, c), \ | ||
| 8 | _trans_cube_ ## T ## _inverse) | ||
| 9 | #define _trans_corners_mirrored(T, c) \ | ||
| 10 | invertco(compose_corners( \ | ||
| 11 | compose_corners(_trans_cube_ ## T, c), _trans_cube_ ## T ## _inverse)) | ||
| 12 | |||
| 13 | #define _trans_rotation(T, c) \ | ||
| 14 | compose(compose(_trans_cube_ ## T, c), \ | ||
| 15 | _trans_cube_ ## T ## _inverse) | ||
| 16 | #define _trans_mirrored(T, c) \ | ||
| 17 | invertco(compose(compose(_trans_cube_ ## T, c), \ | ||
| 18 | _trans_cube_ ## T ## _inverse)) | ||
| 19 | |||
| 20 | _static cube_t | ||
| 21 | transform_edges(cube_t c, uint8_t t) | ||
| 22 | { | ||
| 23 | switch (t) { | ||
| 24 | case _trans_UFr: | ||
| 25 | return c; | ||
| 26 | case _trans_ULr: | ||
| 27 | return _trans_edges_rotation(ULr, c); | ||
| 28 | case _trans_UBr: | ||
| 29 | return _trans_edges_rotation(UBr, c); | ||
| 30 | case _trans_URr: | ||
| 31 | return _trans_edges_rotation(URr, c); | ||
| 32 | case _trans_DFr: | ||
| 33 | return _trans_edges_rotation(DFr, c); | ||
| 34 | case _trans_DLr: | ||
| 35 | return _trans_edges_rotation(DLr, c); | ||
| 36 | case _trans_DBr: | ||
| 37 | return _trans_edges_rotation(DBr, c); | ||
| 38 | case _trans_DRr: | ||
| 39 | return _trans_edges_rotation(DRr, c); | ||
| 40 | case _trans_RUr: | ||
| 41 | return _trans_edges_rotation(RUr, c); | ||
| 42 | case _trans_RFr: | ||
| 43 | return _trans_edges_rotation(RFr, c); | ||
| 44 | case _trans_RDr: | ||
| 45 | return _trans_edges_rotation(RDr, c); | ||
| 46 | case _trans_RBr: | ||
| 47 | return _trans_edges_rotation(RBr, c); | ||
| 48 | case _trans_LUr: | ||
| 49 | return _trans_edges_rotation(LUr, c); | ||
| 50 | case _trans_LFr: | ||
| 51 | return _trans_edges_rotation(LFr, c); | ||
| 52 | case _trans_LDr: | ||
| 53 | return _trans_edges_rotation(LDr, c); | ||
| 54 | case _trans_LBr: | ||
| 55 | return _trans_edges_rotation(LBr, c); | ||
| 56 | case _trans_FUr: | ||
| 57 | return _trans_edges_rotation(FUr, c); | ||
| 58 | case _trans_FRr: | ||
| 59 | return _trans_edges_rotation(FRr, c); | ||
| 60 | case _trans_FDr: | ||
| 61 | return _trans_edges_rotation(FDr, c); | ||
| 62 | case _trans_FLr: | ||
| 63 | return _trans_edges_rotation(FLr, c); | ||
| 64 | case _trans_BUr: | ||
| 65 | return _trans_edges_rotation(BUr, c); | ||
| 66 | case _trans_BRr: | ||
| 67 | return _trans_edges_rotation(BRr, c); | ||
| 68 | case _trans_BDr: | ||
| 69 | return _trans_edges_rotation(BDr, c); | ||
| 70 | case _trans_BLr: | ||
| 71 | return _trans_edges_rotation(BLr, c); | ||
| 72 | case _trans_UFm: | ||
| 73 | return _trans_edges_mirrored(UFm, c); | ||
| 74 | case _trans_ULm: | ||
| 75 | return _trans_edges_mirrored(ULm, c); | ||
| 76 | case _trans_UBm: | ||
| 77 | return _trans_edges_mirrored(UBm, c); | ||
| 78 | case _trans_URm: | ||
| 79 | return _trans_edges_mirrored(URm, c); | ||
| 80 | case _trans_DFm: | ||
| 81 | return _trans_edges_mirrored(DFm, c); | ||
| 82 | case _trans_DLm: | ||
| 83 | return _trans_edges_mirrored(DLm, c); | ||
| 84 | case _trans_DBm: | ||
| 85 | return _trans_edges_mirrored(DBm, c); | ||
| 86 | case _trans_DRm: | ||
| 87 | return _trans_edges_mirrored(DRm, c); | ||
| 88 | case _trans_RUm: | ||
| 89 | return _trans_edges_mirrored(RUm, c); | ||
| 90 | case _trans_RFm: | ||
| 91 | return _trans_edges_mirrored(RFm, c); | ||
| 92 | case _trans_RDm: | ||
| 93 | return _trans_edges_mirrored(RDm, c); | ||
| 94 | case _trans_RBm: | ||
| 95 | return _trans_edges_mirrored(RBm, c); | ||
| 96 | case _trans_LUm: | ||
| 97 | return _trans_edges_mirrored(LUm, c); | ||
| 98 | case _trans_LFm: | ||
| 99 | return _trans_edges_mirrored(LFm, c); | ||
| 100 | case _trans_LDm: | ||
| 101 | return _trans_edges_mirrored(LDm, c); | ||
| 102 | case _trans_LBm: | ||
| 103 | return _trans_edges_mirrored(LBm, c); | ||
| 104 | case _trans_FUm: | ||
| 105 | return _trans_edges_mirrored(FUm, c); | ||
| 106 | case _trans_FRm: | ||
| 107 | return _trans_edges_mirrored(FRm, c); | ||
| 108 | case _trans_FDm: | ||
| 109 | return _trans_edges_mirrored(FDm, c); | ||
| 110 | case _trans_FLm: | ||
| 111 | return _trans_edges_mirrored(FLm, c); | ||
| 112 | case _trans_BUm: | ||
| 113 | return _trans_edges_mirrored(BUm, c); | ||
| 114 | case _trans_BRm: | ||
| 115 | return _trans_edges_mirrored(BRm, c); | ||
| 116 | case _trans_BDm: | ||
| 117 | return _trans_edges_mirrored(BDm, c); | ||
| 118 | case _trans_BLm: | ||
| 119 | return _trans_edges_mirrored(BLm, c); | ||
| 120 | default: | ||
| 121 | LOG("transform error, unknown transformation %" PRIu8 "\n", t); | ||
| 122 | return zero; | ||
| 123 | } | ||
| 124 | } | ||
| 125 | |||
| 126 | _static cube_t | ||
| 127 | transform_corners(cube_t c, uint8_t t) | ||
| 128 | { | ||
| 129 | switch (t) { | ||
| 130 | case _trans_UFr: | ||
| 131 | return c; | ||
| 132 | case _trans_ULr: | ||
| 133 | return _trans_corners_rotation(ULr, c); | ||
| 134 | case _trans_UBr: | ||
| 135 | return _trans_corners_rotation(UBr, c); | ||
| 136 | case _trans_URr: | ||
| 137 | return _trans_corners_rotation(URr, c); | ||
| 138 | case _trans_DFr: | ||
| 139 | return _trans_corners_rotation(DFr, c); | ||
| 140 | case _trans_DLr: | ||
| 141 | return _trans_corners_rotation(DLr, c); | ||
| 142 | case _trans_DBr: | ||
| 143 | return _trans_corners_rotation(DBr, c); | ||
| 144 | case _trans_DRr: | ||
| 145 | return _trans_corners_rotation(DRr, c); | ||
| 146 | case _trans_RUr: | ||
| 147 | return _trans_corners_rotation(RUr, c); | ||
| 148 | case _trans_RFr: | ||
| 149 | return _trans_corners_rotation(RFr, c); | ||
| 150 | case _trans_RDr: | ||
| 151 | return _trans_corners_rotation(RDr, c); | ||
| 152 | case _trans_RBr: | ||
| 153 | return _trans_corners_rotation(RBr, c); | ||
| 154 | case _trans_LUr: | ||
| 155 | return _trans_corners_rotation(LUr, c); | ||
| 156 | case _trans_LFr: | ||
| 157 | return _trans_corners_rotation(LFr, c); | ||
| 158 | case _trans_LDr: | ||
| 159 | return _trans_corners_rotation(LDr, c); | ||
| 160 | case _trans_LBr: | ||
| 161 | return _trans_corners_rotation(LBr, c); | ||
| 162 | case _trans_FUr: | ||
| 163 | return _trans_corners_rotation(FUr, c); | ||
| 164 | case _trans_FRr: | ||
| 165 | return _trans_corners_rotation(FRr, c); | ||
| 166 | case _trans_FDr: | ||
| 167 | return _trans_corners_rotation(FDr, c); | ||
| 168 | case _trans_FLr: | ||
| 169 | return _trans_corners_rotation(FLr, c); | ||
| 170 | case _trans_BUr: | ||
| 171 | return _trans_corners_rotation(BUr, c); | ||
| 172 | case _trans_BRr: | ||
| 173 | return _trans_corners_rotation(BRr, c); | ||
| 174 | case _trans_BDr: | ||
| 175 | return _trans_corners_rotation(BDr, c); | ||
| 176 | case _trans_BLr: | ||
| 177 | return _trans_corners_rotation(BLr, c); | ||
| 178 | case _trans_UFm: | ||
| 179 | return _trans_corners_mirrored(UFm, c); | ||
| 180 | case _trans_ULm: | ||
| 181 | return _trans_corners_mirrored(ULm, c); | ||
| 182 | case _trans_UBm: | ||
| 183 | return _trans_corners_mirrored(UBm, c); | ||
| 184 | case _trans_URm: | ||
| 185 | return _trans_corners_mirrored(URm, c); | ||
| 186 | case _trans_DFm: | ||
| 187 | return _trans_corners_mirrored(DFm, c); | ||
| 188 | case _trans_DLm: | ||
| 189 | return _trans_corners_mirrored(DLm, c); | ||
| 190 | case _trans_DBm: | ||
| 191 | return _trans_corners_mirrored(DBm, c); | ||
| 192 | case _trans_DRm: | ||
| 193 | return _trans_corners_mirrored(DRm, c); | ||
| 194 | case _trans_RUm: | ||
| 195 | return _trans_corners_mirrored(RUm, c); | ||
| 196 | case _trans_RFm: | ||
| 197 | return _trans_corners_mirrored(RFm, c); | ||
| 198 | case _trans_RDm: | ||
| 199 | return _trans_corners_mirrored(RDm, c); | ||
| 200 | case _trans_RBm: | ||
| 201 | return _trans_corners_mirrored(RBm, c); | ||
| 202 | case _trans_LUm: | ||
| 203 | return _trans_corners_mirrored(LUm, c); | ||
| 204 | case _trans_LFm: | ||
| 205 | return _trans_corners_mirrored(LFm, c); | ||
| 206 | case _trans_LDm: | ||
| 207 | return _trans_corners_mirrored(LDm, c); | ||
| 208 | case _trans_LBm: | ||
| 209 | return _trans_corners_mirrored(LBm, c); | ||
| 210 | case _trans_FUm: | ||
| 211 | return _trans_corners_mirrored(FUm, c); | ||
| 212 | case _trans_FRm: | ||
| 213 | return _trans_corners_mirrored(FRm, c); | ||
| 214 | case _trans_FDm: | ||
| 215 | return _trans_corners_mirrored(FDm, c); | ||
| 216 | case _trans_FLm: | ||
| 217 | return _trans_corners_mirrored(FLm, c); | ||
| 218 | case _trans_BUm: | ||
| 219 | return _trans_corners_mirrored(BUm, c); | ||
| 220 | case _trans_BRm: | ||
| 221 | return _trans_corners_mirrored(BRm, c); | ||
| 222 | case _trans_BDm: | ||
| 223 | return _trans_corners_mirrored(BDm, c); | ||
| 224 | case _trans_BLm: | ||
| 225 | return _trans_corners_mirrored(BLm, c); | ||
| 226 | default: | ||
| 227 | LOG("transform error, unknown transformation %" PRIu8 "\n", t); | ||
| 228 | return zero; | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 232 | _static cube_t | ||
| 233 | transform(cube_t c, uint8_t t) | ||
| 234 | { | ||
| 235 | switch (t) { | ||
| 236 | case _trans_UFr: | ||
| 237 | return c; | ||
| 238 | case _trans_ULr: | ||
| 239 | return _trans_rotation(ULr, c); | ||
| 240 | case _trans_UBr: | ||
| 241 | return _trans_rotation(UBr, c); | ||
| 242 | case _trans_URr: | ||
| 243 | return _trans_rotation(URr, c); | ||
| 244 | case _trans_DFr: | ||
| 245 | return _trans_rotation(DFr, c); | ||
| 246 | case _trans_DLr: | ||
| 247 | return _trans_rotation(DLr, c); | ||
| 248 | case _trans_DBr: | ||
| 249 | return _trans_rotation(DBr, c); | ||
| 250 | case _trans_DRr: | ||
| 251 | return _trans_rotation(DRr, c); | ||
| 252 | case _trans_RUr: | ||
| 253 | return _trans_rotation(RUr, c); | ||
| 254 | case _trans_RFr: | ||
| 255 | return _trans_rotation(RFr, c); | ||
| 256 | case _trans_RDr: | ||
| 257 | return _trans_rotation(RDr, c); | ||
| 258 | case _trans_RBr: | ||
| 259 | return _trans_rotation(RBr, c); | ||
| 260 | case _trans_LUr: | ||
| 261 | return _trans_rotation(LUr, c); | ||
| 262 | case _trans_LFr: | ||
| 263 | return _trans_rotation(LFr, c); | ||
| 264 | case _trans_LDr: | ||
| 265 | return _trans_rotation(LDr, c); | ||
| 266 | case _trans_LBr: | ||
| 267 | return _trans_rotation(LBr, c); | ||
| 268 | case _trans_FUr: | ||
| 269 | return _trans_rotation(FUr, c); | ||
| 270 | case _trans_FRr: | ||
| 271 | return _trans_rotation(FRr, c); | ||
| 272 | case _trans_FDr: | ||
| 273 | return _trans_rotation(FDr, c); | ||
| 274 | case _trans_FLr: | ||
| 275 | return _trans_rotation(FLr, c); | ||
| 276 | case _trans_BUr: | ||
| 277 | return _trans_rotation(BUr, c); | ||
| 278 | case _trans_BRr: | ||
| 279 | return _trans_rotation(BRr, c); | ||
| 280 | case _trans_BDr: | ||
| 281 | return _trans_rotation(BDr, c); | ||
| 282 | case _trans_BLr: | ||
| 283 | return _trans_rotation(BLr, c); | ||
| 284 | case _trans_UFm: | ||
| 285 | return _trans_mirrored(UFm, c); | ||
| 286 | case _trans_ULm: | ||
| 287 | return _trans_mirrored(ULm, c); | ||
| 288 | case _trans_UBm: | ||
| 289 | return _trans_mirrored(UBm, c); | ||
| 290 | case _trans_URm: | ||
| 291 | return _trans_mirrored(URm, c); | ||
| 292 | case _trans_DFm: | ||
| 293 | return _trans_mirrored(DFm, c); | ||
| 294 | case _trans_DLm: | ||
| 295 | return _trans_mirrored(DLm, c); | ||
| 296 | case _trans_DBm: | ||
| 297 | return _trans_mirrored(DBm, c); | ||
| 298 | case _trans_DRm: | ||
| 299 | return _trans_mirrored(DRm, c); | ||
| 300 | case _trans_RUm: | ||
| 301 | return _trans_mirrored(RUm, c); | ||
| 302 | case _trans_RFm: | ||
| 303 | return _trans_mirrored(RFm, c); | ||
| 304 | case _trans_RDm: | ||
| 305 | return _trans_mirrored(RDm, c); | ||
| 306 | case _trans_RBm: | ||
| 307 | return _trans_mirrored(RBm, c); | ||
| 308 | case _trans_LUm: | ||
| 309 | return _trans_mirrored(LUm, c); | ||
| 310 | case _trans_LFm: | ||
| 311 | return _trans_mirrored(LFm, c); | ||
| 312 | case _trans_LDm: | ||
| 313 | return _trans_mirrored(LDm, c); | ||
| 314 | case _trans_LBm: | ||
| 315 | return _trans_mirrored(LBm, c); | ||
| 316 | case _trans_FUm: | ||
| 317 | return _trans_mirrored(FUm, c); | ||
| 318 | case _trans_FRm: | ||
| 319 | return _trans_mirrored(FRm, c); | ||
| 320 | case _trans_FDm: | ||
| 321 | return _trans_mirrored(FDm, c); | ||
| 322 | case _trans_FLm: | ||
| 323 | return _trans_mirrored(FLm, c); | ||
| 324 | case _trans_BUm: | ||
| 325 | return _trans_mirrored(BUm, c); | ||
| 326 | case _trans_BRm: | ||
| 327 | return _trans_mirrored(BRm, c); | ||
| 328 | case _trans_BDm: | ||
| 329 | return _trans_mirrored(BDm, c); | ||
| 330 | case _trans_BLm: | ||
| 331 | return _trans_mirrored(BLm, c); | ||
| 332 | default: | ||
| 333 | LOG("transform error, unknown transformation %" PRIu8 "\n", t); | ||
| 334 | return zero; | ||
| 335 | } | ||
| 336 | } | ||
