aboutsummaryrefslogtreecommitdiff
path: root/src/cube_portable.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/cube_portable.h')
-rw-r--r--src/cube_portable.h187
1 files changed, 60 insertions, 127 deletions
diff --git a/src/cube_portable.h b/src/cube_portable.h
index 48885ff..71a7e41 100644
--- a/src/cube_portable.h
+++ b/src/cube_portable.h
@@ -1,109 +1,48 @@
1typedef struct { 1typedef struct {
2 uint8_t corner[8]; 2 uint8_t corner[8];
3 uint8_t edge[12]; 3 uint8_t edge[12];
4} cube_fast_t; 4} cube_t;
5 5
6_static_inline cube_fast_t fastcube( 6#define static_cube(c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl, \
7 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, 7 e_uf, e_ub, e_db, e_df, e_ur, e_ul, e_dl, e_dr, e_fr, e_fl, e_bl, e_br) \
8 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, 8 ((cube_t) { \
9 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, 9 .corner = { c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl }, \
10 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t 10 .edge = { e_uf, e_ub, e_db, e_df, e_ur, e_ul, \
11); 11 e_dl, e_dr, e_fr, e_fl, e_bl, e_br } })
12_static uint8_t corner(cube_fast_t, int); 12#define zero static_cube( \
13_static uint8_t edge(cube_fast_t, int); 13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
14_static cube_fast_t cubetofast(cube_t); 14#define solved static_cube( \
15_static cube_t fasttocube(cube_fast_t); 15 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
16_static_inline bool equal_fast(cube_fast_t, cube_fast_t);
17_static_inline bool issolved_fast(cube_fast_t);
18_static_inline cube_fast_t invertco_fast(cube_fast_t);
19_static_inline void compose_edges_inplace(cube_fast_t, cube_fast_t, cube_fast_t *);
20_static_inline void compose_corners_inplace(cube_fast_t, cube_fast_t, cube_fast_t *);
21_static_inline cube_fast_t compose_fast_edges(cube_fast_t, cube_fast_t);
22_static_inline cube_fast_t compose_fast_corners(cube_fast_t, cube_fast_t);
23_static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t);
24 16
25_static_inline int64_t coord_fast_co(cube_fast_t); 17_static void pieces(cube_t *, uint8_t [static 8], uint8_t [static 12]);
26_static_inline int64_t coord_fast_csep(cube_fast_t); 18_static_inline bool equal(cube_t, cube_t);
27_static_inline int64_t coord_fast_cocsep(cube_fast_t); 19_static_inline cube_t invertco(cube_t);
28_static_inline int64_t coord_fast_eo(cube_fast_t); 20_static_inline void compose_edges_inplace(cube_t, cube_t, cube_t *);
29_static_inline int64_t coord_fast_esep(cube_fast_t); 21_static_inline void compose_corners_inplace(cube_t, cube_t, cube_t *);
22_static_inline cube_t compose_edges(cube_t, cube_t);
23_static_inline cube_t compose_corners(cube_t, cube_t);
24_static_inline cube_t compose(cube_t, cube_t);
30 25
31_static_inline void copy_corners_fast(cube_fast_t *, cube_fast_t); 26_static_inline int64_t coord_co(cube_t);
32_static_inline void copy_edges_fast(cube_fast_t *, cube_fast_t); 27_static_inline int64_t coord_csep(cube_t);
33_static_inline void set_eo_fast(cube_fast_t *, int64_t); 28_static_inline int64_t coord_cocsep(cube_t);
34_static_inline cube_fast_t invcoord_fast_esep(int64_t); 29_static_inline int64_t coord_eo(cube_t);
30_static_inline int64_t coord_esep(cube_t);
35 31
36_static_inline cube_fast_t 32_static_inline void copy_corners(cube_t *, cube_t);
37fastcube( 33_static_inline void copy_edges(cube_t *, cube_t);
38 uint8_t c_ufr, 34_static_inline void set_eo(cube_t *, int64_t);
39 uint8_t c_ubl, 35_static_inline cube_t invcoord_esep(int64_t);
40 uint8_t c_dfl,
41 uint8_t c_dbr,
42 uint8_t c_ufl,
43 uint8_t c_ubr,
44 uint8_t c_dfr,
45 uint8_t c_dbl,
46 36
47 uint8_t e_uf, 37_static void
48 uint8_t e_ub, 38pieces(cube_t *cube, uint8_t c[static 8], uint8_t e[static 12])
49 uint8_t e_db,
50 uint8_t e_df,
51 uint8_t e_ur,
52 uint8_t e_ul,
53 uint8_t e_dl,
54 uint8_t e_dr,
55 uint8_t e_fr,
56 uint8_t e_fl,
57 uint8_t e_bl,
58 uint8_t e_br
59)
60{ 39{
61 cube_fast_t cube = { 40 memcpy(c, cube->corner, 8);
62 .corner = { 41 memcpy(e, cube->edge, 12);
63 c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl
64 },
65 .edge = {
66 e_uf, e_ub, e_db, e_df, e_ur, e_ul,
67 e_dl, e_dr, e_fr, e_fl, e_bl, e_br
68 }
69 };
70
71 return cube;
72}
73
74_static uint8_t
75corner(cube_fast_t c, int i)
76{
77 DBG_ASSERT(i >= 0 && i < 8, 255, "Corner must be between 0 and 7\n");
78
79 return c.corner[i];
80}
81_static uint8_t
82edge(cube_fast_t c, int i)
83{
84 DBG_ASSERT(i >= 0 && i < 12, 255, "Edge must be between 0 and 11\n");
85
86 return c.edge[i];
87}
88
89_static cube_fast_t
90cubetofast(cube_t cube)
91{
92 cube_fast_t fast;
93 memcpy(&fast, &cube, sizeof(cube_fast_t));
94 return fast;
95}
96
97_static cube_t
98fasttocube(cube_fast_t fast)
99{
100 cube_t cube;
101 memcpy(&cube, &fast, sizeof(cube_fast_t));
102 return cube;
103} 42}
104 43
105_static_inline bool 44_static_inline bool
106equal_fast(cube_fast_t c1, cube_fast_t c2) 45equal(cube_t c1, cube_t c2)
107{ 46{
108 uint8_t i; 47 uint8_t i;
109 bool ret; 48 bool ret;
@@ -117,17 +56,11 @@ equal_fast(cube_fast_t c1, cube_fast_t c2)
117 return ret; 56 return ret;
118} 57}
119 58
120_static_inline bool 59_static_inline cube_t
121issolved_fast(cube_fast_t cube) 60invertco(cube_t c)
122{
123 return equal_fast(cube, solved_fast);
124}
125
126_static_inline cube_fast_t
127invertco_fast(cube_fast_t c)
128{ 61{
129 uint8_t i, piece, orien; 62 uint8_t i, piece, orien;
130 cube_fast_t ret; 63 cube_t ret;
131 64
132 ret = c; 65 ret = c;
133 for (i = 0; i < 8; i++) { 66 for (i = 0; i < 8; i++) {
@@ -140,7 +73,7 @@ invertco_fast(cube_fast_t c)
140} 73}
141 74
142_static_inline void 75_static_inline void
143compose_edges_inplace(cube_fast_t c1, cube_fast_t c2, cube_fast_t *ret) 76compose_edges_inplace(cube_t c1, cube_t c2, cube_t *ret)
144{ 77{
145 uint8_t i, piece1, piece2, p, orien; 78 uint8_t i, piece1, piece2, p, orien;
146 79
@@ -154,7 +87,7 @@ compose_edges_inplace(cube_fast_t c1, cube_fast_t c2, cube_fast_t *ret)
154} 87}
155 88
156_static_inline void 89_static_inline void
157compose_corners_inplace(cube_fast_t c1, cube_fast_t c2, cube_fast_t *ret) 90compose_corners_inplace(cube_t c1, cube_t c2, cube_t *ret)
158{ 91{
159 uint8_t i, piece1, piece2, p, orien, aux, auy; 92 uint8_t i, piece1, piece2, p, orien, aux, auy;
160 93
@@ -169,30 +102,30 @@ compose_corners_inplace(cube_fast_t c1, cube_fast_t c2, cube_fast_t *ret)
169 } 102 }
170} 103}
171 104
172_static_inline cube_fast_t 105_static_inline cube_t
173compose_fast_edges(cube_fast_t c1, cube_fast_t c2) 106compose_edges(cube_t c1, cube_t c2)
174{ 107{
175 cube_fast_t ret = zero_fast; 108 cube_t ret = zero;
176 109
177 compose_edges_inplace(c1, c2, &ret); 110 compose_edges_inplace(c1, c2, &ret);
178 111
179 return ret; 112 return ret;
180} 113}
181 114
182_static_inline cube_fast_t 115_static_inline cube_t
183compose_fast_corners(cube_fast_t c1, cube_fast_t c2) 116compose_corners(cube_t c1, cube_t c2)
184{ 117{
185 cube_fast_t ret = zero_fast; 118 cube_t ret = zero;
186 119
187 compose_corners_inplace(c1, c2, &ret); 120 compose_corners_inplace(c1, c2, &ret);
188 121
189 return ret; 122 return ret;
190} 123}
191 124
192_static_inline cube_fast_t 125_static_inline cube_t
193compose_fast(cube_fast_t c1, cube_fast_t c2) 126compose(cube_t c1, cube_t c2)
194{ 127{
195 cube_fast_t ret = zero_fast; 128 cube_t ret = zero;
196 129
197 compose_edges_inplace(c1, c2, &ret); 130 compose_edges_inplace(c1, c2, &ret);
198 compose_corners_inplace(c1, c2, &ret); 131 compose_corners_inplace(c1, c2, &ret);
@@ -201,7 +134,7 @@ compose_fast(cube_fast_t c1, cube_fast_t c2)
201} 134}
202 135
203_static_inline int64_t 136_static_inline int64_t
204coord_fast_co(cube_fast_t c) 137coord_co(cube_t c)
205{ 138{
206 int i, p; 139 int i, p;
207 int64_t ret; 140 int64_t ret;
@@ -220,7 +153,7 @@ possible. Encoding this as a number from 0 to C(8,4) would save about 40%
220of space, but we are not going to use this coordinate in large tables. 153of space, but we are not going to use this coordinate in large tables.
221*/ 154*/
222_static_inline int64_t 155_static_inline int64_t
223coord_fast_csep(cube_fast_t c) 156coord_csep(cube_t c)
224{ 157{
225 int i, p; 158 int i, p;
226 int64_t ret; 159 int64_t ret;
@@ -232,13 +165,13 @@ coord_fast_csep(cube_fast_t c)
232} 165}
233 166
234_static_inline int64_t 167_static_inline int64_t
235coord_fast_cocsep(cube_fast_t c) 168coord_cocsep(cube_t c)
236{ 169{
237 return (coord_fast_co(c) << 7) + coord_fast_csep(c); 170 return (coord_co(c) << 7) + coord_csep(c);
238} 171}
239 172
240_static_inline int64_t 173_static_inline int64_t
241coord_fast_eo(cube_fast_t c) 174coord_eo(cube_t c)
242{ 175{
243 int i, p; 176 int i, p;
244 int64_t ret; 177 int64_t ret;
@@ -254,7 +187,7 @@ We encode the edge separation as a number from 0 to C(12,4)*C(8,4).
254It can be seen as the composition of two "subset index" coordinates. 187It can be seen as the composition of two "subset index" coordinates.
255*/ 188*/
256_static_inline int64_t 189_static_inline int64_t
257coord_fast_esep(cube_fast_t c) 190coord_esep(cube_t c)
258{ 191{
259 int64_t i, j, jj, k, l, ret1, ret2, bit1, bit2, is1; 192 int64_t i, j, jj, k, l, ret1, ret2, bit1, bit2, is1;
260 193
@@ -286,19 +219,19 @@ coord_fast_esep(cube_fast_t c)
286} 219}
287 220
288_static_inline void 221_static_inline void
289copy_corners_fast(cube_fast_t *dest, cube_fast_t src) 222copy_corners(cube_t *dest, cube_t src)
290{ 223{
291 memcpy(&dest->corner, src.corner, sizeof(src.corner)); 224 memcpy(&dest->corner, src.corner, sizeof(src.corner));
292} 225}
293 226
294_static_inline void 227_static_inline void
295copy_edges_fast(cube_fast_t *dest, cube_fast_t src) 228copy_edges(cube_t *dest, cube_t src)
296{ 229{
297 memcpy(&dest->edge, src.edge, sizeof(src.edge)); 230 memcpy(&dest->edge, src.edge, sizeof(src.edge));
298} 231}
299 232
300_static_inline void 233_static_inline void
301set_eo_fast(cube_fast_t *cube, int64_t eo) 234set_eo(cube_t *cube, int64_t eo)
302{ 235{
303 uint8_t i, sum, flip; 236 uint8_t i, sum, flip;
304 237
@@ -310,14 +243,14 @@ set_eo_fast(cube_fast_t *cube, int64_t eo)
310 cube->edge[0] = (cube->edge[0] & ~_eobit) | (_eobit * (sum % 2)); 243 cube->edge[0] = (cube->edge[0] & ~_eobit) | (_eobit * (sum % 2));
311} 244}
312 245
313_static_inline cube_fast_t 246_static_inline cube_t
314invcoord_fast_esep(int64_t esep) 247invcoord_esep(int64_t esep)
315{ 248{
316 cube_fast_t ret; 249 cube_t ret;
317 int64_t bit1, bit2, i, j, jj, k, l, s, v, w, is1, set1, set2; 250 int64_t bit1, bit2, i, j, jj, k, l, s, v, w, is1, set1, set2;
318 uint8_t slice[3] = {0}; 251 uint8_t slice[3] = {0};
319 252
320 ret = cubetofast(solved); 253 ret = solved;
321 set1 = esep % 70; 254 set1 = esep % 70;
322 set2 = esep / 70; 255 set2 = esep / 70;
323 256

Generated with cgit - Back to sebastiano.tronto.net