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