facet_core/impls_alloc/
vec.rs1use 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}