dst_container/
unsized_slice.rs

1use crate::*;
2
3#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, MaybeUninitProject, UnsizedClone)]
4#[repr(C)]
5/// Represents a [`Sized`] header and an unsized slice.
6pub struct UnsizedSlice<H, T> {
7    /// The header.
8    pub header: H,
9    /// The unsized slice.
10    pub slice: [T],
11}
12
13#[cfg(test)]
14mod test {
15    use crate::*;
16    use std::sync::Arc;
17
18    #[test]
19    fn new_box() {
20        let b = unsafe {
21            Box::<UnsizedSlice<u32, u64>>::new_unsized_with(6, |slice| {
22                slice.header.write(114514u32);
23                slice.slice.write_copy_of_slice(&[1u64, 1, 4, 5, 1, 4]);
24            })
25        };
26        assert_eq!(b.header, 114514);
27        assert_eq!(b.slice, [1, 1, 4, 5, 1, 4]);
28    }
29
30    #[test]
31    fn zeroed() {
32        let b: Box<UnsizedSlice<_, _>> =
33            unsafe { Box::<UnsizedSlice<u64, u128>>::new_zeroed_unsized(6).assume_init() };
34        assert_eq!(b.header, 0);
35        assert_eq!(b.slice, [0, 0, 0, 0, 0, 0]);
36    }
37
38    #[test]
39    fn untrivial_drop() {
40        let data = Arc::new(());
41
42        let b = unsafe {
43            Box::<UnsizedSlice<Arc<()>, Arc<()>>>::new_unsized_with(2, |slice| {
44                slice.header.write(data.clone());
45                slice
46                    .slice
47                    .write_clone_of_slice(&[data.clone(), data.clone()]);
48            })
49        };
50        assert_eq!(Arc::strong_count(&data), 4);
51
52        let b_clone = b.clone();
53        assert_eq!(Arc::strong_count(&data), 7);
54
55        drop(b_clone);
56        drop(b);
57        assert_eq!(Arc::strong_count(&data), 1);
58    }
59}