Skip to main content

ct_regex_internal/matcher/
composite.rs

1use std::fmt::{self, Debug};
2use std::hash::{Hash};
3use std::iter::{Chain, FusedIterator};
4use std::marker::PhantomData;
5
6use crate::expr::IndexedCaptures;
7use crate::haystack::{HaystackItem, HaystackOf};
8use crate::matcher::Matcher;
9
10#[derive(#[automatically_derived]
impl<I: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<I>, B: ::core::default::Default + Matcher<I>>
    ::core::default::Default for Or<I, A, B> {
    #[inline]
    fn default() -> Or<I, A, B> {
        Or(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}Default, #[automatically_derived]
impl<I: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<I>, B: ::core::clone::Clone + Matcher<I>> ::core::clone::Clone for
    Or<I, A, B> {
    #[inline]
    fn clone(&self) -> Or<I, A, B> {
        Or(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2))
    }
}Clone, #[automatically_derived]
impl<I: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<I>, B: ::core::marker::Copy + Matcher<I>> ::core::marker::Copy for
    Or<I, A, B> {
}Copy)]
11pub struct Or<I: HaystackItem, A: Matcher<I>, B: Matcher<I>>(
12    pub PhantomData<I>,
13    pub PhantomData<A>,
14    pub PhantomData<B>,
15);
16
17pub type AllMatchesOr<'a, I, H, A, B> = Chain<
18    <A as Matcher<I>>::AllMatches<'a, H>,
19    <B as Matcher<I>>::AllMatches<'a, H>
20>;
21pub type AllCapturesOr<'a, I, H, A, B> = Chain<
22    <A as Matcher<I>>::AllCaptures<'a, H>,
23    <B as Matcher<I>>::AllCaptures<'a, H>
24>;
25
26impl<I: HaystackItem, A: Matcher<I>, B: Matcher<I>> Matcher<I> for Or<I, A, B> {
27    type AllMatches<'a, H: HaystackOf<'a, I>> = AllMatchesOr<'a, I, H, A, B>;
28    type AllCaptures<'a, H: HaystackOf<'a, I>> = AllCapturesOr<'a, I, H, A, B>;
29
30    fn matches<'a, H: HaystackOf<'a, I>>(hay: &mut H) -> bool {
31        let start = hay.index();
32
33        if A::matches(hay) {
34            true
35        } else {
36            hay.rollback(start);
37            B::matches(hay)
38        }
39    }
40
41    // /(a*|b*)c/ should prefer aa, a, bb, b -> vec![b, bb, a, aa]
42    fn all_matches<'a, H: HaystackOf<'a, I>>(hay: &mut H) -> Self::AllMatches<'a, H> {
43        let state_fork = hay.index();
44        // There is no reversing anymore, yield elements in order of greediest to least greedy.
45        let a_matches = A::all_matches(hay);
46        hay.rollback(state_fork);
47        a_matches.chain(B::all_matches(hay))
48    }
49
50    fn captures<'a, H: HaystackOf<'a, I>>(hay: &mut H, caps: &mut IndexedCaptures) -> bool {
51        let (initial_state, initial_caps) = (hay.index(), caps.clone());
52        if A::captures(hay, caps) {
53            true
54        } else {
55            hay.rollback(initial_state);
56            *caps = initial_caps;
57            B::captures(hay, caps)
58        }
59    }
60
61    fn all_captures<'a, H: HaystackOf<'a, I>>(
62        hay: &mut H,
63        caps: &mut IndexedCaptures,
64    ) -> Self::AllCaptures<'a, H> {
65        let (state_fork, mut caps_fork) = (hay.index(), caps.clone());
66
67        let a_captures = A::all_captures(hay, caps);
68        hay.rollback(state_fork);
69        a_captures.chain(B::all_captures(hay, &mut caps_fork))
70    }
71}
72
73impl<I: HaystackItem, A: Matcher<I>, B: Matcher<I>> Debug for Or<I, A, B> {
74    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
75        f.write_fmt(format_args!("{0:?}|{1:?}", A::default(), B::default()))write!(f, "{:?}|{:?}", A::default(), B::default())
76    }
77}
78
79#[derive(#[automatically_derived]
impl<'a, I: ::core::fmt::Debug + HaystackItem, H: ::core::fmt::Debug +
    HaystackOf<'a, I>, A: ::core::fmt::Debug + Matcher<I>,
    B: ::core::fmt::Debug + Matcher<I>> ::core::fmt::Debug for
    AllMatchesThen<'a, I, H, A, B> where
    A::AllMatches<'a, H>: ::core::fmt::Debug,
    B::AllMatches<'a, H>: ::core::fmt::Debug {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "AllMatchesThen", "a_matches", &self.a_matches, "b_matches",
            &self.b_matches, "hay", &&self.hay)
    }
}Debug, #[automatically_derived]
impl<'a, I: ::core::clone::Clone + HaystackItem, H: ::core::clone::Clone +
    HaystackOf<'a, I>, A: ::core::clone::Clone + Matcher<I>,
    B: ::core::clone::Clone + Matcher<I>> ::core::clone::Clone for
    AllMatchesThen<'a, I, H, A, B> where
    A::AllMatches<'a, H>: ::core::clone::Clone,
    B::AllMatches<'a, H>: ::core::clone::Clone {
    #[inline]
    fn clone(&self) -> AllMatchesThen<'a, I, H, A, B> {
        AllMatchesThen {
            a_matches: ::core::clone::Clone::clone(&self.a_matches),
            b_matches: ::core::clone::Clone::clone(&self.b_matches),
            hay: ::core::clone::Clone::clone(&self.hay),
        }
    }
}Clone, #[automatically_derived]
impl<'a, I: ::core::hash::Hash + HaystackItem, H: ::core::hash::Hash +
    HaystackOf<'a, I>, A: ::core::hash::Hash + Matcher<I>,
    B: ::core::hash::Hash + Matcher<I>> ::core::hash::Hash for
    AllMatchesThen<'a, I, H, A, B> where
    A::AllMatches<'a, H>: ::core::hash::Hash,
    B::AllMatches<'a, H>: ::core::hash::Hash {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.a_matches, state);
        ::core::hash::Hash::hash(&self.b_matches, state);
        ::core::hash::Hash::hash(&self.hay, state)
    }
}Hash)]
80pub struct AllMatchesThen<'a, I: HaystackItem, H: HaystackOf<'a, I>, A: Matcher<I>, B: Matcher<I>> {
81    a_matches: A::AllMatches<'a, H>,
82    b_matches: Option<B::AllMatches<'a, H>>,
83    hay: H,
84}
85
86impl<'a, I, H, A, B> Iterator for AllMatchesThen<'a, I, H, A, B>
87where
88    I: HaystackItem,
89    H: HaystackOf<'a, I>,
90    A: Matcher<I>,
91    B: Matcher<I>,
92{
93    type Item = usize;
94
95    fn next(&mut self) -> Option<Self::Item> {
96        match self.b_matches.as_mut().and_then(Iterator::next) {
97            Some(b) => Some(b),
98            None => {
99                self.hay.rollback(self.a_matches.next()?);
100                self.b_matches = Some(B::all_matches(&mut self.hay));
101                self.next()
102            },
103        }
104    }
105}
106
107impl<'a, I, H, A, B> FusedIterator for AllMatchesThen<'a, I, H, A, B>
108where
109    I: HaystackItem,
110    H: HaystackOf<'a, I>,
111    A: Matcher<I>,
112    B: Matcher<I>,
113{}
114
115#[derive(#[automatically_derived]
impl<'a, I: ::core::fmt::Debug, H: ::core::fmt::Debug, A: ::core::fmt::Debug,
    B: ::core::fmt::Debug> ::core::fmt::Debug for
    AllCapturesThen<'a, I, H, A, B> where I: HaystackItem,
    H: HaystackOf<'a, I>, A: Matcher<I>, B: Matcher<I>,
    A::AllCaptures<'a, H>: ::core::fmt::Debug,
    B::AllCaptures<'a, H>: ::core::fmt::Debug {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "AllCapturesThen", "a_captures", &self.a_captures, "b_captures",
            &self.b_captures, "hay", &&self.hay)
    }
}Debug, #[automatically_derived]
impl<'a, I: ::core::clone::Clone, H: ::core::clone::Clone,
    A: ::core::clone::Clone, B: ::core::clone::Clone> ::core::clone::Clone for
    AllCapturesThen<'a, I, H, A, B> where I: HaystackItem,
    H: HaystackOf<'a, I>, A: Matcher<I>, B: Matcher<I>,
    A::AllCaptures<'a, H>: ::core::clone::Clone,
    B::AllCaptures<'a, H>: ::core::clone::Clone {
    #[inline]
    fn clone(&self) -> AllCapturesThen<'a, I, H, A, B> {
        AllCapturesThen {
            a_captures: ::core::clone::Clone::clone(&self.a_captures),
            b_captures: ::core::clone::Clone::clone(&self.b_captures),
            hay: ::core::clone::Clone::clone(&self.hay),
        }
    }
}Clone, #[automatically_derived]
impl<'a, I: ::core::hash::Hash, H: ::core::hash::Hash, A: ::core::hash::Hash,
    B: ::core::hash::Hash> ::core::hash::Hash for
    AllCapturesThen<'a, I, H, A, B> where I: HaystackItem,
    H: HaystackOf<'a, I>, A: Matcher<I>, B: Matcher<I>,
    A::AllCaptures<'a, H>: ::core::hash::Hash,
    B::AllCaptures<'a, H>: ::core::hash::Hash {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.a_captures, state);
        ::core::hash::Hash::hash(&self.b_captures, state);
        ::core::hash::Hash::hash(&self.hay, state)
    }
}Hash)]
116pub struct AllCapturesThen<'a, I, H, A, B>
117where
118    I: HaystackItem,
119    H: HaystackOf<'a, I>,
120    A: Matcher<I>,
121    B: Matcher<I>,
122{
123    a_captures: A::AllCaptures<'a, H>,
124    b_captures: Option<B::AllCaptures<'a, H>>,
125    hay: H,
126}
127
128impl<'a, I, H, A, B> Iterator for AllCapturesThen<'a, I, H, A, B>
129where
130    I: HaystackItem,
131    H: HaystackOf<'a, I>,
132    A: Matcher<I>,
133    B: Matcher<I>,
134{
135    type Item = (usize, IndexedCaptures);
136
137    fn next(&mut self) -> Option<Self::Item> {
138        match self.b_captures.as_mut().and_then(Iterator::next) {
139            Some(b) => Some(b),
140            None => {
141                let (state_fork, mut caps_fork) = self.a_captures.next()?;
142                self.hay.rollback(state_fork);
143                self.b_captures = Some(B::all_captures(&mut self.hay, &mut caps_fork));
144                self.next()
145            },
146        }
147    }
148}
149
150impl<'a, I, H, A, B> FusedIterator for AllCapturesThen<'a, I, H, A, B>
151where
152    I: HaystackItem,
153    H: HaystackOf<'a, I>,
154    A: Matcher<I>,
155    B: Matcher<I>,
156{}
157
158#[derive(#[automatically_derived]
impl<I: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<I>, B: ::core::default::Default + Matcher<I>>
    ::core::default::Default for Then<I, A, B> {
    #[inline]
    fn default() -> Then<I, A, B> {
        Then(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}Default, #[automatically_derived]
impl<I: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<I>, B: ::core::clone::Clone + Matcher<I>> ::core::clone::Clone for
    Then<I, A, B> {
    #[inline]
    fn clone(&self) -> Then<I, A, B> {
        Then(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2))
    }
}Clone, #[automatically_derived]
impl<I: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<I>, B: ::core::marker::Copy + Matcher<I>> ::core::marker::Copy for
    Then<I, A, B> {
}Copy)]
159pub struct Then<I: HaystackItem, A: Matcher<I>, B: Matcher<I>>(
160    pub PhantomData<I>,
161    pub PhantomData<A>,
162    pub PhantomData<B>,
163);
164
165impl<I: HaystackItem, A: Matcher<I>, B: Matcher<I>> Matcher<I> for Then<I, A, B> {
166    type AllMatches<'a, H: HaystackOf<'a, I>> = AllMatchesThen<'a, I, H, A, B>;
167    type AllCaptures<'a, H: HaystackOf<'a, I>> = AllCapturesThen<'a, I, H, A, B>;
168
169    fn matches<'a, H: HaystackOf<'a, I>>(hay: &mut H) -> bool {
170        if let Some(state_fork) = Self::all_matches(hay).next() {
171            hay.rollback(state_fork);
172            true
173        } else {
174            false
175        }
176    }
177
178    fn all_matches<'a, H: HaystackOf<'a, I>>(hay: &mut H) -> Self::AllMatches<'a, H> {
179        AllMatchesThen {
180            a_matches: A::all_matches(hay),
181            b_matches: None,
182            // The state of hay is unspecified because we're forking. Therefore, we just clone hay
183            // to remove the need for (very) complicated lifetime bounds.
184            hay: hay.clone(),
185        }
186    }
187
188    fn captures<'a, H: HaystackOf<'a, I>>(hay: &mut H, caps: &mut IndexedCaptures) -> bool {
189        if let Some((state_fork, caps_fork)) = Self::all_captures(hay, caps).next() {
190            hay.rollback(state_fork);
191            *caps = caps_fork;
192            true
193        } else {
194            false
195        }
196    }
197
198    fn all_captures<'a, H: HaystackOf<'a, I>>(
199        hay: &mut H,
200        caps: &mut IndexedCaptures,
201    ) -> Self::AllCaptures<'a, H> {
202        AllCapturesThen {
203            a_captures: A::all_captures(hay, caps),
204            b_captures: None,
205            hay: hay.clone(),
206        }
207    }
208}
209
210impl<I: HaystackItem, A: Matcher<I>, B: Matcher<I>> Debug for Then<I, A, B> {
211    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
212        f.write_fmt(format_args!("{0:?}{1:?}", A::default(), B::default()))write!(f, "{:?}{:?}", A::default(), B::default())
213    }
214}
215
216/// Macro to generate chunked Or types (Or4, Or8, Or16, etc.)
217///
218/// Each generated type takes N matchers and combines them pairwise using Or,
219/// then delegates to the combiner type (which has N/2 parameters).
220///
221/// Usage: `define_or_n!(Or4, Or, [A B] [C D]);`
222/// - First arg: name of the new type
223/// - Second arg: the combiner type (Or for Or4, Or4 for Or8, etc.)
224/// - Remaining args: pairs of type parameter names in brackets
225macro_rules! define_paired_n {
226    ($pair:ident, $all_matches:ident, $name:ident, $combiner:ident, $([$a:ident $b:ident])+) => {
227        #[derive(Default, Clone, Copy)]
228        pub struct $name<
229            Z: HaystackItem,
230            $($a: Matcher<Z>, $b: Matcher<Z>),+
231        >(
232            pub PhantomData<Z>,
233            $(pub PhantomData<$a>, pub PhantomData<$b>),+
234        );
235
236        impl<
237            Z: HaystackItem,
238            $($a: Matcher<Z>, $b: Matcher<Z>),+
239        > Matcher<Z> for $name<Z, $($a, $b),+> {
240            type AllMatches<'a, Y: HaystackOf<'a, Z>> = <
241                $combiner::<Z, $($pair<Z, $a, $b>),+> as Matcher<Z>
242            >::AllMatches<'a, Y>;
243
244            type AllCaptures<'a, Y: HaystackOf<'a, Z>> = <
245                $combiner::<Z, $($pair<Z, $a, $b>),+> as Matcher<Z>
246            >::AllCaptures<'a, Y>;
247
248            fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
249                $combiner::<Z, $($pair<Z, $a, $b>),+>::matches(hay)
250            }
251
252            fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> Self::AllMatches<'a, Y> {
253                $combiner::<Z, $($pair<Z, $a, $b>),+>::all_matches(hay)
254            }
255
256            fn captures<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures) -> bool {
257                $combiner::<Z, $($pair<Z, $a, $b>),+>::captures(hay, caps)
258            }
259
260            fn all_captures<'a, Y: HaystackOf<'a, Z>>(
261                hay: &mut Y,
262                caps: &mut IndexedCaptures
263            ) -> Self::AllCaptures<'a, Y> {
264                $combiner::<Z, $($pair<Z, $a, $b>),+>::all_captures(hay, caps)
265            }
266        }
267
268        impl<Z: HaystackItem, $($a: Matcher<Z>, $b: Matcher<Z>),+> Debug for $name<Z, $($a, $b),+> {
269            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
270                write!(f, "{:?}", $combiner::<Z, $($pair<Z, $a, $b>),+>::default())
271            }
272        }
273    };
274}
275
276pub struct Or4<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>>(pub PhantomData<Z>, pub PhantomData<A>, pub PhantomData<B>,
    pub PhantomData<C>, pub PhantomData<D>);
