aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/constant_cubes.h229
-rw-r--r--src/core/constants.h734
-rw-r--r--src/core/core.h3
-rw-r--r--src/core/core_types.h4
-rw-r--r--src/core/cube.h95
-rw-r--r--src/core/moves.h12
-rw-r--r--src/core/transform.h13
7 files changed, 806 insertions, 284 deletions
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
426STATIC 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
435STATIC 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
446STATIC 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
457STATIC 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
472STATIC 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
532STATIC 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
583static 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
634static 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
685static 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
712static 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 @@
1typedef 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 @@
1STATIC cube_t solvedcube(void); 1STATIC oriented_cube_t solvedcube(void);
2STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]); 2STATIC cube_t cubefromarray(uint8_t [static 8], uint8_t [static 12]);
3STATIC bool isconsistent(cube_t); 3STATIC bool isconsistent(oriented_cube_t);
4STATIC bool issolvable(cube_t); 4STATIC bool issolvable(oriented_cube_t);
5STATIC bool issolved(cube_t); 5STATIC bool issolved(oriented_cube_t);
6STATIC bool iserror(cube_t); 6STATIC bool iserror(oriented_cube_t);
7STATIC void getcube_fix(long long *, long long *, long long *, long long *); 7STATIC void getcube_fix(long long *, long long *, long long *, long long *);
8STATIC cube_t getcube(int64_t, int64_t, int64_t, int64_t); 8STATIC 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 */ 10STATIC oriented_cube_t readcube(const char *);
11STATIC cube_t 11STATIC int64_t writecube(oriented_cube_t, size_t n, char [n]);
12STATIC uint8_t readco(const char *);
13STATIC uint8_t readcp(const char *);
14STATIC uint8_t readeo(const char *);
15STATIC uint8_t readep(const char *);
16
17STATIC uint8_t b32toedge(char);
18STATIC uint8_t b32tocorner(char);
19STATIC char edgetob32(uint8_t);
20STATIC char cornertob32(uint8_t);
21
22/* This is used only in tests, use SOLVED_ORIENTED_CUBE everywhere else */
23STATIC oriented_cube_t
12solvedcube(void) 24solvedcube(void)
13{ 25{
14 return SOLVED_CUBE; 26 return SOLVED_ORIENTED_CUBE;
15} 27}
16 28
17STATIC cube_t 29STATIC cube_t
@@ -24,12 +36,12 @@ cubefromarray(uint8_t c[static 8], uint8_t e[static 12])
24} 36}
25 37
26STATIC bool 38STATIC bool
27isconsistent(cube_t cube) 39isconsistent(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
68inconsistent_ep: 83inconsistent_ep:
69inconsistent_cp: 84inconsistent_cp:
70inconsistent_eo: 85inconsistent_eo:
71inconsistent_co: 86inconsistent_co:
72 /* We used to do more logging here, hence the 4 different labels */ 87inconsistent_orientation:
88 /* We used to do more logging here, hence the different labels */
73 return false; 89 return false;
74} 90}
75 91
76STATIC bool 92STATIC bool
77issolvable(cube_t cube) 93issolvable(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
122bool 138bool
123issolved(cube_t cube) 139issolved(oriented_cube_t cube)
124{ 140{
125 return equal(cube, SOLVED_CUBE); 141 return equal(cube.cube, SOLVED_CUBE);
126} 142}
127 143
128bool 144bool
129iserror(cube_t cube) 145iserror(oriented_cube_t cube)
130{ 146{
131 return equal(cube, ZERO_CUBE); 147 return equal(cube.cube, ZERO_CUBE);
132} 148}
133 149
134STATIC void 150STATIC 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
181STATIC cube_t readcube(const char *);
182STATIC int64_t writecube(cube_t, size_t n, char [n]);
183STATIC uint8_t readco(const char *);
184STATIC uint8_t readcp(const char *);
185STATIC uint8_t readeo(const char *);
186STATIC uint8_t readep(const char *);
187
188STATIC uint8_t b32toedge(char);
189STATIC uint8_t b32tocorner(char);
190STATIC char edgetob32(uint8_t);
191STATIC char cornertob32(uint8_t);
192
193STATIC uint8_t 194STATIC uint8_t
194readco(const char *str) 195readco(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
246STATIC cube_t 247STATIC oriented_cube_t
247readcube(const char *buf) 248readcube(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
287STATIC int64_t 298STATIC int64_t
288writecube(cube_t cube, size_t buf_size, char buf[buf_size]) 299writecube(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);
21STATIC void sortparallel_moves(size_t n, uint8_t [n]); 21STATIC void sortparallel_moves(size_t n, uint8_t [n]);
22STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]); 22STATIC bool are_lastmoves_singlecw(size_t n, const uint8_t [n]);
23 23
24STATIC cube_t applymoves(cube_t, const char *); 24STATIC 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
338STATIC cube_t 338STATIC oriented_cube_t
339applymoves(cube_t cube, const char *buf) 339applymoves(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]);
23STATIC cube_t transform_edges(cube_t, uint8_t); 23STATIC cube_t transform_edges(cube_t, uint8_t);
24STATIC cube_t transform_corners(cube_t, uint8_t); 24STATIC cube_t transform_corners(cube_t, uint8_t);
25STATIC cube_t transform(cube_t, uint8_t); 25STATIC cube_t transform(cube_t, uint8_t);
26STATIC cube_t applytrans(cube_t, const char *); 26STATIC oriented_cube_t applytrans(oriented_cube_t, const char *);
27STATIC_INLINE uint8_t inverse_trans(uint8_t); 27STATIC_INLINE uint8_t inverse_trans(uint8_t);
28STATIC uint8_t transform_move(uint8_t, uint8_t); 28STATIC uint8_t transform_move(uint8_t, uint8_t);
29STATIC uint64_t symmetry_mask(cube_t); 29STATIC uint64_t symmetry_mask(cube_t);
@@ -367,12 +367,12 @@ transform(cube_t c, uint8_t t)
367 } 367 }
368} 368}
369 369
370STATIC cube_t 370STATIC oriented_cube_t
371applytrans(cube_t cube, const char *buf) 371applytrans(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
386STATIC_INLINE uint8_t 389STATIC_INLINE uint8_t

Generated with cgit - Back to sebastiano.tronto.net