facet_core/impls_alloc/
vec.rs

1use crate::*;
2
3use alloc::boxed::Box;
4use alloc::vec::Vec;
5
6type VecIterator<'mem, T> = core::slice::Iter<'mem, T>;
7
8unsafe impl<'a, T> Facet<'a> for Vec<T>
9where
10    T: Facet<'a>,
11{
12    const VTABLE: &'static ValueVTable = &const {
13        ValueVTable::builder::<Self>()
14            .type_name(|f, opts| {
15                if let Some(opts) = opts.for_children() {
16                    write!(f, "{}<", Self::SHAPE.type_identifier)?;
17                    T::SHAPE.vtable.type_name()(f, opts)?;
18                    write!(f, ">")
19                } else {
20                    write!(f, "{}<⋯>", Self::SHAPE.type_identifier)
21                }
22            })
23            .default_in_place(|| Some(|target| unsafe { target.put(Self::default()) }))
24            .marker_traits(|| {
25                MarkerTraits::SEND
26                    .union(MarkerTraits::SYNC)
27                    .union(MarkerTraits::EQ)
28                    .union(MarkerTraits::UNPIN)
29                    .union(MarkerTraits::UNWIND_SAFE)
30                    .union(MarkerTraits::REF_UNWIND_SAFE)
31                    .intersection(T::SHAPE.vtable.marker_traits())
32            })
33            .build()
34    };
35
36    const SHAPE: &'static Shape = &const {
37        Shape::builder_for_sized::<Self>()
38            .type_identifier("Vec")
39            .type_params(&[TypeParam {
40                name: "T",
41                shape: || T::SHAPE,
42            }])
43            .ty(Type::User(UserType::Opaque))
44            .def(Def::List(
45                ListDef::builder()
46                    .vtable(
47                        &const {
48                            ListVTable::builder()
49                                .init_in_place_with_capacity(|data, capacity| unsafe {
50                                    data.put(Self::with_capacity(capacity))
51                                })
52                                .push(|ptr, item| unsafe {
53                                    let vec = ptr.as_mut::<Self>();
54                                    let item = item.read::<T>();
55                                    (*vec).push(item);
56                                })
57                                .len(|ptr| unsafe {
58                                    let vec = ptr.get::<Self>();
59                                    vec.len()
60                                })
61                                .get(|ptr, index| unsafe {
62                                    let vec = ptr.get::<Self>();
63                                    let item = vec.get(index)?;
64                                    Some(PtrConst::new(item))
65                                })
66                                .get_mut(|ptr, index| unsafe {
67                                    let vec = ptr.as_mut::<Self>();
68                                    let item = vec.get_mut(index)?;
69                                    Some(PtrMut::new(item))
70                                })
71                                .as_ptr(|ptr| unsafe {
72                                    let vec = ptr.get::<Self>();
73                                    PtrConst::new(vec.as_ptr())
74                                })
75                                .as_mut_ptr(|ptr| unsafe {
76                                    let vec = ptr.as_mut::<Self>();
77                                    PtrMut::new(vec.as_mut_ptr())
78                                })
79                                .iter_vtable(
80                                    IterVTable::builder()
81                                        .init_with_value(|ptr| unsafe {
82                                            let vec = ptr.get::<Self>();
83                                            let iter: VecIterator<T> = vec.iter();
84                                            let iter_state = Box::new(iter);
85                                            PtrMut::new(Box::into_raw(iter_state) as *mut u8)
86                                        })
87                                        .next(|iter_ptr| unsafe {
88                                            let state = iter_ptr.as_mut::<VecIterator<'_, T>>();
89                                            state.next().map(|value| PtrConst::new(value))
90                                        })
91                                        .next_back(|iter_ptr| unsafe {
92                                            let state = iter_ptr.as_mut::<VecIterator<'_, T>>();
93                                            state.next_back().map(|value| PtrConst::new(value))
94                                        })
95                                        .dealloc(|iter_ptr| unsafe {
96                                            drop(Box::from_raw(
97                                                iter_ptr.as_ptr::<VecIterator<'_, T>>()
98                                                    as *mut VecIterator<'_, T>,
99                                            ));
100                                        })
101                                        .build(),
102                                )
103                                .build()
104                        },
105                    )
106                    .t(|| T::SHAPE)
107                    .build(),
108            ))
109            .build()
110    };
111}