nanvm_lib/mem/flexible_array/
header.rs

1use super::constructor::FlexibleArrayConstructor;
2
3pub trait FlexibleArrayHeader: Sized {
4    // required
5    fn len(&self) -> usize;
6    fn is_empty(&self) -> bool {
7        self.len() == 0
8    }
9    #[inline(always)]
10    fn constructor<I: Iterator>(self, items: I) -> FlexibleArrayConstructor<Self, I> {
11        FlexibleArrayConstructor::new(self, items)
12    }
13}
14
15impl FlexibleArrayHeader for usize {
16    #[inline(always)]
17    fn len(&self) -> usize {
18        *self
19    }
20}
21
22#[cfg(test)]
23mod test {
24    use wasm_bindgen_test::wasm_bindgen_test;
25
26    use crate::mem::{
27        constructor::Constructor,
28        flexible_array::{constructor::FlexibleArrayConstructor, FlexibleArray},
29        object::Object,
30    };
31
32    use super::FlexibleArrayHeader;
33
34    struct H();
35
36    impl FlexibleArrayHeader for H {
37        fn len(&self) -> usize {
38            5
39        }
40    }
41
42    #[test]
43    #[wasm_bindgen_test]
44    fn test() {
45        let x = H();
46        let y = x.constructor([1, 2, 3, 4, 5].iter().copied());
47        let mut buffer = [0u8; 5];
48        unsafe { y.construct(buffer.as_mut_ptr() as *mut FlexibleArray<u8, H>) };
49        assert_eq!(buffer, [1, 2, 3, 4, 5]);
50    }
51
52    #[repr(C)]
53    struct Item(*mut u8);
54
55    impl Drop for Item {
56        fn drop(&mut self) {
57            unsafe {
58                *self.0 += 1;
59            }
60        }
61    }
62
63    #[test]
64    #[wasm_bindgen_test]
65    fn test_len() {
66        let mut buffer = [0usize; 5];
67
68        let mut i: u8 = 0;
69        {
70            let p = &mut i as *mut _;
71            let v = [Item(p), Item(p), Item(p), Item(p)];
72            let x: FlexibleArrayConstructor<_, _> = v.into_iter().into();
73            unsafe { x.construct(buffer.as_ptr() as *mut _) }
74            assert_eq!(i, 0);
75            assert_eq!(buffer[0], 4);
76            assert_eq!(p, buffer[1] as *mut _);
77            assert_eq!(p, buffer[2] as *mut _);
78            assert_eq!(p, buffer[3] as *mut _);
79            assert_eq!(p, buffer[4] as *mut _);
80            let px = buffer.as_mut_ptr() as *mut FlexibleArray<Item, usize>;
81            unsafe { (*px).object_drop() };
82            assert_eq!(i, 4);
83        }
84        assert_eq!(i, 4);
85    }
86}