aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2024-08-18 14:26:45 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2024-08-18 14:26:45 +0200
commit18c9a8b8905304cf5f8fc15825769046a3144866 (patch)
treea7807bb32b0a5d9ded7d3cedccc598f64a9b00fe /src/core
parentf25a10e19eca294c4e6a99e4f80ce5cfd11a0e5f (diff)
downloadnissy-core-18c9a8b8905304cf5f8fc15825769046a3144866.tar.gz
nissy-core-18c9a8b8905304cf5f8fc15825769046a3144866.zip
Reorganized folder structure
Diffstat (limited to 'src/core')
-rw-r--r--src/core/constant_cubes.h229
-rw-r--r--src/core/core.h13
-rw-r--r--src/core/cube.h291
-rw-r--r--src/core/io_cube.h348
-rw-r--r--src/core/io_moves.h62
-rw-r--r--src/core/io_trans.h25
-rw-r--r--src/core/moves.h47
-rw-r--r--src/core/transform.h176
-rw-r--r--src/core/transform_with_switch.h336
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
22cubefromarray(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
31solvedcube(void)
32{
33 return solved;
34}
35
36_static bool
37isconsistent(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
78inconsistent_ep:
79 LOG("Inconsistent EP\n");
80 return false;
81inconsistent_cp:
82 LOG("Inconsistent CP\n");
83 return false;
84inconsistent_eo:
85 LOG("Inconsistent EO\n");
86 return false;
87inconsistent_co:
88 LOG("Inconsistent CO\n");
89 return false;
90}
91
92_static bool
93issolvable(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
127issolvable_parity:
128 LOG("EP and CP parities are different\n");
129 return false;
130issolvable_eo:
131 LOG("Odd number of flipped edges\n");
132 return false;
133issolvable_co:
134 LOG("Sum of corner orientation is not multiple of 3\n");
135 return false;
136}
137
138bool
139issolved(cube_t cube)
140{
141 return equal(cube, solved);
142}
143
144bool
145iserror(cube_t cube)
146{
147 return equal(cube, zero);
148}
149
150_static cube_t
151applymoves(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
171applymoves_finish:
172 return cube;
173
174applymoves_error:
175 LOG("applymoves error\n");
176 return zero;
177}
178
179_static cube_t
180frommoves(const char *buf)
181{
182 return applymoves(solved, buf);
183}
184
185_static void
186getcube_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
208getcube(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
230applytrans(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
243move(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/*
289TODO transform is now relegated to a separated file because it is too long.
290It 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
32cube_t
33readcube(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
45void
46writecube(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
67writecube_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
76readco(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
90readcp(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
104readeo(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
116readep(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
129readcube_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
150readcube_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
185readpiece_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
202readcube_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
217writepiece_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
241writecube_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
260writecube_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
291writecube_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
314b32toedge(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
323b32tocorner(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
335edgetob32(uint8_t edge)
336{
337 return edge < 26 ? 'A' + (char)edge : 'a' + (char)(edge - 26);
338}
339
340_static char
341cornertob32(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
6readmove(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
27readmodifier(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
42writemoves(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
5readtrans(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
18writetrans(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
7allowednextmove(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
32inverse_trans(uint8_t t)
33{
34 return inverse_trans_table[t];
35}
36
37_static_inline uint8_t
38movebase(uint8_t move)
39{
40 return move / 3;
41}
42
43_static_inline uint8_t
44moveaxis(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
22static 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
73static 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
125transform_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
143transform_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
161transform(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
21transform_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
127transform_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
233transform(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}

Generated with cgit - Back to sebastiano.tronto.net