#[automatically_derived]
impl<Z: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<Z>, B: ::core::default::Default + Matcher<Z>,
    C: ::core::default::Default + Matcher<Z>, D: ::core::default::Default +
    Matcher<Z>> ::core::default::Default for Or4<Z, A, B, C, D> {
    #[inline]
    fn default() -> Or4<Z, A, B, C, D> {
        Or4(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}
#[automatically_derived]
impl<Z: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<Z>, B: ::core::clone::Clone + Matcher<Z>,
    C: ::core::clone::Clone + Matcher<Z>, D: ::core::clone::Clone +
    Matcher<Z>> ::core::clone::Clone for Or4<Z, A, B, C, D> {
    #[inline]
    fn clone(&self) -> Or4<Z, A, B, C, D> {
        Or4(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2),
            ::core::clone::Clone::clone(&self.3),
            ::core::clone::Clone::clone(&self.4))
    }
}
#[automatically_derived]
impl<Z: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<Z>, B: ::core::marker::Copy + Matcher<Z>,
    C: ::core::marker::Copy + Matcher<Z>, D: ::core::marker::Copy +
    Matcher<Z>> ::core::marker::Copy for Or4<Z, A, B, C, D> {
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>> Matcher<Z> for Or4<Z, A, B, C, D> {
    type AllMatches<'a, Y: HaystackOf<'a, Z>> =
        <Or<Z, Or<Z, A, B>, Or<Z, C, D>> as Matcher<Z>>::AllMatches<'a, Y>;
    type AllCaptures<'a, Y: HaystackOf<'a, Z>> =
        <Or<Z, Or<Z, A, B>, Or<Z, C, D>> as Matcher<Z>>::AllCaptures<'a, Y>;
    fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
        Or::<Z, Or<Z, A, B>, Or<Z, C, D>>::matches(hay)
    }
    fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y)
        -> Self::AllMatches<'a, Y> {
        Or::<Z, Or<Z, A, B>, Or<Z, C, D>>::all_matches(hay)
    }
    fn captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> bool {
        Or::<Z, Or<Z, A, B>, Or<Z, C, D>>::captures(hay, caps)
    }
    fn all_captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> Self::AllCaptures<'a, Y> {
        Or::<Z, Or<Z, A, B>, Or<Z, C, D>>::all_captures(hay, caps)
    }
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>> Debug for Or4<Z, A, B, C, D> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{0:?}",
                Or::<Z, Or<Z, A, B>, Or<Z, C, D>>::default()))
    }
}define_paired_n!(Or, AllMatchesOr, Or4, Or, [A B] [C D]);
277pub struct Or8<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>,
    H: Matcher<Z>>(pub PhantomData<Z>, pub PhantomData<A>, pub PhantomData<B>,
    pub PhantomData<C>, pub PhantomData<D>, pub PhantomData<E>,
    pub PhantomData<F>, pub PhantomData<G>, pub PhantomData<H>);
