nanvm_lib/mem/flexible_array/
header.rs1use super::constructor::FlexibleArrayConstructor;
2
3pub trait FlexibleArrayHeader: Sized {
4 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}