dst_container/
unsized_slice.rs1use crate::*;
2
3#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, MaybeUninitProject, UnsizedClone)]
4#[repr(C)]
5pub struct UnsizedSlice<H, T> {
7 pub header: H,
9 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}