#[automatically_derived]
impl<Z: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<Z>, B: ::core::default::Default + Matcher<Z>,
    C: ::core::default::Default + Matcher<Z>, D: ::core::default::Default +
    Matcher<Z>, E: ::core::default::Default + Matcher<Z>,
    F: ::core::default::Default + Matcher<Z>, G: ::core::default::Default +
    Matcher<Z>, H: ::core::default::Default + Matcher<Z>>
    ::core::default::Default for Or8<Z, A, B, C, D, E, F, G, H> {
    #[inline]
    fn default() -> Or8<Z, A, B, C, D, E, F, G, H> {
        Or8(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}
#[automatically_derived]
impl<Z: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<Z>, B: ::core::clone::Clone + Matcher<Z>,
    C: ::core::clone::Clone + Matcher<Z>, D: ::core::clone::Clone +
    Matcher<Z>, E: ::core::clone::Clone + Matcher<Z>,
    F: ::core::clone::Clone + Matcher<Z>, G: ::core::clone::Clone +
    Matcher<Z>, H: ::core::clone::Clone + Matcher<Z>> ::core::clone::Clone for
    Or8<Z, A, B, C, D, E, F, G, H> {
    #[inline]
    fn clone(&self) -> Or8<Z, A, B, C, D, E, F, G, H> {
        Or8(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2),
            ::core::clone::Clone::clone(&self.3),
            ::core::clone::Clone::clone(&self.4),
            ::core::clone::Clone::clone(&self.5),
            ::core::clone::Clone::clone(&self.6),
            ::core::clone::Clone::clone(&self.7),
            ::core::clone::Clone::clone(&self.8))
    }
}
#[automatically_derived]
impl<Z: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<Z>, B: ::core::marker::Copy + Matcher<Z>,
    C: ::core::marker::Copy + Matcher<Z>, D: ::core::marker::Copy +
    Matcher<Z>, E: ::core::marker::Copy + Matcher<Z>,
    F: ::core::marker::Copy + Matcher<Z>, G: ::core::marker::Copy +
    Matcher<Z>, H: ::core::marker::Copy + Matcher<Z>> ::core::marker::Copy for
    Or8<Z, A, B, C, D, E, F, G, H> {
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>>
    Matcher<Z> for Or8<Z, A, B, C, D, E, F, G, H> {
    type AllMatches<'a, Y: HaystackOf<'a, Z>> =
        <Or4<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>> as
        Matcher<Z>>::AllMatches<'a, Y>;
    type AllCaptures<'a, Y: HaystackOf<'a, Z>> =
        <Or4<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>> as
        Matcher<Z>>::AllCaptures<'a, Y>;
    fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
        Or4::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>,
                Or<Z, G, H>>::matches(hay)
    }
    fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y)
        -> Self::AllMatches<'a, Y> {
        Or4::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>,
                Or<Z, G, H>>::all_matches(hay)
    }
    fn captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> bool {
        Or4::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>,
                Or<Z, G, H>>::captures(hay, caps)
    }
    fn all_captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> Self::AllCaptures<'a, Y> {
        Or4::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>,
                Or<Z, G, H>>::all_captures(hay, caps)
    }
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>>
    Debug for Or8<Z, A, B, C, D, E, F, G, H> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{0:?}",
                Or4::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>,
                        Or<Z, G, H>>::default()))
    }
}define_paired_n!(Or, AllMatchesOr, Or8, Or4, [A B] [C D] [E F] [G H]);
278pub struct Or16<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>,
    I: Matcher<Z>, J: Matcher<Z>, K: Matcher<Z>, L: Matcher<Z>, M: Matcher<Z>,
    N: Matcher<Z>, O: Matcher<Z>,
    P: Matcher<Z>>(pub PhantomData<Z>, pub PhantomData<A>, pub PhantomData<B>,
    pub PhantomData<C>, pub PhantomData<D>, pub PhantomData<E>,
    pub PhantomData<F>, pub PhantomData<G>, pub PhantomData<H>,
    pub PhantomData<I>, pub PhantomData<J>, pub PhantomData<K>,
    pub PhantomData<L>, pub PhantomData<M>, pub PhantomData<N>,
    pub PhantomData<O>, pub PhantomData<P>);
