Skip to main content

object_rainbow/impls/
tuple.rs

1use typenum::tarr;
2
3use crate::*;
4
5impl<A: InlineOutput, B: ToOutput> ToOutput for (A, B) {
6    fn to_output(&self, output: &mut dyn Output) {
7        self.0.to_output(output);
8        self.1.to_output(output);
9    }
10}
11
12impl<A: InlineOutput, B: InlineOutput> InlineOutput for (A, B) {}
13
14impl<A: ListHashes, B: ListHashes> ListHashes for (A, B) {
15    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
16        self.0.list_hashes(f);
17        self.1.list_hashes(f);
18    }
19}
20
21impl<A: Topological, B: Topological> Topological for (A, B) {
22    fn traverse(&self, visitor: &mut impl PointVisitor) {
23        self.0.traverse(visitor);
24        self.1.traverse(visitor);
25    }
26}
27
28impl<A: Tagged, B: Tagged> Tagged for (A, B) {
29    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS]);
30}
31
32impl<A: Size, B: Size> Size for (A, B)
33where
34    tarr![A::Size, B::Size,]: typenum::FoldAdd<Output: Unsigned>,
35{
36    const SIZE: usize = A::SIZE + B::SIZE;
37
38    type Size = <tarr![A::Size, B::Size,] as typenum::FoldAdd>::Output;
39}
40
41impl<II: ParseInput, A: ParseInline<II>, B: Parse<II>> Parse<II> for (A, B) {
42    fn parse(mut input: II) -> crate::Result<Self> {
43        Ok((input.parse_inline()?, input.parse()?))
44    }
45}
46
47impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>> ParseInline<II> for (A, B) {
48    fn parse_inline(input: &mut II) -> crate::Result<Self> {
49        Ok((input.parse_inline()?, input.parse_inline()?))
50    }
51}
52
53impl<A: MaybeHasNiche, B: MaybeHasNiche> MaybeHasNiche for (A, B) {
54    type MnArray = tarr![A::MnArray, B::MnArray,];
55}
56
57impl<A: InlineOutput, B: InlineOutput, C: ToOutput> ToOutput for (A, B, C) {
58    fn to_output(&self, output: &mut dyn Output) {
59        self.0.to_output(output);
60        self.1.to_output(output);
61        self.2.to_output(output);
62    }
63}
64
65impl<A: InlineOutput, B: InlineOutput, C: InlineOutput> InlineOutput for (A, B, C) {}
66
67impl<A: ListHashes, B: ListHashes, C: ListHashes> ListHashes for (A, B, C) {
68    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
69        self.0.list_hashes(f);
70        self.1.list_hashes(f);
71        self.2.list_hashes(f);
72    }
73}
74
75impl<A: Topological, B: Topological, C: Topological> Topological for (A, B, C) {
76    fn traverse(&self, visitor: &mut impl PointVisitor) {
77        self.0.traverse(visitor);
78        self.1.traverse(visitor);
79        self.2.traverse(visitor);
80    }
81}
82
83impl<A: Tagged, B: Tagged, C: Tagged> Tagged for (A, B, C) {
84    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS, &C::TAGS]);
85}
86
87impl<A: Size, B: Size, C: Size> Size for (A, B, C)
88where
89    tarr![A::Size, B::Size, C::Size,]: typenum::FoldAdd<Output: Unsigned>,
90{
91    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE;
92
93    type Size = <tarr![A::Size, B::Size, C::Size,] as typenum::FoldAdd>::Output;
94}
95
96impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: Parse<II>> Parse<II> for (A, B, C) {
97    fn parse(mut input: II) -> crate::Result<Self> {
98        Ok((input.parse_inline()?, input.parse_inline()?, input.parse()?))
99    }
100}
101
102impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: ParseInline<II>> ParseInline<II>
103    for (A, B, C)
104{
105    fn parse_inline(input: &mut II) -> crate::Result<Self> {
106        Ok((
107            input.parse_inline()?,
108            input.parse_inline()?,
109            input.parse_inline()?,
110        ))
111    }
112}
113
114impl<A: MaybeHasNiche, B: MaybeHasNiche, C: MaybeHasNiche> MaybeHasNiche for (A, B, C) {
115    type MnArray = tarr![A::MnArray, B::MnArray, C::MnArray,];
116}
117
118impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: ToOutput> ToOutput for (A, B, C, D) {
119    fn to_output(&self, output: &mut dyn Output) {
120        self.0.to_output(output);
121        self.1.to_output(output);
122        self.2.to_output(output);
123        self.3.to_output(output);
124    }
125}
126
127impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: InlineOutput> InlineOutput
128    for (A, B, C, D)
129{
130}
131
132impl<A: ListHashes, B: ListHashes, C: ListHashes, D: ListHashes> ListHashes for (A, B, C, D) {
133    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
134        self.0.list_hashes(f);
135        self.1.list_hashes(f);
136        self.2.list_hashes(f);
137        self.3.list_hashes(f);
138    }
139}
140
141impl<A: Topological, B: Topological, C: Topological, D: Topological> Topological for (A, B, C, D) {
142    fn traverse(&self, visitor: &mut impl PointVisitor) {
143        self.0.traverse(visitor);
144        self.1.traverse(visitor);
145        self.2.traverse(visitor);
146        self.3.traverse(visitor);
147    }
148}
149
150impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged> Tagged for (A, B, C, D) {
151    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS, &C::TAGS, &D::TAGS]);
152}
153
154impl<A: Size, B: Size, C: Size, D: Size> Size for (A, B, C, D)
155where
156    tarr![A::Size, B::Size, C::Size, D::Size,]: typenum::FoldAdd<Output: Unsigned>,
157{
158    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE;
159
160    type Size = <tarr![A::Size, B::Size, C::Size, D::Size,] as typenum::FoldAdd>::Output;
161}
162
163impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: ParseInline<II>, D: Parse<II>>
164    Parse<II> for (A, B, C, D)
165{
166    fn parse(mut input: II) -> crate::Result<Self> {
167        Ok((
168            input.parse_inline()?,
169            input.parse_inline()?,
170            input.parse_inline()?,
171            input.parse()?,
172        ))
173    }
174}
175
176impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: ParseInline<II>, D: ParseInline<II>>
177    ParseInline<II> for (A, B, C, D)
178{
179    fn parse_inline(input: &mut II) -> crate::Result<Self> {
180        Ok((
181            input.parse_inline()?,
182            input.parse_inline()?,
183            input.parse_inline()?,
184            input.parse_inline()?,
185        ))
186    }
187}
188
189impl<A: MaybeHasNiche, B: MaybeHasNiche, C: MaybeHasNiche, D: MaybeHasNiche> MaybeHasNiche
190    for (A, B, C, D)
191{
192    type MnArray = tarr![A::MnArray, B::MnArray, C::MnArray, D::MnArray,];
193}
194
195impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: InlineOutput, E: ToOutput> ToOutput
196    for (A, B, C, D, E)
197{
198    fn to_output(&self, output: &mut dyn Output) {
199        self.0.to_output(output);
200        self.1.to_output(output);
201        self.2.to_output(output);
202        self.3.to_output(output);
203        self.4.to_output(output);
204    }
205}
206
207impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: InlineOutput, E: InlineOutput>
208    InlineOutput for (A, B, C, D, E)
209{
210}
211
212impl<A: ListHashes, B: ListHashes, C: ListHashes, D: ListHashes, E: ListHashes> ListHashes
213    for (A, B, C, D, E)
214{
215    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
216        self.0.list_hashes(f);
217        self.1.list_hashes(f);
218        self.2.list_hashes(f);
219        self.3.list_hashes(f);
220        self.4.list_hashes(f);
221    }
222}
223
224impl<A: Topological, B: Topological, C: Topological, D: Topological, E: Topological> Topological
225    for (A, B, C, D, E)
226{
227    fn traverse(&self, visitor: &mut impl PointVisitor) {
228        self.0.traverse(visitor);
229        self.1.traverse(visitor);
230        self.2.traverse(visitor);
231        self.3.traverse(visitor);
232        self.4.traverse(visitor);
233    }
234}
235
236impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged> Tagged for (A, B, C, D, E) {
237    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS, &C::TAGS, &D::TAGS, &E::TAGS]);
238}
239
240impl<A: Size, B: Size, C: Size, D: Size, E: Size> Size for (A, B, C, D, E)
241where
242    tarr![A::Size, B::Size, C::Size, D::Size, E::Size,]: typenum::FoldAdd<Output: Unsigned>,
243{
244    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE;
245
246    type Size = <tarr![A::Size, B::Size, C::Size, D::Size, E::Size,] as typenum::FoldAdd>::Output;
247}
248
249impl<
250    II: ParseInput,
251    A: ParseInline<II>,
252    B: ParseInline<II>,
253    C: ParseInline<II>,
254    D: ParseInline<II>,
255    E: Parse<II>,
256> Parse<II> for (A, B, C, D, E)
257{
258    fn parse(mut input: II) -> crate::Result<Self> {
259        Ok((
260            input.parse_inline()?,
261            input.parse_inline()?,
262            input.parse_inline()?,
263            input.parse_inline()?,
264            input.parse()?,
265        ))
266    }
267}
268
269impl<
270    II: ParseInput,
271    A: ParseInline<II>,
272    B: ParseInline<II>,
273    C: ParseInline<II>,
274    D: ParseInline<II>,
275    E: ParseInline<II>,
276> ParseInline<II> for (A, B, C, D, E)
277{
278    fn parse_inline(input: &mut II) -> crate::Result<Self> {
279        Ok((
280            input.parse_inline()?,
281            input.parse_inline()?,
282            input.parse_inline()?,
283            input.parse_inline()?,
284            input.parse_inline()?,
285        ))
286    }
287}
288
289impl<A: MaybeHasNiche, B: MaybeHasNiche, C: MaybeHasNiche, D: MaybeHasNiche, E: MaybeHasNiche>
290    MaybeHasNiche for (A, B, C, D, E)
291{
292    type MnArray = tarr![A::MnArray, B::MnArray, C::MnArray, D::MnArray, E::MnArray,];
293}
294
295impl<
296    A: InlineOutput,
297    B: InlineOutput,
298    C: InlineOutput,
299    D: InlineOutput,
300    E: InlineOutput,
301    F: ToOutput,
302> ToOutput for (A, B, C, D, E, F)
303{
304    fn to_output(&self, output: &mut dyn Output) {
305        self.0.to_output(output);
306        self.1.to_output(output);
307        self.2.to_output(output);
308        self.3.to_output(output);
309        self.4.to_output(output);
310        self.5.to_output(output);
311    }
312}
313
314impl<
315    A: InlineOutput,
316    B: InlineOutput,
317    C: InlineOutput,
318    D: InlineOutput,
319    E: InlineOutput,
320    F: InlineOutput,
321> InlineOutput for (A, B, C, D, E, F)
322{
323}
324
325impl<A: ListHashes, B: ListHashes, C: ListHashes, D: ListHashes, E: ListHashes, F: ListHashes>
326    ListHashes for (A, B, C, D, E, F)
327{
328    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
329        self.0.list_hashes(f);
330        self.1.list_hashes(f);
331        self.2.list_hashes(f);
332        self.3.list_hashes(f);
333        self.4.list_hashes(f);
334        self.5.list_hashes(f);
335    }
336}
337
338impl<A: Topological, B: Topological, C: Topological, D: Topological, E: Topological, F: Topological>
339    Topological for (A, B, C, D, E, F)
340{
341    fn traverse(&self, visitor: &mut impl PointVisitor) {
342        self.0.traverse(visitor);
343        self.1.traverse(visitor);
344        self.2.traverse(visitor);
345        self.3.traverse(visitor);
346        self.4.traverse(visitor);
347        self.5.traverse(visitor);
348    }
349}
350
351impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged, F: Tagged> Tagged
352    for (A, B, C, D, E, F)
353{
354    const TAGS: Tags = Tags(
355        &[],
356        &[&A::TAGS, &B::TAGS, &C::TAGS, &D::TAGS, &E::TAGS, &F::TAGS],
357    );
358}
359
360impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size> Size for (A, B, C, D, E, F)
361where
362    tarr![A::Size, B::Size, C::Size, D::Size, E::Size, F::Size,]:
363        typenum::FoldAdd<Output: Unsigned>,
364{
365    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE;
366
367    type Size =
368        <tarr![A::Size, B::Size, C::Size, D::Size, E::Size, F::Size,] as typenum::FoldAdd>::Output;
369}
370
371impl<
372    II: ParseInput,
373    A: ParseInline<II>,
374    B: ParseInline<II>,
375    C: ParseInline<II>,
376    D: ParseInline<II>,
377    E: ParseInline<II>,
378    F: Parse<II>,
379> Parse<II> for (A, B, C, D, E, F)
380{
381    fn parse(mut input: II) -> crate::Result<Self> {
382        Ok((
383            input.parse_inline()?,
384            input.parse_inline()?,
385            input.parse_inline()?,
386            input.parse_inline()?,
387            input.parse_inline()?,
388            input.parse()?,
389        ))
390    }
391}
392
393impl<
394    II: ParseInput,
395    A: ParseInline<II>,
396    B: ParseInline<II>,
397    C: ParseInline<II>,
398    D: ParseInline<II>,
399    E: ParseInline<II>,
400    F: ParseInline<II>,
401> ParseInline<II> for (A, B, C, D, E, F)
402{
403    fn parse_inline(input: &mut II) -> crate::Result<Self> {
404        Ok((
405            input.parse_inline()?,
406            input.parse_inline()?,
407            input.parse_inline()?,
408            input.parse_inline()?,
409            input.parse_inline()?,
410            input.parse_inline()?,
411        ))
412    }
413}
414
415impl<
416    A: MaybeHasNiche,
417    B: MaybeHasNiche,
418    C: MaybeHasNiche,
419    D: MaybeHasNiche,
420    E: MaybeHasNiche,
421    F: MaybeHasNiche,
422> MaybeHasNiche for (A, B, C, D, E, F)
423{
424    type MnArray = tarr![
425        A::MnArray,
426        B::MnArray,
427        C::MnArray,
428        D::MnArray,
429        E::MnArray,
430        F::MnArray,
431    ];
432}
433
434impl<
435    A: InlineOutput,
436    B: InlineOutput,
437    C: InlineOutput,
438    D: InlineOutput,
439    E: InlineOutput,
440    F: InlineOutput,
441    G: ToOutput,
442> ToOutput for (A, B, C, D, E, F, G)
443{
444    fn to_output(&self, output: &mut dyn Output) {
445        self.0.to_output(output);
446        self.1.to_output(output);
447        self.2.to_output(output);
448        self.3.to_output(output);
449        self.4.to_output(output);
450        self.5.to_output(output);
451        self.6.to_output(output);
452    }
453}
454
455impl<
456    A: InlineOutput,
457    B: InlineOutput,
458    C: InlineOutput,
459    D: InlineOutput,
460    E: InlineOutput,
461    F: InlineOutput,
462    G: InlineOutput,
463> InlineOutput for (A, B, C, D, E, F, G)
464{
465}
466
467impl<
468    A: ListHashes,
469    B: ListHashes,
470    C: ListHashes,
471    D: ListHashes,
472    E: ListHashes,
473    F: ListHashes,
474    G: ListHashes,
475> ListHashes for (A, B, C, D, E, F, G)
476{
477    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
478        self.0.list_hashes(f);
479        self.1.list_hashes(f);
480        self.2.list_hashes(f);
481        self.3.list_hashes(f);
482        self.4.list_hashes(f);
483        self.5.list_hashes(f);
484        self.6.list_hashes(f);
485    }
486}
487
488impl<
489    A: Topological,
490    B: Topological,
491    C: Topological,
492    D: Topological,
493    E: Topological,
494    F: Topological,
495    G: Topological,
496> Topological for (A, B, C, D, E, F, G)
497{
498    fn traverse(&self, visitor: &mut impl PointVisitor) {
499        self.0.traverse(visitor);
500        self.1.traverse(visitor);
501        self.2.traverse(visitor);
502        self.3.traverse(visitor);
503        self.4.traverse(visitor);
504        self.5.traverse(visitor);
505        self.6.traverse(visitor);
506    }
507}
508
509impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged, F: Tagged, G: Tagged> Tagged
510    for (A, B, C, D, E, F, G)
511{
512    const TAGS: Tags = Tags(
513        &[],
514        &[
515            &A::TAGS,
516            &B::TAGS,
517            &C::TAGS,
518            &D::TAGS,
519            &E::TAGS,
520            &F::TAGS,
521            &G::TAGS,
522        ],
523    );
524}
525
526impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size> Size for (A, B, C, D, E, F, G)
527where
528    tarr![
529        A::Size,
530        B::Size,
531        C::Size,
532        D::Size,
533        E::Size,
534        F::Size,
535        G::Size,
536    ]: typenum::FoldAdd<Output: Unsigned>,
537{
538    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE + G::SIZE;
539
540    type Size = <tarr![
541        A::Size,
542        B::Size,
543        C::Size,
544        D::Size,
545        E::Size,
546        F::Size,
547        G::Size,
548    ] as typenum::FoldAdd>::Output;
549}
550
551impl<
552    II: ParseInput,
553    A: ParseInline<II>,
554    B: ParseInline<II>,
555    C: ParseInline<II>,
556    D: ParseInline<II>,
557    E: ParseInline<II>,
558    F: ParseInline<II>,
559    G: Parse<II>,
560> Parse<II> for (A, B, C, D, E, F, G)
561{
562    fn parse(mut input: II) -> crate::Result<Self> {
563        Ok((
564            input.parse_inline()?,
565            input.parse_inline()?,
566            input.parse_inline()?,
567            input.parse_inline()?,
568            input.parse_inline()?,
569            input.parse_inline()?,
570            input.parse()?,
571        ))
572    }
573}
574
575impl<
576    II: ParseInput,
577    A: ParseInline<II>,
578    B: ParseInline<II>,
579    C: ParseInline<II>,
580    D: ParseInline<II>,
581    E: ParseInline<II>,
582    F: ParseInline<II>,
583    G: ParseInline<II>,
584> ParseInline<II> for (A, B, C, D, E, F, G)
585{
586    fn parse_inline(input: &mut II) -> crate::Result<Self> {
587        Ok((
588            input.parse_inline()?,
589            input.parse_inline()?,
590            input.parse_inline()?,
591            input.parse_inline()?,
592            input.parse_inline()?,
593            input.parse_inline()?,
594            input.parse_inline()?,
595        ))
596    }
597}
598
599impl<
600    A: MaybeHasNiche,
601    B: MaybeHasNiche,
602    C: MaybeHasNiche,
603    D: MaybeHasNiche,
604    E: MaybeHasNiche,
605    F: MaybeHasNiche,
606    G: MaybeHasNiche,
607> MaybeHasNiche for (A, B, C, D, E, F, G)
608{
609    type MnArray = tarr![
610        A::MnArray,
611        B::MnArray,
612        C::MnArray,
613        D::MnArray,
614        E::MnArray,
615        F::MnArray,
616        G::MnArray,
617    ];
618}
619
620impl<
621    A: InlineOutput,
622    B: InlineOutput,
623    C: InlineOutput,
624    D: InlineOutput,
625    E: InlineOutput,
626    F: InlineOutput,
627    G: InlineOutput,
628    H: ToOutput,
629> ToOutput for (A, B, C, D, E, F, G, H)
630{
631    fn to_output(&self, output: &mut dyn Output) {
632        self.0.to_output(output);
633        self.1.to_output(output);
634        self.2.to_output(output);
635        self.3.to_output(output);
636        self.4.to_output(output);
637        self.5.to_output(output);
638        self.6.to_output(output);
639        self.7.to_output(output);
640    }
641}
642
643impl<
644    A: InlineOutput,
645    B: InlineOutput,
646    C: InlineOutput,
647    D: InlineOutput,
648    E: InlineOutput,
649    F: InlineOutput,
650    G: InlineOutput,
651    H: InlineOutput,
652> InlineOutput for (A, B, C, D, E, F, G, H)
653{
654}
655
656impl<
657    A: ListHashes,
658    B: ListHashes,
659    C: ListHashes,
660    D: ListHashes,
661    E: ListHashes,
662    F: ListHashes,
663    G: ListHashes,
664    H: ListHashes,
665> ListHashes for (A, B, C, D, E, F, G, H)
666{
667    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
668        self.0.list_hashes(f);
669        self.1.list_hashes(f);
670        self.2.list_hashes(f);
671        self.3.list_hashes(f);
672        self.4.list_hashes(f);
673        self.5.list_hashes(f);
674        self.6.list_hashes(f);
675        self.7.list_hashes(f);
676    }
677}
678
679impl<
680    A: Topological,
681    B: Topological,
682    C: Topological,
683    D: Topological,
684    E: Topological,
685    F: Topological,
686    G: Topological,
687    H: Topological,
688> Topological for (A, B, C, D, E, F, G, H)
689{
690    fn traverse(&self, visitor: &mut impl PointVisitor) {
691        self.0.traverse(visitor);
692        self.1.traverse(visitor);
693        self.2.traverse(visitor);
694        self.3.traverse(visitor);
695        self.4.traverse(visitor);
696        self.5.traverse(visitor);
697        self.6.traverse(visitor);
698        self.7.traverse(visitor);
699    }
700}
701
702impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged, F: Tagged, G: Tagged, H: Tagged> Tagged
703    for (A, B, C, D, E, F, G, H)
704{
705    const TAGS: Tags = Tags(
706        &[],
707        &[
708            &A::TAGS,
709            &B::TAGS,
710            &C::TAGS,
711            &D::TAGS,
712            &E::TAGS,
713            &F::TAGS,
714            &G::TAGS,
715            &H::TAGS,
716        ],
717    );
718}
719
720impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size, H: Size> Size
721    for (A, B, C, D, E, F, G, H)
722where
723    tarr![
724        A::Size,
725        B::Size,
726        C::Size,
727        D::Size,
728        E::Size,
729        F::Size,
730        G::Size,
731        H::Size,
732    ]: typenum::FoldAdd<Output: Unsigned>,
733{
734    const SIZE: usize =
735        A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE + G::SIZE + H::SIZE;
736
737    type Size = <tarr![
738        A::Size,
739        B::Size,
740        C::Size,
741        D::Size,
742        E::Size,
743        F::Size,
744        G::Size,
745        H::Size,
746    ] as typenum::FoldAdd>::Output;
747}
748
749impl<
750    II: ParseInput,
751    A: ParseInline<II>,
752    B: ParseInline<II>,
753    C: ParseInline<II>,
754    D: ParseInline<II>,
755    E: ParseInline<II>,
756    F: ParseInline<II>,
757    G: ParseInline<II>,
758    H: Parse<II>,
759> Parse<II> for (A, B, C, D, E, F, G, H)
760{
761    fn parse(mut input: II) -> crate::Result<Self> {
762        Ok((
763            input.parse_inline()?,
764            input.parse_inline()?,
765            input.parse_inline()?,
766            input.parse_inline()?,
767            input.parse_inline()?,
768            input.parse_inline()?,
769            input.parse_inline()?,
770            input.parse()?,
771        ))
772    }
773}
774
775impl<
776    II: ParseInput,
777    A: ParseInline<II>,
778    B: ParseInline<II>,
779    C: ParseInline<II>,
780    D: ParseInline<II>,
781    E: ParseInline<II>,
782    F: ParseInline<II>,
783    G: ParseInline<II>,
784    H: ParseInline<II>,
785> ParseInline<II> for (A, B, C, D, E, F, G, H)
786{
787    fn parse_inline(input: &mut II) -> crate::Result<Self> {
788        Ok((
789            input.parse_inline()?,
790            input.parse_inline()?,
791            input.parse_inline()?,
792            input.parse_inline()?,
793            input.parse_inline()?,
794            input.parse_inline()?,
795            input.parse_inline()?,
796            input.parse_inline()?,
797        ))
798    }
799}
800
801impl<
802    A: MaybeHasNiche,
803    B: MaybeHasNiche,
804    C: MaybeHasNiche,
805    D: MaybeHasNiche,
806    E: MaybeHasNiche,
807    F: MaybeHasNiche,
808    G: MaybeHasNiche,
809    H: MaybeHasNiche,
810> MaybeHasNiche for (A, B, C, D, E, F, G, H)
811{
812    type MnArray = tarr![
813        A::MnArray,
814        B::MnArray,
815        C::MnArray,
816        D::MnArray,
817        E::MnArray,
818        F::MnArray,
819        G::MnArray,
820        H::MnArray,
821    ];
822}
823
824impl<
825    A: InlineOutput,
826    B: InlineOutput,
827    C: InlineOutput,
828    D: InlineOutput,
829    E: InlineOutput,
830    F: InlineOutput,
831    G: InlineOutput,
832    H: InlineOutput,
833    I: ToOutput,
834> ToOutput for (A, B, C, D, E, F, G, H, I)
835{
836    fn to_output(&self, output: &mut dyn Output) {
837        self.0.to_output(output);
838        self.1.to_output(output);
839        self.2.to_output(output);
840        self.3.to_output(output);
841        self.4.to_output(output);
842        self.5.to_output(output);
843        self.6.to_output(output);
844        self.7.to_output(output);
845        self.8.to_output(output);
846    }
847}
848
849impl<
850    A: InlineOutput,
851    B: InlineOutput,
852    C: InlineOutput,
853    D: InlineOutput,
854    E: InlineOutput,
855    F: InlineOutput,
856    G: InlineOutput,
857    H: InlineOutput,
858    I: InlineOutput,
859> InlineOutput for (A, B, C, D, E, F, G, H, I)
860{
861}
862
863impl<
864    A: ListHashes,
865    B: ListHashes,
866    C: ListHashes,
867    D: ListHashes,
868    E: ListHashes,
869    F: ListHashes,
870    G: ListHashes,
871    H: ListHashes,
872    I: ListHashes,
873> ListHashes for (A, B, C, D, E, F, G, H, I)
874{
875    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
876        self.0.list_hashes(f);
877        self.1.list_hashes(f);
878        self.2.list_hashes(f);
879        self.3.list_hashes(f);
880        self.4.list_hashes(f);
881        self.5.list_hashes(f);
882        self.6.list_hashes(f);
883        self.7.list_hashes(f);
884        self.8.list_hashes(f);
885    }
886}
887
888impl<
889    A: Topological,
890    B: Topological,
891    C: Topological,
892    D: Topological,
893    E: Topological,
894    F: Topological,
895    G: Topological,
896    H: Topological,
897    I: Topological,
898> Topological for (A, B, C, D, E, F, G, H, I)
899{
900    fn traverse(&self, visitor: &mut impl PointVisitor) {
901        self.0.traverse(visitor);
902        self.1.traverse(visitor);
903        self.2.traverse(visitor);
904        self.3.traverse(visitor);
905        self.4.traverse(visitor);
906        self.5.traverse(visitor);
907        self.6.traverse(visitor);
908        self.7.traverse(visitor);
909        self.8.traverse(visitor);
910    }
911}
912
913impl<
914    A: Tagged,
915    B: Tagged,
916    C: Tagged,
917    D: Tagged,
918    E: Tagged,
919    F: Tagged,
920    G: Tagged,
921    H: Tagged,
922    I: Tagged,
923> Tagged for (A, B, C, D, E, F, G, H, I)
924{
925    const TAGS: Tags = Tags(
926        &[],
927        &[
928            &A::TAGS,
929            &B::TAGS,
930            &C::TAGS,
931            &D::TAGS,
932            &E::TAGS,
933            &F::TAGS,
934            &G::TAGS,
935            &H::TAGS,
936            &I::TAGS,
937        ],
938    );
939}
940
941impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size, H: Size, I: Size> Size
942    for (A, B, C, D, E, F, G, H, I)
943where
944    tarr![
945        A::Size,
946        B::Size,
947        C::Size,
948        D::Size,
949        E::Size,
950        F::Size,
951        G::Size,
952        H::Size,
953        I::Size,
954    ]: typenum::FoldAdd<Output: Unsigned>,
955{
956    const SIZE: usize =
957        A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE + G::SIZE + H::SIZE + I::SIZE;
958
959    type Size = <tarr![
960        A::Size,
961        B::Size,
962        C::Size,
963        D::Size,
964        E::Size,
965        F::Size,
966        G::Size,
967        H::Size,
968        I::Size,
969    ] as typenum::FoldAdd>::Output;
970}
971
972impl<
973    II: ParseInput,
974    A: ParseInline<II>,
975    B: ParseInline<II>,
976    C: ParseInline<II>,
977    D: ParseInline<II>,
978    E: ParseInline<II>,
979    F: ParseInline<II>,
980    G: ParseInline<II>,
981    H: ParseInline<II>,
982    I: Parse<II>,
983> Parse<II> for (A, B, C, D, E, F, G, H, I)
984{
985    fn parse(mut input: II) -> crate::Result<Self> {
986        Ok((
987            input.parse_inline()?,
988            input.parse_inline()?,
989            input.parse_inline()?,
990            input.parse_inline()?,
991            input.parse_inline()?,
992            input.parse_inline()?,
993            input.parse_inline()?,
994            input.parse_inline()?,
995            input.parse()?,
996        ))
997    }
998}
999
1000impl<
1001    II: ParseInput,
1002    A: ParseInline<II>,
1003    B: ParseInline<II>,
1004    C: ParseInline<II>,
1005    D: ParseInline<II>,
1006    E: ParseInline<II>,
1007    F: ParseInline<II>,
1008    G: ParseInline<II>,
1009    H: ParseInline<II>,
1010    I: ParseInline<II>,
1011> ParseInline<II> for (A, B, C, D, E, F, G, H, I)
1012{
1013    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1014        Ok((
1015            input.parse_inline()?,
1016            input.parse_inline()?,
1017            input.parse_inline()?,
1018            input.parse_inline()?,
1019            input.parse_inline()?,
1020            input.parse_inline()?,
1021            input.parse_inline()?,
1022            input.parse_inline()?,
1023            input.parse_inline()?,
1024        ))
1025    }
1026}
1027
1028impl<
1029    A: MaybeHasNiche,
1030    B: MaybeHasNiche,
1031    C: MaybeHasNiche,
1032    D: MaybeHasNiche,
1033    E: MaybeHasNiche,
1034    F: MaybeHasNiche,
1035    G: MaybeHasNiche,
1036    H: MaybeHasNiche,
1037    I: MaybeHasNiche,
1038> MaybeHasNiche for (A, B, C, D, E, F, G, H, I)
1039{
1040    type MnArray = tarr![
1041        A::MnArray,
1042        B::MnArray,
1043        C::MnArray,
1044        D::MnArray,
1045        E::MnArray,
1046        F::MnArray,
1047        G::MnArray,
1048        H::MnArray,
1049        I::MnArray,
1050    ];
1051}
1052
1053impl<
1054    A: InlineOutput,
1055    B: InlineOutput,
1056    C: InlineOutput,
1057    D: InlineOutput,
1058    E: InlineOutput,
1059    F: InlineOutput,
1060    G: InlineOutput,
1061    H: InlineOutput,
1062    I: InlineOutput,
1063    J: ToOutput,
1064> ToOutput for (A, B, C, D, E, F, G, H, I, J)
1065{
1066    fn to_output(&self, output: &mut dyn Output) {
1067        self.0.to_output(output);
1068        self.1.to_output(output);
1069        self.2.to_output(output);
1070        self.3.to_output(output);
1071        self.4.to_output(output);
1072        self.5.to_output(output);
1073        self.6.to_output(output);
1074        self.7.to_output(output);
1075        self.8.to_output(output);
1076        self.9.to_output(output);
1077    }
1078}
1079
1080impl<
1081    A: InlineOutput,
1082    B: InlineOutput,
1083    C: InlineOutput,
1084    D: InlineOutput,
1085    E: InlineOutput,
1086    F: InlineOutput,
1087    G: InlineOutput,
1088    H: InlineOutput,
1089    I: InlineOutput,
1090    J: InlineOutput,
1091> InlineOutput for (A, B, C, D, E, F, G, H, I, J)
1092{
1093}
1094
1095impl<
1096    A: ListHashes,
1097    B: ListHashes,
1098    C: ListHashes,
1099    D: ListHashes,
1100    E: ListHashes,
1101    F: ListHashes,
1102    G: ListHashes,
1103    H: ListHashes,
1104    I: ListHashes,
1105    J: ListHashes,
1106> ListHashes for (A, B, C, D, E, F, G, H, I, J)
1107{
1108    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
1109        self.0.list_hashes(f);
1110        self.1.list_hashes(f);
1111        self.2.list_hashes(f);
1112        self.3.list_hashes(f);
1113        self.4.list_hashes(f);
1114        self.5.list_hashes(f);
1115        self.6.list_hashes(f);
1116        self.7.list_hashes(f);
1117        self.8.list_hashes(f);
1118        self.9.list_hashes(f);
1119    }
1120}
1121
1122impl<
1123    A: Topological,
1124    B: Topological,
1125    C: Topological,
1126    D: Topological,
1127    E: Topological,
1128    F: Topological,
1129    G: Topological,
1130    H: Topological,
1131    I: Topological,
1132    J: Topological,
1133> Topological for (A, B, C, D, E, F, G, H, I, J)
1134{
1135    fn traverse(&self, visitor: &mut impl PointVisitor) {
1136        self.0.traverse(visitor);
1137        self.1.traverse(visitor);
1138        self.2.traverse(visitor);
1139        self.3.traverse(visitor);
1140        self.4.traverse(visitor);
1141        self.5.traverse(visitor);
1142        self.6.traverse(visitor);
1143        self.7.traverse(visitor);
1144        self.8.traverse(visitor);
1145        self.9.traverse(visitor);
1146    }
1147}
1148
1149impl<
1150    A: Tagged,
1151    B: Tagged,
1152    C: Tagged,
1153    D: Tagged,
1154    E: Tagged,
1155    F: Tagged,
1156    G: Tagged,
1157    H: Tagged,
1158    I: Tagged,
1159    J: Tagged,
1160> Tagged for (A, B, C, D, E, F, G, H, I, J)
1161{
1162    const TAGS: Tags = Tags(
1163        &[],
1164        &[
1165            &A::TAGS,
1166            &B::TAGS,
1167            &C::TAGS,
1168            &D::TAGS,
1169            &E::TAGS,
1170            &F::TAGS,
1171            &G::TAGS,
1172            &H::TAGS,
1173            &I::TAGS,
1174            &J::TAGS,
1175        ],
1176    );
1177}
1178
1179impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size, H: Size, I: Size, J: Size> Size
1180    for (A, B, C, D, E, F, G, H, I, J)
1181where
1182    tarr![
1183        A::Size,
1184        B::Size,
1185        C::Size,
1186        D::Size,
1187        E::Size,
1188        F::Size,
1189        G::Size,
1190        H::Size,
1191        I::Size,
1192        J::Size,
1193    ]: typenum::FoldAdd<Output: Unsigned>,
1194{
1195    const SIZE: usize = A::SIZE
1196        + B::SIZE
1197        + C::SIZE
1198        + D::SIZE
1199        + E::SIZE
1200        + F::SIZE
1201        + G::SIZE
1202        + H::SIZE
1203        + I::SIZE
1204        + J::SIZE;
1205
1206    type Size = <tarr![
1207        A::Size,
1208        B::Size,
1209        C::Size,
1210        D::Size,
1211        E::Size,
1212        F::Size,
1213        G::Size,
1214        H::Size,
1215        I::Size,
1216        J::Size,
1217    ] as typenum::FoldAdd>::Output;
1218}
1219
1220impl<
1221    II: ParseInput,
1222    A: ParseInline<II>,
1223    B: ParseInline<II>,
1224    C: ParseInline<II>,
1225    D: ParseInline<II>,
1226    E: ParseInline<II>,
1227    F: ParseInline<II>,
1228    G: ParseInline<II>,
1229    H: ParseInline<II>,
1230    I: ParseInline<II>,
1231    J: Parse<II>,
1232> Parse<II> for (A, B, C, D, E, F, G, H, I, J)
1233{
1234    fn parse(mut input: II) -> crate::Result<Self> {
1235        Ok((
1236            input.parse_inline()?,
1237            input.parse_inline()?,
1238            input.parse_inline()?,
1239            input.parse_inline()?,
1240            input.parse_inline()?,
1241            input.parse_inline()?,
1242            input.parse_inline()?,
1243            input.parse_inline()?,
1244            input.parse_inline()?,
1245            input.parse()?,
1246        ))
1247    }
1248}
1249
1250impl<
1251    II: ParseInput,
1252    A: ParseInline<II>,
1253    B: ParseInline<II>,
1254    C: ParseInline<II>,
1255    D: ParseInline<II>,
1256    E: ParseInline<II>,
1257    F: ParseInline<II>,
1258    G: ParseInline<II>,
1259    H: ParseInline<II>,
1260    I: ParseInline<II>,
1261    J: ParseInline<II>,
1262> ParseInline<II> for (A, B, C, D, E, F, G, H, I, J)
1263{
1264    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1265        Ok((
1266            input.parse_inline()?,
1267            input.parse_inline()?,
1268            input.parse_inline()?,
1269            input.parse_inline()?,
1270            input.parse_inline()?,
1271            input.parse_inline()?,
1272            input.parse_inline()?,
1273            input.parse_inline()?,
1274            input.parse_inline()?,
1275            input.parse_inline()?,
1276        ))
1277    }
1278}
1279
1280impl<
1281    A: MaybeHasNiche,
1282    B: MaybeHasNiche,
1283    C: MaybeHasNiche,
1284    D: MaybeHasNiche,
1285    E: MaybeHasNiche,
1286    F: MaybeHasNiche,
1287    G: MaybeHasNiche,
1288    H: MaybeHasNiche,
1289    I: MaybeHasNiche,
1290    J: MaybeHasNiche,
1291> MaybeHasNiche for (A, B, C, D, E, F, G, H, I, J)
1292{
1293    type MnArray = tarr![
1294        A::MnArray,
1295        B::MnArray,
1296        C::MnArray,
1297        D::MnArray,
1298        E::MnArray,
1299        F::MnArray,
1300        G::MnArray,
1301        H::MnArray,
1302        I::MnArray,
1303        J::MnArray,
1304    ];
1305}
1306
1307impl<
1308    A: InlineOutput,
1309    B: InlineOutput,
1310    C: InlineOutput,
1311    D: InlineOutput,
1312    E: InlineOutput,
1313    F: InlineOutput,
1314    G: InlineOutput,
1315    H: InlineOutput,
1316    I: InlineOutput,
1317    J: InlineOutput,
1318    K: ToOutput,
1319> ToOutput for (A, B, C, D, E, F, G, H, I, J, K)
1320{
1321    fn to_output(&self, output: &mut dyn Output) {
1322        self.0.to_output(output);
1323        self.1.to_output(output);
1324        self.2.to_output(output);
1325        self.3.to_output(output);
1326        self.4.to_output(output);
1327        self.5.to_output(output);
1328        self.6.to_output(output);
1329        self.7.to_output(output);
1330        self.8.to_output(output);
1331        self.9.to_output(output);
1332        self.10.to_output(output);
1333    }
1334}
1335
1336impl<
1337    A: InlineOutput,
1338    B: InlineOutput,
1339    C: InlineOutput,
1340    D: InlineOutput,
1341    E: InlineOutput,
1342    F: InlineOutput,
1343    G: InlineOutput,
1344    H: InlineOutput,
1345    I: InlineOutput,
1346    J: InlineOutput,
1347    K: InlineOutput,
1348> InlineOutput for (A, B, C, D, E, F, G, H, I, J, K)
1349{
1350}
1351
1352impl<
1353    A: ListHashes,
1354    B: ListHashes,
1355    C: ListHashes,
1356    D: ListHashes,
1357    E: ListHashes,
1358    F: ListHashes,
1359    G: ListHashes,
1360    H: ListHashes,
1361    I: ListHashes,
1362    J: ListHashes,
1363    K: ListHashes,
1364> ListHashes for (A, B, C, D, E, F, G, H, I, J, K)
1365{
1366    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
1367        self.0.list_hashes(f);
1368        self.1.list_hashes(f);
1369        self.2.list_hashes(f);
1370        self.3.list_hashes(f);
1371        self.4.list_hashes(f);
1372        self.5.list_hashes(f);
1373        self.6.list_hashes(f);
1374        self.7.list_hashes(f);
1375        self.8.list_hashes(f);
1376        self.9.list_hashes(f);
1377        self.10.list_hashes(f);
1378    }
1379}
1380
1381impl<
1382    A: Topological,
1383    B: Topological,
1384    C: Topological,
1385    D: Topological,
1386    E: Topological,
1387    F: Topological,
1388    G: Topological,
1389    H: Topological,
1390    I: Topological,
1391    J: Topological,
1392    K: Topological,
1393> Topological for (A, B, C, D, E, F, G, H, I, J, K)
1394{
1395    fn traverse(&self, visitor: &mut impl PointVisitor) {
1396        self.0.traverse(visitor);
1397        self.1.traverse(visitor);
1398        self.2.traverse(visitor);
1399        self.3.traverse(visitor);
1400        self.4.traverse(visitor);
1401        self.5.traverse(visitor);
1402        self.6.traverse(visitor);
1403        self.7.traverse(visitor);
1404        self.8.traverse(visitor);
1405        self.9.traverse(visitor);
1406        self.10.traverse(visitor);
1407    }
1408}
1409
1410impl<
1411    A: Tagged,
1412    B: Tagged,
1413    C: Tagged,
1414    D: Tagged,
1415    E: Tagged,
1416    F: Tagged,
1417    G: Tagged,
1418    H: Tagged,
1419    I: Tagged,
1420    J: Tagged,
1421    K: Tagged,
1422> Tagged for (A, B, C, D, E, F, G, H, I, J, K)
1423{
1424    const TAGS: Tags = Tags(
1425        &[],
1426        &[
1427            &A::TAGS,
1428            &B::TAGS,
1429            &C::TAGS,
1430            &D::TAGS,
1431            &E::TAGS,
1432            &F::TAGS,
1433            &G::TAGS,
1434            &H::TAGS,
1435            &I::TAGS,
1436            &J::TAGS,
1437            &K::TAGS,
1438        ],
1439    );
1440}
1441
1442impl<
1443    A: Size,
1444    B: Size,
1445    C: Size,
1446    D: Size,
1447    E: Size,
1448    F: Size,
1449    G: Size,
1450    H: Size,
1451    I: Size,
1452    J: Size,
1453    K: Size,
1454> Size for (A, B, C, D, E, F, G, H, I, J, K)
1455where
1456    tarr![
1457        A::Size,
1458        B::Size,
1459        C::Size,
1460        D::Size,
1461        E::Size,
1462        F::Size,
1463        G::Size,
1464        H::Size,
1465        I::Size,
1466        J::Size,
1467        K::Size,
1468    ]: typenum::FoldAdd<Output: Unsigned>,
1469{
1470    const SIZE: usize = A::SIZE
1471        + B::SIZE
1472        + C::SIZE
1473        + D::SIZE
1474        + E::SIZE
1475        + F::SIZE
1476        + G::SIZE
1477        + H::SIZE
1478        + I::SIZE
1479        + J::SIZE
1480        + K::SIZE;
1481
1482    type Size = <tarr![
1483        A::Size,
1484        B::Size,
1485        C::Size,
1486        D::Size,
1487        E::Size,
1488        F::Size,
1489        G::Size,
1490        H::Size,
1491        I::Size,
1492        J::Size,
1493        K::Size,
1494    ] as typenum::FoldAdd>::Output;
1495}
1496
1497impl<
1498    II: ParseInput,
1499    A: ParseInline<II>,
1500    B: ParseInline<II>,
1501    C: ParseInline<II>,
1502    D: ParseInline<II>,
1503    E: ParseInline<II>,
1504    F: ParseInline<II>,
1505    G: ParseInline<II>,
1506    H: ParseInline<II>,
1507    I: ParseInline<II>,
1508    J: ParseInline<II>,
1509    K: Parse<II>,
1510> Parse<II> for (A, B, C, D, E, F, G, H, I, J, K)
1511{
1512    fn parse(mut input: II) -> crate::Result<Self> {
1513        Ok((
1514            input.parse_inline()?,
1515            input.parse_inline()?,
1516            input.parse_inline()?,
1517            input.parse_inline()?,
1518            input.parse_inline()?,
1519            input.parse_inline()?,
1520            input.parse_inline()?,
1521            input.parse_inline()?,
1522            input.parse_inline()?,
1523            input.parse_inline()?,
1524            input.parse()?,
1525        ))
1526    }
1527}
1528
1529impl<
1530    II: ParseInput,
1531    A: ParseInline<II>,
1532    B: ParseInline<II>,
1533    C: ParseInline<II>,
1534    D: ParseInline<II>,
1535    E: ParseInline<II>,
1536    F: ParseInline<II>,
1537    G: ParseInline<II>,
1538    H: ParseInline<II>,
1539    I: ParseInline<II>,
1540    J: ParseInline<II>,
1541    K: ParseInline<II>,
1542> ParseInline<II> for (A, B, C, D, E, F, G, H, I, J, K)
1543{
1544    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1545        Ok((
1546            input.parse_inline()?,
1547            input.parse_inline()?,
1548            input.parse_inline()?,
1549            input.parse_inline()?,
1550            input.parse_inline()?,
1551            input.parse_inline()?,
1552            input.parse_inline()?,
1553            input.parse_inline()?,
1554            input.parse_inline()?,
1555            input.parse_inline()?,
1556            input.parse_inline()?,
1557        ))
1558    }
1559}
1560
1561impl<
1562    A: MaybeHasNiche,
1563    B: MaybeHasNiche,
1564    C: MaybeHasNiche,
1565    D: MaybeHasNiche,
1566    E: MaybeHasNiche,
1567    F: MaybeHasNiche,
1568    G: MaybeHasNiche,
1569    H: MaybeHasNiche,
1570    I: MaybeHasNiche,
1571    J: MaybeHasNiche,
1572    K: MaybeHasNiche,
1573> MaybeHasNiche for (A, B, C, D, E, F, G, H, I, J, K)
1574{
1575    type MnArray = tarr![
1576        A::MnArray,
1577        B::MnArray,
1578        C::MnArray,
1579        D::MnArray,
1580        E::MnArray,
1581        F::MnArray,
1582        G::MnArray,
1583        H::MnArray,
1584        I::MnArray,
1585        J::MnArray,
1586        K::MnArray,
1587    ];
1588}
1589
1590impl<
1591    A: InlineOutput,
1592    B: InlineOutput,
1593    C: InlineOutput,
1594    D: InlineOutput,
1595    E: InlineOutput,
1596    F: InlineOutput,
1597    G: InlineOutput,
1598    H: InlineOutput,
1599    I: InlineOutput,
1600    J: InlineOutput,
1601    K: InlineOutput,
1602    L: ToOutput,
1603> ToOutput for (A, B, C, D, E, F, G, H, I, J, K, L)
1604{
1605    fn to_output(&self, output: &mut dyn Output) {
1606        self.0.to_output(output);
1607        self.1.to_output(output);
1608        self.2.to_output(output);
1609        self.3.to_output(output);
1610        self.4.to_output(output);
1611        self.5.to_output(output);
1612        self.6.to_output(output);
1613        self.7.to_output(output);
1614        self.8.to_output(output);
1615        self.9.to_output(output);
1616        self.10.to_output(output);
1617        self.11.to_output(output);
1618    }
1619}
1620
1621impl<
1622    A: InlineOutput,
1623    B: InlineOutput,
1624    C: InlineOutput,
1625    D: InlineOutput,
1626    E: InlineOutput,
1627    F: InlineOutput,
1628    G: InlineOutput,
1629    H: InlineOutput,
1630    I: InlineOutput,
1631    J: InlineOutput,
1632    K: InlineOutput,
1633    L: InlineOutput,
1634> InlineOutput for (A, B, C, D, E, F, G, H, I, J, K, L)
1635{
1636}
1637
1638impl<
1639    A: ListHashes,
1640    B: ListHashes,
1641    C: ListHashes,
1642    D: ListHashes,
1643    E: ListHashes,
1644    F: ListHashes,
1645    G: ListHashes,
1646    H: ListHashes,
1647    I: ListHashes,
1648    J: ListHashes,
1649    K: ListHashes,
1650    L: ListHashes,
1651> ListHashes for (A, B, C, D, E, F, G, H, I, J, K, L)
1652{
1653    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
1654        self.0.list_hashes(f);
1655        self.1.list_hashes(f);
1656        self.2.list_hashes(f);
1657        self.3.list_hashes(f);
1658        self.4.list_hashes(f);
1659        self.5.list_hashes(f);
1660        self.6.list_hashes(f);
1661        self.7.list_hashes(f);
1662        self.8.list_hashes(f);
1663        self.9.list_hashes(f);
1664        self.10.list_hashes(f);
1665        self.11.list_hashes(f);
1666    }
1667}
1668
1669impl<
1670    A: Topological,
1671    B: Topological,
1672    C: Topological,
1673    D: Topological,
1674    E: Topological,
1675    F: Topological,
1676    G: Topological,
1677    H: Topological,
1678    I: Topological,
1679    J: Topological,
1680    K: Topological,
1681    L: Topological,
1682> Topological for (A, B, C, D, E, F, G, H, I, J, K, L)
1683{
1684    fn traverse(&self, visitor: &mut impl PointVisitor) {
1685        self.0.traverse(visitor);
1686        self.1.traverse(visitor);
1687        self.2.traverse(visitor);
1688        self.3.traverse(visitor);
1689        self.4.traverse(visitor);
1690        self.5.traverse(visitor);
1691        self.6.traverse(visitor);
1692        self.7.traverse(visitor);
1693        self.8.traverse(visitor);
1694        self.9.traverse(visitor);
1695        self.10.traverse(visitor);
1696        self.11.traverse(visitor);
1697    }
1698}
1699
1700impl<
1701    A: Tagged,
1702    B: Tagged,
1703    C: Tagged,
1704    D: Tagged,
1705    E: Tagged,
1706    F: Tagged,
1707    G: Tagged,
1708    H: Tagged,
1709    I: Tagged,
1710    J: Tagged,
1711    K: Tagged,
1712    L: Tagged,
1713> Tagged for (A, B, C, D, E, F, G, H, I, J, K, L)
1714{
1715    const TAGS: Tags = Tags(
1716        &[],
1717        &[
1718            &A::TAGS,
1719            &B::TAGS,
1720            &C::TAGS,
1721            &D::TAGS,
1722            &E::TAGS,
1723            &F::TAGS,
1724            &G::TAGS,
1725            &H::TAGS,
1726            &I::TAGS,
1727            &J::TAGS,
1728            &K::TAGS,
1729            &L::TAGS,
1730        ],
1731    );
1732}
1733
1734impl<
1735    A: Size,
1736    B: Size,
1737    C: Size,
1738    D: Size,
1739    E: Size,
1740    F: Size,
1741    G: Size,
1742    H: Size,
1743    I: Size,
1744    J: Size,
1745    K: Size,
1746    L: Size,
1747> Size for (A, B, C, D, E, F, G, H, I, J, K, L)
1748where
1749    tarr![
1750        A::Size,
1751        B::Size,
1752        C::Size,
1753        D::Size,
1754        E::Size,
1755        F::Size,
1756        G::Size,
1757        H::Size,
1758        I::Size,
1759        J::Size,
1760        K::Size,
1761        L::Size,
1762    ]: typenum::FoldAdd<Output: Unsigned>,
1763{
1764    const SIZE: usize = A::SIZE
1765        + B::SIZE
1766        + C::SIZE
1767        + D::SIZE
1768        + E::SIZE
1769        + F::SIZE
1770        + G::SIZE
1771        + H::SIZE
1772        + I::SIZE
1773        + J::SIZE
1774        + K::SIZE
1775        + L::SIZE;
1776
1777    type Size = <tarr![
1778        A::Size,
1779        B::Size,
1780        C::Size,
1781        D::Size,
1782        E::Size,
1783        F::Size,
1784        G::Size,
1785        H::Size,
1786        I::Size,
1787        J::Size,
1788        K::Size,
1789        L::Size,
1790    ] as typenum::FoldAdd>::Output;
1791}
1792
1793impl<
1794    II: ParseInput,
1795    A: ParseInline<II>,
1796    B: ParseInline<II>,
1797    C: ParseInline<II>,
1798    D: ParseInline<II>,
1799    E: ParseInline<II>,
1800    F: ParseInline<II>,
1801    G: ParseInline<II>,
1802    H: ParseInline<II>,
1803    I: ParseInline<II>,
1804    J: ParseInline<II>,
1805    K: ParseInline<II>,
1806    L: Parse<II>,
1807> Parse<II> for (A, B, C, D, E, F, G, H, I, J, K, L)
1808{
1809    fn parse(mut input: II) -> crate::Result<Self> {
1810        Ok((
1811            input.parse_inline()?,
1812            input.parse_inline()?,
1813            input.parse_inline()?,
1814            input.parse_inline()?,
1815            input.parse_inline()?,
1816            input.parse_inline()?,
1817            input.parse_inline()?,
1818            input.parse_inline()?,
1819            input.parse_inline()?,
1820            input.parse_inline()?,
1821            input.parse_inline()?,
1822            input.parse()?,
1823        ))
1824    }
1825}
1826
1827impl<
1828    II: ParseInput,
1829    A: ParseInline<II>,
1830    B: ParseInline<II>,
1831    C: ParseInline<II>,
1832    D: ParseInline<II>,
1833    E: ParseInline<II>,
1834    F: ParseInline<II>,
1835    G: ParseInline<II>,
1836    H: ParseInline<II>,
1837    I: ParseInline<II>,
1838    J: ParseInline<II>,
1839    K: ParseInline<II>,
1840    L: ParseInline<II>,
1841> ParseInline<II> for (A, B, C, D, E, F, G, H, I, J, K, L)
1842{
1843    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1844        Ok((
1845            input.parse_inline()?,
1846            input.parse_inline()?,
1847            input.parse_inline()?,
1848            input.parse_inline()?,
1849            input.parse_inline()?,
1850            input.parse_inline()?,
1851            input.parse_inline()?,
1852            input.parse_inline()?,
1853            input.parse_inline()?,
1854            input.parse_inline()?,
1855            input.parse_inline()?,
1856            input.parse_inline()?,
1857        ))
1858    }
1859}
1860
1861impl<
1862    A: MaybeHasNiche,
1863    B: MaybeHasNiche,
1864    C: MaybeHasNiche,
1865    D: MaybeHasNiche,
1866    E: MaybeHasNiche,
1867    F: MaybeHasNiche,
1868    G: MaybeHasNiche,
1869    H: MaybeHasNiche,
1870    I: MaybeHasNiche,
1871    J: MaybeHasNiche,
1872    K: MaybeHasNiche,
1873    L: MaybeHasNiche,
1874> MaybeHasNiche for (A, B, C, D, E, F, G, H, I, J, K, L)
1875{
1876    type MnArray = tarr![
1877        A::MnArray,
1878        B::MnArray,
1879        C::MnArray,
1880        D::MnArray,
1881        E::MnArray,
1882        F::MnArray,
1883        G::MnArray,
1884        H::MnArray,
1885        I::MnArray,
1886        J::MnArray,
1887        K::MnArray,
1888        L::MnArray,
1889    ];
1890}