diff --git a/src/lib.rs b/src/lib.rs index 3dee056..806d312 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -67,7 +67,7 @@ //! //! Finally, a vector can be `unsize`d to another vector: //! -//! ```should_panic +//! ``` //! # use dyn_vec::prelude::{*, vec}; //! # use std::fmt::Debug; //! let vec: Vec = vec![1, 2, 3]; @@ -438,10 +438,15 @@ impl Vec { } /// Converts a `Vec` into a `Vec`, given that `T` can be `CoerceUnsized` into `U`. - pub fn unsize(self) -> Vec where for<'a> &'a T: CoerceUnsized<&'a U> { - #![allow(unreachable_code)] - // FIXME: when fixed, make the 2 relevant tests not should_panic (test::unsize and the line 70 doctest) - panic!("Vec::unsize is unsound rn, sorry yall"); + pub fn unsize(mut self) -> Vec where for<'a> &'a T: CoerceUnsized<&'a U> { + if size_of::>() > size_of::>() { + let elem_size = self.end_ptr.as_ptr() as usize - self.ptr.as_ptr() as usize; + let extra_size = self.len * size_of::>(); + let needed_size = elem_size + extra_size; + if needed_size > self.capacity { + unsafe { self.realloc(needed_size); } + } + } let new_vec = Vec:: { ptr: self.ptr, diff --git a/src/test.rs b/src/test.rs index 0f5c4e0..2ab619e 100644 --- a/src/test.rs +++ b/src/test.rs @@ -189,7 +189,6 @@ fn with_capacity() { assert_ne!(prev_ptr, vec.as_ptr()); } -#[should_panic = "Vec::unsize is unsound rn, sorry yall"] #[test] fn unsize() { let vec = vec![1, 2, 3];