diff options
author | HampusM <hampus@hampusmat.com> | 2025-03-28 14:36:59 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-03-28 14:37:06 +0100 |
commit | 24c8b35725a1bb4faf511c992c0e4a6346cb75f7 (patch) | |
tree | eb172ea555191dc04b0e0d3d2586735eb338f160 /src | |
parent | 11ba9c8430069a7b8f3b86cc0071740e582a12c2 (diff) |
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] |