• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

facet-rs / facet / 15085019653

17 May 2025 12:06PM UTC coverage: 56.732% (-0.05%) from 56.778%
15085019653

push

github

fasterthanlime
Fix build errors without `std` feature

9097 of 16035 relevant lines covered (56.73%)

126.11 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

59.26
/facet-core/src/impls_alloc/vec.rs
1
use crate::*;
2
use core::hash::Hash as _;
3

4
use alloc::boxed::Box;
5
use alloc::vec::Vec;
6

7
type VecIterator<'mem, T> = core::slice::Iter<'mem, T>;
8

9
unsafe impl<'a, T> Facet<'a> for Vec<T>
10
where
11
    T: Facet<'a>,
12
{
13
    const VTABLE: &'static ValueVTable = &const {
14
        let mut builder = ValueVTable::builder::<Self>()
15
            .type_name(|f, opts| {
120✔
16
                if let Some(opts) = opts.for_children() {
120✔
17
                    write!(f, "Vec<")?;
120✔
18
                    (T::SHAPE.vtable.type_name)(f, opts)?;
120✔
19
                    write!(f, ">")
120✔
20
                } else {
21
                    write!(f, "Vec<⋯>")
×
22
                }
23
            })
120✔
24
            .default_in_place(|target| unsafe { target.put(Self::default()) });
98✔
25

26
        if T::SHAPE.vtable.clone_into.is_some() {
27
            builder = builder.clone_into(|src, dst| unsafe {
28
                let mut new_vec = Vec::with_capacity(src.len());
1✔
29

30
                let t_clone_into = <VTableView<T>>::of().clone_into().unwrap();
1✔
31

32
                for item in src {
2✔
33
                    use crate::TypedPtrUninit;
34
                    use core::mem::MaybeUninit;
35

36
                    let mut new_item = MaybeUninit::<T>::uninit();
1✔
37
                    let uninit_item = TypedPtrUninit::new(new_item.as_mut_ptr());
1✔
38

39
                    (t_clone_into)(item, uninit_item);
1✔
40

41
                    new_vec.push(new_item.assume_init());
1✔
42
                }
43

44
                dst.put(new_vec)
1✔
45
            });
1✔
46
        }
47

48
        if T::SHAPE.vtable.debug.is_some() {
49
            builder = builder.debug(|value, f| {
20✔
50
                write!(f, "[")?;
20✔
51
                for (i, item) in value.iter().enumerate() {
40✔
52
                    if i > 0 {
40✔
53
                        write!(f, ", ")?;
24✔
54
                    }
16✔
55
                    (<VTableView<T>>::of().debug().unwrap())(item, f)?;
40✔
56
                }
57
                write!(f, "]")
20✔
58
            });
20✔
59
        }
60

61
        if T::SHAPE.vtable.eq.is_some() {
62
            builder = builder.eq(|a, b| {
4✔
63
                if a.len() != b.len() {
4✔
64
                    return false;
×
65
                }
4✔
66
                for (item_a, item_b) in a.iter().zip(b.iter()) {
7✔
67
                    if !(<VTableView<T>>::of().eq().unwrap())(item_a, item_b) {
7✔
68
                        return false;
2✔
69
                    }
5✔
70
                }
71
                true
2✔
72
            });
4✔
73
        }
74

75
        if T::SHAPE.vtable.hash.is_some() {
76
            builder = builder.hash(|vec, hasher_this, hasher_write_fn| unsafe {
77
                use crate::HasherProxy;
78
                let t_hash = <VTableView<T>>::of().hash().unwrap_unchecked();
×
79
                let mut hasher = HasherProxy::new(hasher_this, hasher_write_fn);
×
80
                vec.len().hash(&mut hasher);
×
81
                for item in vec {
×
82
                    (t_hash)(item, hasher_this, hasher_write_fn);
×
83
                }
×
84
            });
×
85
        }
86

87
        let traits = MarkerTraits::SEND
88
            .union(MarkerTraits::SYNC)
89
            .union(MarkerTraits::EQ)
90
            .union(MarkerTraits::UNPIN)
91
            .intersection(T::SHAPE.vtable.marker_traits);
92
        builder = builder.marker_traits(traits);
93

94
        builder.build()
95
    };
96

97
    const SHAPE: &'static Shape = &const {
98
        Shape::builder_for_sized::<Self>()
99
            .type_params(&[TypeParam {
100
                name: "T",
101
                shape: || T::SHAPE,
102
            }])
103
            .ty(Type::User(UserType::Opaque))
104
            .def(Def::List(
105
                ListDef::builder()
106
                    .vtable(
107
                        &const {
108
                            ListVTable::builder()
109
                                .init_in_place_with_capacity(|data, capacity| unsafe {
110
                                    data.put(Self::with_capacity(capacity))
×
111
                                })
×
112
                                .push(|ptr, item| unsafe {
113
                                    let vec = ptr.as_mut::<Self>();
137✔
114
                                    let item = item.read::<T>();
137✔
115
                                    (*vec).push(item);
137✔
116
                                })
137✔
117
                                .len(|ptr| unsafe {
118
                                    let vec = ptr.get::<Self>();
22✔
119
                                    vec.len()
22✔
120
                                })
22✔
121
                                .get(|ptr, index| unsafe {
122
                                    let vec = ptr.get::<Self>();
17✔
123
                                    let item = vec.get(index)?;
17✔
124
                                    Some(PtrConst::new(item))
14✔
125
                                })
17✔
126
                                .get_mut(|ptr, index| unsafe {
127
                                    let vec = ptr.as_mut::<Self>();
×
128
                                    let item = vec.get_mut(index)?;
×
129
                                    Some(PtrMut::new(item))
×
130
                                })
×
131
                                .as_ptr(|ptr| unsafe {
132
                                    let vec = ptr.get::<Self>();
7✔
133
                                    PtrConst::new(vec.as_ptr())
7✔
134
                                })
7✔
135
                                .as_mut_ptr(|ptr| unsafe {
136
                                    let vec = ptr.as_mut::<Self>();
×
137
                                    PtrMut::new(vec.as_mut_ptr())
×
138
                                })
×
139
                                .iter_vtable(
140
                                    IterVTable::builder()
141
                                        .init_with_value(|ptr| unsafe {
142
                                            let vec = ptr.get::<Self>();
×
143
                                            let iter: VecIterator<T> = vec.iter();
×
144
                                            let iter_state = Box::new(iter);
×
145
                                            PtrMut::new(Box::into_raw(iter_state) as *mut u8)
×
146
                                        })
×
147
                                        .next(|iter_ptr| unsafe {
148
                                            let state = iter_ptr.as_mut::<VecIterator<'_, T>>();
×
149
                                            state.next().map(|value| PtrConst::new(value))
×
150
                                        })
×
151
                                        .next_back(|iter_ptr| unsafe {
152
                                            let state = iter_ptr.as_mut::<VecIterator<'_, T>>();
×
153
                                            state.next_back().map(|value| PtrConst::new(value))
×
154
                                        })
×
155
                                        .dealloc(|iter_ptr| unsafe {
156
                                            drop(Box::from_raw(
×
157
                                                iter_ptr.as_ptr::<VecIterator<'_, T>>()
×
158
                                                    as *mut VecIterator<'_, T>,
×
159
                                            ));
160
                                        })
×
161
                                        .build(),
162
                                )
163
                                .build()
164
                        },
165
                    )
166
                    .t(|| T::SHAPE)
167
                    .build(),
168
            ))
169
            .build()
170
    };
171
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc