diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 75 |
1 files changed, 74 insertions, 1 deletions
@@ -846,7 +846,7 @@ mod tests } #[test] - fn push_all_unsized_fields_work() + fn push_with_all_unsized_fields_works() { struct UnsizedThing; @@ -854,6 +854,79 @@ mod tests multi_vec.push([OwnedAnyPtr::new(()), OwnedAnyPtr::new(UnsizedThing)]); multi_vec.push([OwnedAnyPtr::new(()), OwnedAnyPtr::new(UnsizedThing)]); + + assert_eq!(multi_vec.field_arr_byte_offsets, [0, 0]); + } + + #[test] + fn push_with_some_unsized_fields_works() + { + struct UnsizedThing; + + #[derive(Debug, PartialEq, Eq)] + struct CustomerName + { + name: &'static str, + } + + #[derive(Debug, PartialEq, Eq)] + struct CustomerAge + { + age: u8, + } + + let mut multi_vec = MultiVec::new(); + + multi_vec.push([ + OwnedAnyPtr::new(CustomerName { name: "Bob Vance" }), + OwnedAnyPtr::new(UnsizedThing), + OwnedAnyPtr::new(CustomerAge { age: 54 }), + ]); + + multi_vec.push([ + OwnedAnyPtr::new(CustomerName { name: "Andy Bernard" }), + OwnedAnyPtr::new(UnsizedThing), + OwnedAnyPtr::new(CustomerAge { age: 40 }), + ]); + + assert_eq!(multi_vec.capacity, 4); + assert_eq!(multi_vec.length, 2); + + assert_eq!( + multi_vec.field_arr_byte_offsets, + [ + 0, + size_of::<CustomerName>() * multi_vec.capacity, + size_of::<CustomerName>() * multi_vec.capacity, + ] + ); + + assert_eq!( + unsafe { + std::slice::from_raw_parts::<CustomerName>( + multi_vec.ptr.as_ptr().cast(), + 2, + ) + }, + [ + CustomerName { name: "Bob Vance" }, + CustomerName { name: "Andy Bernard" } + ] + ); + + assert_eq!( + unsafe { + std::slice::from_raw_parts::<CustomerAge>( + multi_vec + .ptr + .as_ptr() + .byte_add(multi_vec.field_arr_byte_offsets[2]) + .cast(), + 2, + ) + }, + [CustomerAge { age: 54 }, CustomerAge { age: 40 }] + ); } //#[test] |