#[automatically_derived]
impl<Z: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<Z>, B: ::core::default::Default + Matcher<Z>,
    C: ::core::default::Default + Matcher<Z>, D: ::core::default::Default +
    Matcher<Z>, E: ::core::default::Default + Matcher<Z>,
    F: ::core::default::Default + Matcher<Z>, G: ::core::default::Default +
    Matcher<Z>, H: ::core::default::Default + Matcher<Z>,
    I: ::core::default::Default + Matcher<Z>, J: ::core::default::Default +
    Matcher<Z>, K: ::core::default::Default + Matcher<Z>,
    L: ::core::default::Default + Matcher<Z>, M: ::core::default::Default +
    Matcher<Z>, N: ::core::default::Default + Matcher<Z>,
    O: ::core::default::Default + Matcher<Z>, P: ::core::default::Default +
    Matcher<Z>> ::core::default::Default for
    Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    #[inline]
    fn default() -> Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
        Or16(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}
#[automatically_derived]
impl<Z: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<Z>, B: ::core::clone::Clone + Matcher<Z>,
    C: ::core::clone::Clone + Matcher<Z>, D: ::core::clone::Clone +
    Matcher<Z>, E: ::core::clone::Clone + Matcher<Z>,
    F: ::core::clone::Clone + Matcher<Z>, G: ::core::clone::Clone +
    Matcher<Z>, H: ::core::clone::Clone + Matcher<Z>,
    I: ::core::clone::Clone + Matcher<Z>, J: ::core::clone::Clone +
    Matcher<Z>, K: ::core::clone::Clone + Matcher<Z>,
    L: ::core::clone::Clone + Matcher<Z>, M: ::core::clone::Clone +
    Matcher<Z>, N: ::core::clone::Clone + Matcher<Z>,
    O: ::core::clone::Clone + Matcher<Z>, P: ::core::clone::Clone +
    Matcher<Z>> ::core::clone::Clone for
    Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    #[inline]
    fn clone(&self)
        -> Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
        Or16(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2),
            ::core::clone::Clone::clone(&self.3),
            ::core::clone::Clone::clone(&self.4),
            ::core::clone::Clone::clone(&self.5),
            ::core::clone::Clone::clone(&self.6),
            ::core::clone::Clone::clone(&self.7),
            ::core::clone::Clone::clone(&self.8),
            ::core::clone::Clone::clone(&self.9),
            ::core::clone::Clone::clone(&self.10),
            ::core::clone::Clone::clone(&self.11),
            ::core::clone::Clone::clone(&self.12),
            ::core::clone::Clone::clone(&self.13),
            ::core::clone::Clone::clone(&self.14),
            ::core::clone::Clone::clone(&self.15),
            ::core::clone::Clone::clone(&self.16))
    }
}
#[automatically_derived]
impl<Z: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<Z>, B: ::core::marker::Copy + Matcher<Z>,
    C: ::core::marker::Copy + Matcher<Z>, D: ::core::marker::Copy +
    Matcher<Z>, E: ::core::marker::Copy + Matcher<Z>,
    F: ::core::marker::Copy + Matcher<Z>, G: ::core::marker::Copy +
    Matcher<Z>, H: ::core::marker::Copy + Matcher<Z>,
    I: ::core::marker::Copy + Matcher<Z>, J: ::core::marker::Copy +
    Matcher<Z>, K: ::core::marker::Copy + Matcher<Z>,
    L: ::core::marker::Copy + Matcher<Z>, M: ::core::marker::Copy +
    Matcher<Z>, N: ::core::marker::Copy + Matcher<Z>,
    O: ::core::marker::Copy + Matcher<Z>, P: ::core::marker::Copy +
    Matcher<Z>> ::core::marker::Copy for
    Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>,
    I: Matcher<Z>, J: Matcher<Z>, K: Matcher<Z>, L: Matcher<Z>, M: Matcher<Z>,
    N: Matcher<Z>, O: Matcher<Z>, P: Matcher<Z>> Matcher<Z> for
    Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    type AllMatches<'a, Y: HaystackOf<'a, Z>> =
        <Or8<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
        Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>, Or<Z, O, P>> as
        Matcher<Z>>::AllMatches<'a, Y>;
    type AllCaptures<'a, Y: HaystackOf<'a, Z>> =
        <Or8<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
        Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>, Or<Z, O, P>> as
        Matcher<Z>>::AllCaptures<'a, Y>;
    fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
        Or8::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
                Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>,
                Or<Z, O, P>>::matches(hay)
    }
    fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y)
        -> Self::AllMatches<'a, Y> {
        Or8::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
                Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>,
                Or<Z, O, P>>::all_matches(hay)
    }
    fn captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> bool {
        Or8::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
                Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>,
                Or<Z, O, P>>::captures(hay, caps)
    }
    fn all_captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> Self::AllCaptures<'a, Y> {
        Or8::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
                Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>,
                Or<Z, O, P>>::all_captures(hay, caps)
    }
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>,
    I: Matcher<Z>, J: Matcher<Z>, K: Matcher<Z>, L: Matcher<Z>, M: Matcher<Z>,
    N: Matcher<Z>, O: Matcher<Z>, P: Matcher<Z>> Debug for
    Or16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{0:?}",
                Or8::<Z, Or<Z, A, B>, Or<Z, C, D>, Or<Z, E, F>, Or<Z, G, H>,
                        Or<Z, I, J>, Or<Z, K, L>, Or<Z, M, N>,
                        Or<Z, O, P>>::default()))
    }
}define_paired_n!(Or, AllMatchesOr, Or16, Or8, [A B] [C D] [E F] [G H] [I J] [K L] [M N] [O P]);
279
280pub struct Then4<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>>(pub PhantomData<Z>, pub PhantomData<A>, pub PhantomData<B>,
    pub PhantomData<C>, pub PhantomData<D>);
