facet_core/_trait/impls/
array_impl.rs1use 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}