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

facet-rs / facet / 15200164445

23 May 2025 01:21AM UTC coverage: 57.288% (+0.1%) from 57.185%
15200164445

Pull #666

github

web-flow
Merge 4232978c5 into 4b41e5c8a
Pull Request #666: Add indirection to vtable fns to fix cyclic types

715 of 1482 new or added lines in 34 files covered. (48.25%)

14 existing lines in 5 files now uncovered.

9747 of 17014 relevant lines covered (57.29%)

132.73 hits per line

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

61.17
/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
        ValueVTable::builder::<Self>()
15
            .type_name(|f, opts| {
209✔
16
                if let Some(opts) = opts.for_children() {
209✔
17
                    write!(f, "Vec<")?;
209✔
18
                    (T::SHAPE.vtable.type_name)(f, opts)?;
209✔
19
                    write!(f, ">")
209✔
20
                } else {
21
                    write!(f, "Vec<⋯>")
×
22
                }
23
            })
209✔
24
            .default_in_place(|| Some(|target| unsafe { target.put(Self::default()) }))
99✔
25
            .clone_into(|| {
9✔
26
                if (T::SHAPE.vtable.clone_into)().is_some() {
9✔
27
                    Some(|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
                } else {
NEW
47
                    None
×
48
                }
49
            })
9✔
50
            .debug(|| {
28✔
51
                if (T::SHAPE.vtable.debug)().is_some() {
28✔
52
                    Some(|value, f| {
20✔
53
                        write!(f, "[")?;
20✔
54
                        for (i, item) in value.iter().enumerate() {
40✔
55
                            if i > 0 {
40✔
56
                                write!(f, ", ")?;
24✔
57
                            }
16✔
58
                            (<VTableView<T>>::of().debug().unwrap())(item, f)?;
40✔
59
                        }
60
                        write!(f, "]")
20✔
61
                    })
20✔
62
                } else {
NEW
63
                    None
×
64
                }
65
            })
28✔
66
            .eq(|| {
8✔
67
                if (T::SHAPE.vtable.eq)().is_some() {
8✔
68
                    Some(|a, b| {
4✔
69
                        if a.len() != b.len() {
4✔
NEW
70
                            return false;
×
71
                        }
4✔
72
                        for (item_a, item_b) in a.iter().zip(b.iter()) {
7✔
73
                            if !(<VTableView<T>>::of().eq().unwrap())(item_a, item_b) {
7✔
74
                                return false;
2✔
75
                            }
5✔
76
                        }
77
                        true
2✔
78
                    })
4✔
79
                } else {
NEW
80
                    None
×
81
                }
82
            })
8✔
NEW
83
            .hash(|| {
×
NEW
84
                if (T::SHAPE.vtable.hash)().is_some() {
×
85
                    Some(|vec, hasher_this, hasher_write_fn| unsafe {
86
                        use crate::HasherProxy;
NEW
87
                        let t_hash = <VTableView<T>>::of().hash().unwrap_unchecked();
×
NEW
88
                        let mut hasher = HasherProxy::new(hasher_this, hasher_write_fn);
×
NEW
89
                        vec.len().hash(&mut hasher);
×
NEW
90
                        for item in vec {
×
NEW
91
                            (t_hash)(item, hasher_this, hasher_write_fn);
×
NEW
92
                        }
×
NEW
93
                    })
×
94
                } else {
NEW
95
                    None
×
96
                }
NEW
97
            })
×
98
            .marker_traits(|| {
4✔
99
                MarkerTraits::SEND
100
                    .union(MarkerTraits::SYNC)
4✔
101
                    .union(MarkerTraits::EQ)
4✔
102
                    .union(MarkerTraits::UNPIN)
4✔
103
                    .intersection(T::SHAPE.vtable.marker_traits())
4✔
104
            })
4✔
105
            .build()
106
    };
107

108
    const SHAPE: &'static Shape<'static> = &const {
109
        Shape::builder_for_sized::<Self>()
110
            .type_params(&[TypeParam {
111
                name: "T",
112
                shape: || T::SHAPE,
113
            }])
114
            .ty(Type::User(UserType::Opaque))
115
            .def(Def::List(
116
                ListDef::builder()
117
                    .vtable(
118
                        &const {
119
                            ListVTable::builder()
120
                                .init_in_place_with_capacity(|data, capacity| unsafe {
121
                                    data.put(Self::with_capacity(capacity))
×
122
                                })
×
123
                                .push(|ptr, item| unsafe {
124
                                    let vec = ptr.as_mut::<Self>();
201✔
125
                                    let item = item.read::<T>();
201✔
126
                                    (*vec).push(item);
201✔
127
                                })
201✔
128
                                .len(|ptr| unsafe {
129
                                    let vec = ptr.get::<Self>();
22✔
130
                                    vec.len()
22✔
131
                                })
22✔
132
                                .get(|ptr, index| unsafe {
133
                                    let vec = ptr.get::<Self>();
17✔
134
                                    let item = vec.get(index)?;
17✔
135
                                    Some(PtrConst::new(item))
14✔
136
                                })
17✔
137
                                .get_mut(|ptr, index| unsafe {
138
                                    let vec = ptr.as_mut::<Self>();
×
139
                                    let item = vec.get_mut(index)?;
×
140
                                    Some(PtrMut::new(item))
×
141
                                })
×
142
                                .as_ptr(|ptr| unsafe {
143
                                    let vec = ptr.get::<Self>();
7✔
144
                                    PtrConst::new(vec.as_ptr())
7✔
145
                                })
7✔
146
                                .as_mut_ptr(|ptr| unsafe {
147
                                    let vec = ptr.as_mut::<Self>();
×
148
                                    PtrMut::new(vec.as_mut_ptr())
×
149
                                })
×
150
                                .iter_vtable(
151
                                    IterVTable::builder()
152
                                        .init_with_value(|ptr| unsafe {
153
                                            let vec = ptr.get::<Self>();
×
154
                                            let iter: VecIterator<T> = vec.iter();
×
155
                                            let iter_state = Box::new(iter);
×
156
                                            PtrMut::new(Box::into_raw(iter_state) as *mut u8)
×
157
                                        })
×
158
                                        .next(|iter_ptr| unsafe {
159
                                            let state = iter_ptr.as_mut::<VecIterator<'_, T>>();
×
160
                                            state.next().map(|value| PtrConst::new(value))
×
161
                                        })
×
162
                                        .next_back(|iter_ptr| unsafe {
163
                                            let state = iter_ptr.as_mut::<VecIterator<'_, T>>();
×
164
                                            state.next_back().map(|value| PtrConst::new(value))
×
165
                                        })
×
166
                                        .dealloc(|iter_ptr| unsafe {
167
                                            drop(Box::from_raw(
×
168
                                                iter_ptr.as_ptr::<VecIterator<'_, T>>()
×
169
                                                    as *mut VecIterator<'_, T>,
×
170
                                            ));
171
                                        })
×
172
                                        .build(),
173
                                )
174
                                .build()
175
                        },
176
                    )
177
                    .t(|| T::SHAPE)
178
                    .build(),
179
            ))
180
            .build()
181
    };
182
}
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

© 2025 Coveralls, Inc