Update allocation.rs

This commit is contained in:
Lokathor 2019-11-18 20:39:07 -07:00
parent c03199ed0d
commit efc80f1c4d

View File

@ -104,13 +104,10 @@ pub fn try_cast_vec<A: Pod, B: Pod>(input: Vec<A>) -> Result<Vec<B>, (PodCastErr
let capacity: usize = input.capacity(); let capacity: usize = input.capacity();
// Note(Lokathor): Next we "pre-forget" the old Vec by wrapping with // Note(Lokathor): Next we "pre-forget" the old Vec by wrapping with
// ManuallyDrop, because if we used `core::mem::forget` after taking the // ManuallyDrop, because if we used `core::mem::forget` after taking the
// pointer then that would invalidate our pointer (I think? If not this // pointer then that would invalidate our pointer. In nightly there's a
// still doesn't hurt). // "into raw parts" method, which we can switch this too eventually.
let mut manual_drop_vec = ManuallyDrop::new(input); let mut manual_drop_vec = ManuallyDrop::new(input);
// Note(Lokathor): Finally, we carefully get the pointer we need, cast the let vec_ptr: *mut A = manual_drop_vec.as_mut_ptr();
// type, and then make a new Vec to return. This works all the way back to
// 1.7, if you're on 1.37 or later you can use `Vec::as_mut_ptr` directly.
let vec_ptr: *mut A = Vec::as_mut_slice(&mut *manual_drop_vec).as_mut_ptr();
let ptr: *mut B = vec_ptr.cast::<B>(); let ptr: *mut B = vec_ptr.cast::<B>();
Ok(unsafe { Vec::from_raw_parts(ptr, length, capacity) }) Ok(unsafe { Vec::from_raw_parts(ptr, length, capacity) })
} }