#[automatically_derived]
impl<Z: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<Z>, B: ::core::default::Default + Matcher<Z>,
    C: ::core::default::Default + Matcher<Z>, D: ::core::default::Default +
    Matcher<Z>> ::core::default::Default for Then4<Z, A, B, C, D> {
    #[inline]
    fn default() -> Then4<Z, A, B, C, D> {
        Then4(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}
#[automatically_derived]
impl<Z: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<Z>, B: ::core::clone::Clone + Matcher<Z>,
    C: ::core::clone::Clone + Matcher<Z>, D: ::core::clone::Clone +
    Matcher<Z>> ::core::clone::Clone for Then4<Z, A, B, C, D> {
    #[inline]
    fn clone(&self) -> Then4<Z, A, B, C, D> {
        Then4(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2),
            ::core::clone::Clone::clone(&self.3),
            ::core::clone::Clone::clone(&self.4))
    }
}
#[automatically_derived]
impl<Z: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<Z>, B: ::core::marker::Copy + Matcher<Z>,
    C: ::core::marker::Copy + Matcher<Z>, D: ::core::marker::Copy +
    Matcher<Z>> ::core::marker::Copy for Then4<Z, A, B, C, D> {
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>> Matcher<Z> for Then4<Z, A, B, C, D> {
    type AllMatches<'a, Y: HaystackOf<'a, Z>> =
        <Then<Z, Then<Z, A, B>, Then<Z, C, D>> as
        Matcher<Z>>::AllMatches<'a, Y>;
    type AllCaptures<'a, Y: HaystackOf<'a, Z>> =
        <Then<Z, Then<Z, A, B>, Then<Z, C, D>> as
        Matcher<Z>>::AllCaptures<'a, Y>;
    fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
        Then::<Z, Then<Z, A, B>, Then<Z, C, D>>::matches(hay)
    }
    fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y)
        -> Self::AllMatches<'a, Y> {
        Then::<Z, Then<Z, A, B>, Then<Z, C, D>>::all_matches(hay)
    }
    fn captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> bool {
        Then::<Z, Then<Z, A, B>, Then<Z, C, D>>::captures(hay, caps)
    }
    fn all_captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> Self::AllCaptures<'a, Y> {
        Then::<Z, Then<Z, A, B>, Then<Z, C, D>>::all_captures(hay, caps)
    }
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>> Debug for Then4<Z, A, B, C, D> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{0:?}",
                Then::<Z, Then<Z, A, B>, Then<Z, C, D>>::default()))
    }
}define_paired_n!(Then, AllMatchesThen, Then4, Then, [A B] [C D]);
281pub struct Then8<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>,
    H: Matcher<Z>>(pub PhantomData<Z>, pub PhantomData<A>, pub PhantomData<B>,
    pub PhantomData<C>, pub PhantomData<D>, pub PhantomData<E>,
    pub PhantomData<F>, pub PhantomData<G>, pub PhantomData<H>);
