diff --git a/src/ops.rs b/src/ops.rs index 505161c..e877f3d 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -196,11 +196,25 @@ impl Mapper<(T,), A> for NoOp { } } +impl Predicate for NoOp { + #[inline(always)] + fn is(_: &I, _: &A) -> bool { + true + } +} + impl, A> ParseImpl for Never { type Output = O; impl_parse!(parse, _await, |__: I, _arg: A| Err(Error::Mismatch)); } +impl Predicate for Never { + #[inline(always)] + fn is(_: &I, _: &A) -> bool { + false + } +} + #[allow(clippy::type_complexity)] pub struct And< T0 = NoOp, @@ -392,6 +406,91 @@ impl< }); } +impl< + I, + T0: Predicate, + T1: Predicate, + T2: Predicate, + T3: Predicate, + T4: Predicate, + T5: Predicate, + T6: Predicate, + T7: Predicate, + T8: Predicate, + T9: Predicate, + T10: Predicate, + T11: Predicate, + T12: Predicate, + T13: Predicate, + T14: Predicate, + T15: Predicate, + T16: Predicate, + T17: Predicate, + T18: Predicate, + T19: Predicate, + T20: Predicate, + T21: Predicate, + T22: Predicate, + T23: Predicate, + T24: Predicate, + T25: Predicate, + T26: Predicate, + T27: Predicate, + T28: Predicate, + T29: Predicate, + T30: Predicate, + T31: Predicate, + A, + > Predicate + for And< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30, + T31, + > +{ + #[inline(always)] + fn is(v: &I, a: &A) -> bool { + macro_rules! impl_is { + ($($t:ty),*$(,)?) => { + $(<$t>::is(v, a))&&* + }; + } + impl_is!( + T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, + T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, + ) + } +} + #[allow(clippy::type_complexity)] pub struct Or< T0 = Never, @@ -575,6 +674,91 @@ impl< }); } +impl< + I, + T0: Predicate, + T1: Predicate, + T2: Predicate, + T3: Predicate, + T4: Predicate, + T5: Predicate, + T6: Predicate, + T7: Predicate, + T8: Predicate, + T9: Predicate, + T10: Predicate, + T11: Predicate, + T12: Predicate, + T13: Predicate, + T14: Predicate, + T15: Predicate, + T16: Predicate, + T17: Predicate, + T18: Predicate, + T19: Predicate, + T20: Predicate, + T21: Predicate, + T22: Predicate, + T23: Predicate, + T24: Predicate, + T25: Predicate, + T26: Predicate, + T27: Predicate, + T28: Predicate, + T29: Predicate, + T30: Predicate, + T31: Predicate, + A, + > Predicate + for Or< + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, + T12, + T13, + T14, + T15, + T16, + T17, + T18, + T19, + T20, + T21, + T22, + T23, + T24, + T25, + T26, + T27, + T28, + T29, + T30, + T31, + > +{ + #[inline(always)] + fn is(v: &I, a: &A) -> bool { + macro_rules! impl_is { + ($($t:ty),*$(,)?) => { + $(<$t>::is(v, a))||* + }; + } + impl_is!( + T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, + T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, + ) + } +} + pub struct Repeat(PhantomData); impl, O, A, const MIN: usize, const MAX: usize> ParseImpl