facet_core/impls_core/
tuple.rs

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