#[automatically_derived]
impl<Z: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<Z>, B: ::core::default::Default + Matcher<Z>,
    C: ::core::default::Default + Matcher<Z>, D: ::core::default::Default +
    Matcher<Z>, E: ::core::default::Default + Matcher<Z>,
    F: ::core::default::Default + Matcher<Z>, G: ::core::default::Default +
    Matcher<Z>, H: ::core::default::Default + Matcher<Z>>
    ::core::default::Default for Then8<Z, A, B, C, D, E, F, G, H> {
    #[inline]
    fn default() -> Then8<Z, A, B, C, D, E, F, G, H> {
        Then8(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}
#[automatically_derived]
impl<Z: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<Z>, B: ::core::clone::Clone + Matcher<Z>,
    C: ::core::clone::Clone + Matcher<Z>, D: ::core::clone::Clone +
    Matcher<Z>, E: ::core::clone::Clone + Matcher<Z>,
    F: ::core::clone::Clone + Matcher<Z>, G: ::core::clone::Clone +
    Matcher<Z>, H: ::core::clone::Clone + Matcher<Z>> ::core::clone::Clone for
    Then8<Z, A, B, C, D, E, F, G, H> {
    #[inline]
    fn clone(&self) -> Then8<Z, A, B, C, D, E, F, G, H> {
        Then8(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2),
            ::core::clone::Clone::clone(&self.3),
            ::core::clone::Clone::clone(&self.4),
            ::core::clone::Clone::clone(&self.5),
            ::core::clone::Clone::clone(&self.6),
            ::core::clone::Clone::clone(&self.7),
            ::core::clone::Clone::clone(&self.8))
    }
}
#[automatically_derived]
impl<Z: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<Z>, B: ::core::marker::Copy + Matcher<Z>,
    C: ::core::marker::Copy + Matcher<Z>, D: ::core::marker::Copy +
    Matcher<Z>, E: ::core::marker::Copy + Matcher<Z>,
    F: ::core::marker::Copy + Matcher<Z>, G: ::core::marker::Copy +
    Matcher<Z>, H: ::core::marker::Copy + Matcher<Z>> ::core::marker::Copy for
    Then8<Z, A, B, C, D, E, F, G, H> {
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>>
    Matcher<Z> for Then8<Z, A, B, C, D, E, F, G, H> {
    type AllMatches<'a, Y: HaystackOf<'a, Z>> =
        <Then4<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>>
        as Matcher<Z>>::AllMatches<'a, Y>;
    type AllCaptures<'a, Y: HaystackOf<'a, Z>> =
        <Then4<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>>
        as Matcher<Z>>::AllCaptures<'a, Y>;
    fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
        Then4::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>,
                Then<Z, G, H>>::matches(hay)
    }
    fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y)
        -> Self::AllMatches<'a, Y> {
        Then4::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>,
                Then<Z, G, H>>::all_matches(hay)
    }
    fn captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> bool {
        Then4::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>,
                Then<Z, G, H>>::captures(hay, caps)
    }
    fn all_captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> Self::AllCaptures<'a, Y> {
        Then4::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>,
                Then<Z, G, H>>::all_captures(hay, caps)
    }
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>>
    Debug for Then8<Z, A, B, C, D, E, F, G, H> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{0:?}",
                Then4::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>,
                        Then<Z, G, H>>::default()))
    }
}define_paired_n!(Then, AllMatchesThen, Then8, Then4, [A B] [C D] [E F] [G H]);
282pub struct Then16<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>,
    C: Matcher<Z>, D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>,
    H: Matcher<Z>, I: Matcher<Z>, J: Matcher<Z>, K: Matcher<Z>, L: Matcher<Z>,
    M: Matcher<Z>, N: Matcher<Z>, O: Matcher<Z>,
    P: Matcher<Z>>(pub PhantomData<Z>, pub PhantomData<A>, pub PhantomData<B>,
    pub PhantomData<C>, pub PhantomData<D>, pub PhantomData<E>,
    pub PhantomData<F>, pub PhantomData<G>, pub PhantomData<H>,
    pub PhantomData<I>, pub PhantomData<J>, pub PhantomData<K>,
    pub PhantomData<L>, pub PhantomData<M>, pub PhantomData<N>,
    pub PhantomData<O>, pub PhantomData<P>);
