Skip to content

Commit 8b3d918

Browse files
committed
add a macro to clean up inverse pattern list
1 parent cec9b26 commit 8b3d918

File tree

1 file changed

+107
-101
lines changed

1 file changed

+107
-101
lines changed

src/algorithm/invert.rs

Lines changed: 107 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,26 @@ fn impl_prim_inverse(prim: ImplPrimitive, span: usize) -> Option<Instr> {
7575
})
7676
}
7777

78+
macro_rules! pat {
79+
(($($matching:expr),*), ($($before:expr),*) $(,($($after:expr),*))? $(,)?) => {
80+
(
81+
[$($matching,)*],
82+
[$(box_as_instr($before)),*],
83+
$([$(box_as_instr($after)),*],)?
84+
)
85+
};
86+
($matching:expr, ($($before:expr),*) $(,($($after:expr),*))? $(,)?) => {
87+
(
88+
[$matching],
89+
[$(box_as_instr($before)),*],
90+
$([$(box_as_instr($after)),*],)?
91+
)
92+
};
93+
($matching:expr, $before:expr $(,($($after:expr),*))? $(,)?) => {
94+
pat!($matching, ($before) $(,($($after),*))?)
95+
};
96+
}
97+
7898
pub(crate) fn invert_instrs(instrs: &[Instr]) -> Option<Vec<Instr>> {
7999
if instrs.is_empty() {
80100
return Some(Vec::new());
@@ -120,16 +140,16 @@ fn invert_instr_impl(mut instrs: &[Instr]) -> Option<Vec<Instr>> {
120140
&invert_invert_pattern,
121141
&(Val, ([Rotate], [Neg, Rotate])),
122142
&([Rotate], [Neg, Rotate]),
123-
&([Sqrt], [2.i(), Pow.i()]),
143+
&pat!(Sqrt, (2, Pow)),
124144
&(Val, IgnoreMany(Flip), ([Add], [Sub])),
125145
&(Val, ([Sub], [Add])),
126146
&(Val, ([Flip, Sub], [Flip, Sub])),
127147
&(Val, IgnoreMany(Flip), ([Mul], [Div])),
128148
&(Val, ([Div], [Mul])),
129149
&(Val, ([Flip, Div], [Flip, Div])),
130-
&([Dup, Add], [2.i(), Div.i()]),
150+
&pat!((Dup, Add), (2, Div)),
131151
&([Dup, Mul], [Sqrt]),
132-
&(Val, ([Pow], [1.i(), Flip.i(), Div.i(), Pow.i()])),
152+
&(Val, pat!(Pow, (1, Flip, Div, Pow))),
133153
&(Val, ([Log], [Flip, Pow])),
134154
];
135155

@@ -188,34 +208,34 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
188208

189209
macro_rules! stash2 {
190210
($before:expr, $after:expr) => {
191-
(
192-
[$before],
193-
[Over.i(), Over.i(), PushTempN(2).i(), $before.i()],
194-
[PopTempN(2).i(), $after.i()],
211+
pat!(
212+
$before,
213+
(Over, Over, PushTempN(2), $before),
214+
(PopTempN(2), $after),
195215
)
196216
};
197217
}
198218

199219
macro_rules! bin {
200220
(Flip, $before:expr, $after:expr) => {
201-
(
202-
[Flip, $before],
203-
[Dup.i(), PushTempN(1).i(), Flip.i(), $before.i()],
204-
[PopTempN(1).i(), $after.i()],
221+
pat!(
222+
(Flip, $before),
223+
(Dup, PushTempN(1), Flip, $before),
224+
(PopTempN(1), $after),
205225
)
206226
};
207227
(Flip, $before:expr) => {
208-
(
209-
[Flip, $before],
210-
[Dup.i(), PushTempN(1).i(), Flip.i(), $before.i()],
211-
[PopTempN(1).i(), Flip.i(), $before.i()],
228+
pat!(
229+
(Flip, $before),
230+
(Dup, PushTempN(1), Flip, $before),
231+
(PopTempN(1), Flip, $before),
212232
)
213233
};
214234
($before:expr, $after:expr) => {
215-
(
216-
[$before],
217-
[Dup.i(), PushTempN(1).i(), $before.i()],
218-
[PopTempN(1).i(), $after.i()],
235+
pat!(
236+
($before),
237+
(Dup, PushTempN(1), $before),
238+
(PopTempN(1), $after),
219239
)
220240
};
221241
}
@@ -234,26 +254,22 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
234254
&bin!(Sub, Add),
235255
&bin!(Mul, Div),
236256
&bin!(Div, Mul),
237-
&(
238-
[Flip, Pow],
239-
[Dup.i(), PushTempN(1).i(), Flip.i(), Pow.i()],
240-
[PopTempN(1).i(), Log.i()],
241-
),
242-
&(
243-
[Pow],
244-
[Dup.i(), PushTempN(1).i(), Pow.i()],
245-
[PopTempN(1).i(), 1.i(), Flip.i(), Div.i(), Pow.i()],
257+
&pat!(
258+
(Flip, Pow),
259+
(Dup, PushTempN(1), Flip, Pow),
260+
(PopTempN(1), Log)
246261
),
247-
&(
248-
[Flip, Log],
249-
[Dup.i(), PushTempN(1).i(), Flip.i(), Log.i()],
250-
[1.i(), Flip.i(), Div.i(), PopTempN(1).i(), Flip.i(), Pow.i()],
262+
&pat!(
263+
Pow,
264+
(Dup, PushTempN(1), Pow),
265+
(PopTempN(1), 1, Flip, Div, Pow)
251266
),
252-
&(
253-
[Log],
254-
[Dup.i(), PushTempN(1).i(), Log.i()],
255-
[PopTempN(1).i(), Flip.i(), Pow.i()],
267+
&pat!(
268+
(Flip, Log),
269+
(Dup, PushTempN(1), Flip, Log),
270+
(1, Flip, Div, PopTempN(1), Flip, Pow)
256271
),
272+
&pat!(Log, (Dup, PushTempN(1), Log), (PopTempN(1), Flip, Pow)),
257273
&(Val, stash2!(Take, Untake)),
258274
&stash2!(Take, Untake),
259275
&(Val, stash2!(Drop, Undrop)),
@@ -264,77 +280,69 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
264280
&stash2!(Pick, Unpick),
265281
&(
266282
Val,
267-
(
268-
[Keep],
269-
[Over.i(), Over.i(), PushTempN(2).i(), Keep.i()],
270-
[PopTempN(1).i(), Flip.i(), PopTempN(1).i(), Unkeep.i()],
283+
pat!(
284+
Keep,
285+
(Over, Over, PushTempN(2), Keep),
286+
(PopTempN(1), Flip, PopTempN(1), Unkeep)
271287
),
272288
),
273-
&(
274-
[Keep],
275-
[Over.i(), Over.i(), PushTempN(2).i(), Keep.i()],
276-
[PopTempN(1).i(), Flip.i(), PopTempN(1).i(), Unkeep.i()],
289+
&pat!(
290+
Keep,
291+
(Over, Over, PushTempN(2), Keep),
292+
(PopTempN(1), Flip, PopTempN(1), Unkeep),
277293
),
278-
&(
279-
[Rotate],
280-
[Dup.i(), PushTempN(1).i(), Rotate.i()],
281-
[PopTempN(1).i(), Neg.i(), Rotate.i()],
294+
&pat!(
295+
Rotate,
296+
(Dup, PushTempN(1), Rotate),
297+
(PopTempN(1), Neg, Rotate),
282298
),
283-
&(
284-
[Abs],
285-
[Dup.i(), Sign.i(), PushTempN(1).i(), Abs.i()],
286-
[PopTempN(1).i(), Mul.i()],
299+
&pat!((Abs), (Dup, Sign, PushTempN(1), Abs), (PopTempN(1), Mul),),
300+
&pat!(
301+
First,
302+
(Dup, PushTempN(1), First),
303+
(PopTempN(1), 1, Drop, Flip, Join),
287304
),
288-
&(
289-
[First],
290-
[Dup.i(), PushTempN(1).i(), First.i()],
291-
[PopTempN(1).i(), 1.i(), Drop.i(), Flip.i(), Join.i()],
305+
&pat!(
306+
Last,
307+
(Dup, PushTempN(1), Last),
308+
(PopTempN(1), -1, Drop, Join),
292309
),
293-
&(
294-
[Last],
295-
[Dup.i(), PushTempN(1).i(), Last.i()],
296-
[PopTempN(1).i(), (-1).i(), Drop.i(), Join.i()],
310+
&pat!(
311+
Shape,
312+
(Dup, PushTempN(1), Shape),
313+
(PopTempN(1), Flip, Reshape),
297314
),
298-
&(
299-
[Shape],
300-
[Dup.i(), PushTempN(1).i(), Shape.i()],
301-
[PopTempN(1).i(), Flip.i(), Reshape.i()],
315+
&pat!(
316+
Deshape,
317+
(Dup, Shape, PushTempN(1), Deshape),
318+
(PopTempN(1), Reshape),
302319
),
303-
&(
304-
[Deshape],
305-
[Dup.i(), Shape.i(), PushTempN(1).i(), Deshape.i()],
306-
[PopTempN(1).i(), Reshape.i()],
320+
&pat!((Now), (Now, PushTempN(1)), (PopTempN(1), Now, Flip, Sub),),
321+
&pat!(
322+
Sys(SysOp::FOpen),
323+
(Sys(SysOp::FOpen), Dup, PushTempN(1)),
324+
(PopTempN(1), Sys(SysOp::Close)),
307325
),
308-
&(
309-
[Now],
310-
[Now.i(), PushTempN(1).i()],
311-
[PopTempN(1).i(), Now.i(), Flip.i(), Sub.i()],
326+
&pat!(
327+
Sys(SysOp::FCreate),
328+
(Sys(SysOp::FCreate), Dup, PushTempN(1)),
329+
(PopTempN(1), Sys(SysOp::Close)),
312330
),
313-
&(
314-
[Sys(SysOp::FOpen)],
315-
[Sys(SysOp::FOpen).i(), Dup.i(), PushTempN(1).i()],
316-
[PopTempN(1).i(), Sys(SysOp::Close).i()],
331+
&pat!(
332+
Sys(SysOp::TcpConnect),
333+
(Sys(SysOp::TcpConnect), Dup, PushTempN(1)),
334+
(PopTempN(1), Sys(SysOp::Close)),
317335
),
318-
&(
319-
[Sys(SysOp::FCreate)],
320-
[Sys(SysOp::FCreate).i(), Dup.i(), PushTempN(1).i()],
321-
[PopTempN(1).i(), Sys(SysOp::Close).i()],
322-
),
323-
&(
324-
[Sys(SysOp::TcpConnect)],
325-
[Sys(SysOp::TcpConnect).i(), Dup.i(), PushTempN(1).i()],
326-
[PopTempN(1).i(), Sys(SysOp::Close).i()],
327-
),
328-
&(
329-
[Sys(SysOp::TcpAccept)],
330-
[Sys(SysOp::TcpAccept).i(), Dup.i(), PushTempN(1).i()],
331-
[PopTempN(1).i(), Sys(SysOp::Close).i()],
336+
&pat!(
337+
Sys(SysOp::TcpAccept),
338+
(Sys(SysOp::TcpAccept), Dup, PushTempN(1)),
339+
(PopTempN(1), Sys(SysOp::Close)),
332340
),
333-
&([Rock], [Rock], [1.i(), Drop.i()]),
334-
&([Surface], [Surface], [1.i(), Drop.i()]),
335-
&([Deep], [Deep], [1.i(), Drop.i()]),
336-
&([Abyss], [Abyss], [1.i(), Drop.i()]),
337-
&([Seabed], [Seabed], [1.i(), Drop.i()]),
341+
&pat!(Rock, Rock, (1, Drop)),
342+
&pat!(Surface, Surface, (1, Drop)),
343+
&pat!(Deep, Deep, (1, Drop)),
344+
&pat!(Abyss, Abyss, (1, Drop)),
345+
&pat!(Seabed, Seabed, (1, Drop)),
338346
&UnderPatternFn(under_from_inverse_pattern),
339347
&UnderPatternFn(under_temp_pattern),
340348
];
@@ -399,14 +407,12 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
399407
None
400408
}
401409

410+
fn box_as_instr(instr: impl AsInstr + 'static) -> Box<dyn AsInstr> {
411+
Box::new(instr)
412+
}
413+
402414
trait AsInstr: fmt::Debug {
403415
fn as_instr(&self, span: usize) -> Instr;
404-
fn i(&self) -> Box<dyn AsInstr>
405-
where
406-
Self: Copy + 'static,
407-
{
408-
Box::new(*self)
409-
}
410416
}
411417

412418
#[derive(Debug, Clone, Copy)]

0 commit comments

Comments
 (0)