facet_core/impls_core/
slice.rs

1use core::ptr::NonNull;
2
3use crate::shape_util::*;
4use crate::*;
5
6unsafe impl<'a, T> Facet<'a> for [T]
7where
8    T: Facet<'a>,
9{
10    const SHAPE: &'static Shape = &const {
11        Shape::builder_for_unsized::<Self>()
12            .vtable({
13                vtable_builder_for_list::<T, Self>()
14                    .type_name(|f, opts| {
15                        if let Some(opts) = opts.for_children() {
16                            write!(f, "[")?;
17                            (T::SHAPE.vtable.type_name())(f, opts)?;
18                            write!(f, "]")
19                        } else {
20                            write!(f, "[…]")
21                        }
22                    })
23                    .marker_traits({
24                        T::SHAPE
25                            .vtable
26                            .marker_traits()
27                            .difference(MarkerTraits::COPY)
28                    })
29                    .build()
30            })
31            .type_identifier("[_]")
32            .type_params(&[TypeParam {
33                name: "T",
34                shape: T::SHAPE,
35            }])
36            .ty(Type::Sequence(SequenceType::Slice(SliceType {
37                t: T::SHAPE,
38            })))
39            .def(Def::Slice(
40                SliceDef::builder()
41                    .vtable(
42                        &const {
43                            SliceVTable::builder()
44                                .len(|ptr| unsafe {
45                                    let slice = ptr.get::<[T]>();
46                                    slice.len()
47                                })
48                                .as_ptr(|ptr| unsafe {
49                                    let slice = ptr.get::<[T]>();
50                                    PtrConst::new(NonNull::new_unchecked(slice.as_ptr() as *mut T))
51                                })
52                                .as_mut_ptr(|ptr| unsafe {
53                                    let slice = ptr.as_mut::<[T]>();
54                                    PtrMut::new(NonNull::new_unchecked(slice.as_mut_ptr()))
55                                })
56                                .build()
57                        },
58                    )
59                    .t(T::SHAPE)
60                    .build(),
61            ))
62            .build()
63    };
64}