From b42bee180eac350ed957b81e81ce6479582a4b51 Mon Sep 17 00:00:00 2001 From: missing Date: Mon, 16 May 2022 10:42:55 -0500 Subject: [PATCH] turns out that was a really easy fix --- src/lib.rs | 15 ++++++++++----- src/test.rs | 1 - 2 files changed, 10 insertions(+), 6 deletions(-) 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];