facet_core/_trait/impls/
array_impl.rs

1use crate::*;
2use core::alloc::Layout;
3
4unsafe impl<T> Facet for [T; 1]
5where
6    T: Facet,
7{
8    const SHAPE: &'static Shape = &const {
9        Shape::builder()
10            .layout(Layout::new::<[T; 1]>())
11            .vtable(
12                &const {
13                    let mut builder = ValueVTable::builder()
14                        .marker_traits(T::SHAPE.vtable.marker_traits)
15                        .type_name(|f, opts| {
16                            if let Some(opts) = opts.for_children() {
17                                write!(f, "[")?;
18                                (T::SHAPE.vtable.type_name)(f, opts)?;
19                                write!(f, "; 1]")
20                            } else {
21                                write!(f, "[⋯; 1]")
22                            }
23                        })
24                        .drop_in_place(|value| unsafe {
25                            core::ptr::drop_in_place(value.as_mut::<[T; 1]>());
26                        });
27                    if T::SHAPE.vtable.debug.is_some() {
28                        builder = builder.debug(|value, f| {
29                            let value = unsafe { value.as_ref::<[T; 1]>() };
30                            write!(f, "[")?;
31                            unsafe {
32                                (T::SHAPE.vtable.debug.unwrap_unchecked())(
33                                    OpaqueConst::new(&value[0] as *const T),
34                                    f,
35                                )?;
36                            }
37                            write!(f, "]")
38                        });
39                    }
40                    if T::SHAPE.vtable.eq.is_some() {
41                        builder = builder.eq(|a, b| {
42                            let a = unsafe { a.as_ref::<[T; 1]>() };
43                            let b = unsafe { b.as_ref::<[T; 1]>() };
44                            unsafe {
45                                (T::SHAPE.vtable.eq.unwrap_unchecked())(
46                                    OpaqueConst::new(&a[0] as *const T),
47                                    OpaqueConst::new(&b[0] as *const T),
48                                )
49                            }
50                        });
51                    }
52                    if T::SHAPE.vtable.default_in_place.is_some() {
53                        builder = builder.default_in_place(|target| unsafe {
54                            let t_dip = T::SHAPE.vtable.default_in_place.unwrap_unchecked();
55                            (t_dip)(target.field_uninit(0))
56                        });
57                    }
58                    if T::SHAPE.vtable.clone_into.is_some() {
59                        builder = builder.clone_into(|src, dst| unsafe {
60                            let t_cip = T::SHAPE.vtable.clone_into.unwrap_unchecked();
61                            (t_cip)(
62                                OpaqueConst::new(&src.as_ref::<[T; 1]>()[0] as *const T),
63                                dst.field_uninit(0),
64                            )
65                        });
66                    }
67                    if T::SHAPE.vtable.partial_ord.is_some() {
68                        builder = builder.partial_ord(|a, b| {
69                            let a = unsafe { a.as_ref::<[T; 1]>() };
70                            let b = unsafe { b.as_ref::<[T; 1]>() };
71                            unsafe {
72                                (T::SHAPE.vtable.partial_ord.unwrap_unchecked())(
73                                    OpaqueConst::new(&a[0] as *const T),
74                                    OpaqueConst::new(&b[0] as *const T),
75                                )
76                            }
77                        });
78                    }
79                    if T::SHAPE.vtable.ord.is_some() {
80                        builder = builder.ord(|a, b| {
81                            let a = unsafe { a.as_ref::<[T; 1]>() };
82                            let b = unsafe { b.as_ref::<[T; 1]>() };
83                            unsafe {
84                                (T::SHAPE.vtable.ord.unwrap_unchecked())(
85                                    OpaqueConst::new(&a[0] as *const T),
86                                    OpaqueConst::new(&b[0] as *const T),
87                                )
88                            }
89                        });
90                    }
91                    if T::SHAPE.vtable.hash.is_some() {
92                        builder = builder.hash(|value, state, hasher| {
93                            let value = unsafe { value.as_ref::<[T; 1]>() };
94                            unsafe {
95                                (T::SHAPE.vtable.hash.unwrap_unchecked())(
96                                    OpaqueConst::new(&value[0] as *const T),
97                                    state,
98                                    hasher,
99                                )
100                            }
101                        });
102                    }
103                    builder.build()
104                },
105            )
106            .def(Def::List(
107                ListDef::builder()
108                    .vtable(
109                        &const {
110                            ListVTable::builder()
111                        .init_in_place_with_capacity(|_, _| Err(()))
112                        .push(|_, _| {
113                            panic!("Cannot push to [T; 1]");
114                        })
115                        .len(|_| 1)
116                        .get_item_ptr(|ptr, index| unsafe {
117                            if index >= 1 {
118                                panic!(
119                                    "Index out of bounds: the len is 1 but the index is {index}"
120                                );
121                            }
122                            OpaqueConst::new(ptr.as_ptr::<[T; 1]>())
123                        })
124                        .build()
125                        },
126                    )
127                    .t(T::SHAPE)
128                    .build(),
129            ))
130            .build()
131    };
132}