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

facet-rs / facet / 15222427616

24 May 2025 02:17AM UTC coverage: 57.627% (-0.02%) from 57.643%
15222427616

Pull #673

github

web-flow
Merge 484c5ddbc into 950e6a37a
Pull Request #673: Add `Shape.type_identifier` to access type name in const contexts

55 of 103 new or added lines in 23 files covered. (53.4%)

4 existing lines in 3 files now uncovered.

9909 of 17195 relevant lines covered (57.63%)

137.44 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| {
196✔
16
                if let Some(opts) = opts.for_children() {
196✔
17
                    write!(f, "{}<", Self::SHAPE.type_identifier)?;
196✔
18
                    (T::SHAPE.vtable.type_name)(f, opts)?;
196✔
19
                    write!(f, ">")
196✔
20
                } else {
NEW
21
                    write!(f, "{}<⋯>", Self::SHAPE.type_identifier)
×
22
                }
23
            })
196✔
24
            .default_in_place(|| Some(|target| unsafe { target.put(Self::default()) }))
103✔
25
            .clone_into(|| {
17✔
26
                if (T::SHAPE.vtable.clone_into)().is_some() {
17✔
27
                    Some(|src, dst| unsafe {
28
                        let mut new_vec = Vec::with_capacity(src.len());
5✔
29

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

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

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

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

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

44
                        dst.put(new_vec)
5✔
45
                    })
5✔
46
                } else {
47
                    None
×
48
                }
49
            })
17✔
50
            .debug(|| {
52✔
51
                if (T::SHAPE.vtable.debug)().is_some() {
52✔
52
                    Some(|value, f| {
36✔
53
                        write!(f, "[")?;
36✔
54
                        for (i, item) in value.iter().enumerate() {
80✔
55
                            if i > 0 {
80✔
56
                                write!(f, ", ")?;
48✔
57
                            }
32✔
58
                            (<VTableView<T>>::of().debug().unwrap())(item, f)?;
80✔
59
                        }
60
                        write!(f, "]")
36✔
61
                    })
36✔
62
                } else {
63
                    None
×
64
                }
65
            })
52✔
66
            .eq(|| {
16✔
67
                if (T::SHAPE.vtable.eq)().is_some() {
16✔
68
                    Some(|a, b| {
8✔
69
                        if a.len() != b.len() {
8✔
70
                            return false;
×
71
                        }
8✔
72
                        for (item_a, item_b) in a.iter().zip(b.iter()) {
14✔
73
                            if !(<VTableView<T>>::of().eq().unwrap())(item_a, item_b) {
14✔
74
                                return false;
4✔
75
                            }
10✔
76
                        }
77
                        true
4✔
78
                    })
8✔
79
                } else {
80
                    None
×
81
                }
82
            })
16✔
83
            .hash(|| {
×
84
                if (T::SHAPE.vtable.hash)().is_some() {
×
85
                    Some(|vec, hasher_this, hasher_write_fn| unsafe {
86
                        use crate::HasherProxy;
87
                        let t_hash = <VTableView<T>>::of().hash().unwrap_unchecked();
×
88
                        let mut hasher = HasherProxy::new(hasher_this, hasher_write_fn);
×
89
                        vec.len().hash(&mut hasher);
×
90
                        for item in vec {
×
91
                            (t_hash)(item, hasher_this, hasher_write_fn);
×
92
                        }
×
93
                    })
×
94
                } else {
95
                    None
×
96
                }
97
            })
×
98
            .marker_traits(|| {
8✔
99
                MarkerTraits::SEND
100
                    .union(MarkerTraits::SYNC)
8✔
101
                    .union(MarkerTraits::EQ)
8✔
102
                    .union(MarkerTraits::UNPIN)
8✔
103
                    .intersection(T::SHAPE.vtable.marker_traits())
8✔
104
            })
8✔
105
            .build()
106
    };
107

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