#[automatically_derived]
impl<Z: ::core::default::Default + HaystackItem, A: ::core::default::Default +
    Matcher<Z>, B: ::core::default::Default + Matcher<Z>,
    C: ::core::default::Default + Matcher<Z>, D: ::core::default::Default +
    Matcher<Z>, E: ::core::default::Default + Matcher<Z>,
    F: ::core::default::Default + Matcher<Z>, G: ::core::default::Default +
    Matcher<Z>, H: ::core::default::Default + Matcher<Z>,
    I: ::core::default::Default + Matcher<Z>, J: ::core::default::Default +
    Matcher<Z>, K: ::core::default::Default + Matcher<Z>,
    L: ::core::default::Default + Matcher<Z>, M: ::core::default::Default +
    Matcher<Z>, N: ::core::default::Default + Matcher<Z>,
    O: ::core::default::Default + Matcher<Z>, P: ::core::default::Default +
    Matcher<Z>> ::core::default::Default for
    Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    #[inline]
    fn default()
        -> Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
        Then16(::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default(),
            ::core::default::Default::default())
    }
}
#[automatically_derived]
impl<Z: ::core::clone::Clone + HaystackItem, A: ::core::clone::Clone +
    Matcher<Z>, B: ::core::clone::Clone + Matcher<Z>,
    C: ::core::clone::Clone + Matcher<Z>, D: ::core::clone::Clone +
    Matcher<Z>, E: ::core::clone::Clone + Matcher<Z>,
    F: ::core::clone::Clone + Matcher<Z>, G: ::core::clone::Clone +
    Matcher<Z>, H: ::core::clone::Clone + Matcher<Z>,
    I: ::core::clone::Clone + Matcher<Z>, J: ::core::clone::Clone +
    Matcher<Z>, K: ::core::clone::Clone + Matcher<Z>,
    L: ::core::clone::Clone + Matcher<Z>, M: ::core::clone::Clone +
    Matcher<Z>, N: ::core::clone::Clone + Matcher<Z>,
    O: ::core::clone::Clone + Matcher<Z>, P: ::core::clone::Clone +
    Matcher<Z>> ::core::clone::Clone for
    Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    #[inline]
    fn clone(&self)
        -> Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
        Then16(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1),
            ::core::clone::Clone::clone(&self.2),
            ::core::clone::Clone::clone(&self.3),
            ::core::clone::Clone::clone(&self.4),
            ::core::clone::Clone::clone(&self.5),
            ::core::clone::Clone::clone(&self.6),
            ::core::clone::Clone::clone(&self.7),
            ::core::clone::Clone::clone(&self.8),
            ::core::clone::Clone::clone(&self.9),
            ::core::clone::Clone::clone(&self.10),
            ::core::clone::Clone::clone(&self.11),
            ::core::clone::Clone::clone(&self.12),
            ::core::clone::Clone::clone(&self.13),
            ::core::clone::Clone::clone(&self.14),
            ::core::clone::Clone::clone(&self.15),
            ::core::clone::Clone::clone(&self.16))
    }
}
#[automatically_derived]
impl<Z: ::core::marker::Copy + HaystackItem, A: ::core::marker::Copy +
    Matcher<Z>, B: ::core::marker::Copy + Matcher<Z>,
    C: ::core::marker::Copy + Matcher<Z>, D: ::core::marker::Copy +
    Matcher<Z>, E: ::core::marker::Copy + Matcher<Z>,
    F: ::core::marker::Copy + Matcher<Z>, G: ::core::marker::Copy +
    Matcher<Z>, H: ::core::marker::Copy + Matcher<Z>,
    I: ::core::marker::Copy + Matcher<Z>, J: ::core::marker::Copy +
    Matcher<Z>, K: ::core::marker::Copy + Matcher<Z>,
    L: ::core::marker::Copy + Matcher<Z>, M: ::core::marker::Copy +
    Matcher<Z>, N: ::core::marker::Copy + Matcher<Z>,
    O: ::core::marker::Copy + Matcher<Z>, P: ::core::marker::Copy +
    Matcher<Z>> ::core::marker::Copy for
    Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>,
    I: Matcher<Z>, J: Matcher<Z>, K: Matcher<Z>, L: Matcher<Z>, M: Matcher<Z>,
    N: Matcher<Z>, O: Matcher<Z>, P: Matcher<Z>> Matcher<Z> for
    Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    type AllMatches<'a, Y: HaystackOf<'a, Z>> =
        <Then8<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>,
        Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>, Then<Z, O, P>> as
        Matcher<Z>>::AllMatches<'a, Y>;
    type AllCaptures<'a, Y: HaystackOf<'a, Z>> =
        <Then8<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>,
        Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>, Then<Z, O, P>> as
        Matcher<Z>>::AllCaptures<'a, Y>;
    fn matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y) -> bool {
        Then8::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>,
                Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>,
                Then<Z, O, P>>::matches(hay)
    }
    fn all_matches<'a, Y: HaystackOf<'a, Z>>(hay: &mut Y)
        -> Self::AllMatches<'a, Y> {
        Then8::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>,
                Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>,
                Then<Z, O, P>>::all_matches(hay)
    }
    fn captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> bool {
        Then8::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>,
                Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>,
                Then<Z, O, P>>::captures(hay, caps)
    }
    fn all_captures<'a,
        Y: HaystackOf<'a, Z>>(hay: &mut Y, caps: &mut IndexedCaptures)
        -> Self::AllCaptures<'a, Y> {
        Then8::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>, Then<Z, G, H>,
                Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>,
                Then<Z, O, P>>::all_captures(hay, caps)
    }
}
impl<Z: HaystackItem, A: Matcher<Z>, B: Matcher<Z>, C: Matcher<Z>,
    D: Matcher<Z>, E: Matcher<Z>, F: Matcher<Z>, G: Matcher<Z>, H: Matcher<Z>,
    I: Matcher<Z>, J: Matcher<Z>, K: Matcher<Z>, L: Matcher<Z>, M: Matcher<Z>,
    N: Matcher<Z>, O: Matcher<Z>, P: Matcher<Z>> Debug for
    Then16<Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{0:?}",
                Then8::<Z, Then<Z, A, B>, Then<Z, C, D>, Then<Z, E, F>,
                        Then<Z, G, H>, Then<Z, I, J>, Then<Z, K, L>, Then<Z, M, N>,
                        Then<Z, O, P>>::default()))
    }
}define_paired_n!(Then, AllMatchesThen, Then16, Then8, [A B] [C D] [E F] [G H] [I J] [K L] [M N] [O P]);