facet_core/impls_core/
slice.rs1use 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}