diff --git a/src/lib.rs b/src/lib.rs index 1ff288c..97ecebf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,15 +5,10 @@ inherent_associated_types )] -use std::{ - marker::PhantomData, - mem::MaybeUninit, - ops, - ptr::{self, addr_of_mut}, -}; +use std::{marker::PhantomData, ops, ptr}; #[repr(C, align(16))] -struct Data([u8; 48]); +struct Data([*mut u8; 6]); pub struct Dyn<'a, Trait: ?Sized + 'a> { _phantom1: PhantomData, @@ -61,13 +56,15 @@ where { fn from(value: Iter) -> Self { let (_, meta) = (&value as &Self::Target as *const Self::Target).to_raw_parts(); - unsafe { - let mut ret = MaybeUninit::::zeroed(); - let pret = ret.as_mut_ptr(); - (addr_of_mut!((*pret).data) as *mut Iter).write(value); - addr_of_mut!((*pret).meta).write(meta); - ret.assume_init() - } + let mut ret = Self { + _phantom1: PhantomData, + _phantom2: PhantomData, + meta, + data: Data([std::ptr::null_mut(); _]), + }; + let pdata = ret.data.0.as_mut_ptr(); + unsafe { (pdata as *mut Iter).write(value) }; + ret } } @@ -94,4 +91,10 @@ mod tests { let mut it: Dyn> = Small([42; 48]).into(); assert_eq!(it.next(), Some(42)); } + + #[test] + fn vec() { + let mut it: Dyn> = vec![42; 48].into_iter().into(); + assert_eq!(it.next(), Some(42)); + } }