Rollup merge of #72811 - pickfire:liballoc-impl, r=Amanieu
Liballoc impl Mainly code rearrangements
This commit is contained in:
commit
13815e4b35
|
@ -118,6 +118,30 @@ impl<T> RawVec<T, Global> {
|
||||||
RawVec::from_raw_parts(slice.as_mut_ptr(), slice.len())
|
RawVec::from_raw_parts(slice.as_mut_ptr(), slice.len())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Converts the entire buffer into `Box<[MaybeUninit<T>]>` with the specified `len`.
|
||||||
|
///
|
||||||
|
/// Note that this will correctly reconstitute any `cap` changes
|
||||||
|
/// that may have been performed. (See description of type for details.)
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// * `len` must be greater than or equal to the most recently requested capacity, and
|
||||||
|
/// * `len` must be less than or equal to `self.capacity()`.
|
||||||
|
///
|
||||||
|
/// Note, that the requested capacity and `self.capacity()` could differ, as
|
||||||
|
/// an allocator could overallocate and return a greater memory block than requested.
|
||||||
|
pub unsafe fn into_box(self, len: usize) -> Box<[MaybeUninit<T>]> {
|
||||||
|
// Sanity-check one half of the safety requirement (we cannot check the other half).
|
||||||
|
debug_assert!(
|
||||||
|
len <= self.capacity(),
|
||||||
|
"`len` must be smaller than or equal to `self.capacity()`"
|
||||||
|
);
|
||||||
|
|
||||||
|
let me = ManuallyDrop::new(self);
|
||||||
|
let slice = slice::from_raw_parts_mut(me.ptr() as *mut MaybeUninit<T>, len);
|
||||||
|
Box::from_raw(slice)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, A: AllocRef> RawVec<T, A> {
|
impl<T, A: AllocRef> RawVec<T, A> {
|
||||||
|
@ -520,32 +544,6 @@ where
|
||||||
Ok(memory)
|
Ok(memory)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> RawVec<T, Global> {
|
|
||||||
/// Converts the entire buffer into `Box<[MaybeUninit<T>]>` with the specified `len`.
|
|
||||||
///
|
|
||||||
/// Note that this will correctly reconstitute any `cap` changes
|
|
||||||
/// that may have been performed. (See description of type for details.)
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// * `len` must be greater than or equal to the most recently requested capacity, and
|
|
||||||
/// * `len` must be less than or equal to `self.capacity()`.
|
|
||||||
///
|
|
||||||
/// Note, that the requested capacity and `self.capacity()` could differ, as
|
|
||||||
/// an allocator could overallocate and return a greater memory block than requested.
|
|
||||||
pub unsafe fn into_box(self, len: usize) -> Box<[MaybeUninit<T>]> {
|
|
||||||
// Sanity-check one half of the safety requirement (we cannot check the other half).
|
|
||||||
debug_assert!(
|
|
||||||
len <= self.capacity(),
|
|
||||||
"`len` must be smaller than or equal to `self.capacity()`"
|
|
||||||
);
|
|
||||||
|
|
||||||
let me = ManuallyDrop::new(self);
|
|
||||||
let slice = slice::from_raw_parts_mut(me.ptr() as *mut MaybeUninit<T>, len);
|
|
||||||
Box::from_raw(slice)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<#[may_dangle] T, A: AllocRef> Drop for RawVec<T, A> {
|
unsafe impl<#[may_dangle] T, A: AllocRef> Drop for RawVec<T, A> {
|
||||||
/// Frees the memory owned by the `RawVec` *without* trying to drop its contents.
|
/// Frees the memory owned by the `RawVec` *without* trying to drop its contents.
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
|
|
|
@ -1905,6 +1905,22 @@ unsafe impl<T: ?Sized> IsZero for Option<Box<T>> {
|
||||||
// Common trait implementations for Vec
|
// Common trait implementations for Vec
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
impl<T> ops::Deref for Vec<T> {
|
||||||
|
type Target = [T];
|
||||||
|
|
||||||
|
fn deref(&self) -> &[T] {
|
||||||
|
unsafe { slice::from_raw_parts(self.as_ptr(), self.len) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
impl<T> ops::DerefMut for Vec<T> {
|
||||||
|
fn deref_mut(&mut self) -> &mut [T] {
|
||||||
|
unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Clone> Clone for Vec<T> {
|
impl<T: Clone> Clone for Vec<T> {
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
|
@ -1960,22 +1976,6 @@ impl<T, I: SliceIndex<[T]>> IndexMut<I> for Vec<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl<T> ops::Deref for Vec<T> {
|
|
||||||
type Target = [T];
|
|
||||||
|
|
||||||
fn deref(&self) -> &[T] {
|
|
||||||
unsafe { slice::from_raw_parts(self.as_ptr(), self.len) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl<T> ops::DerefMut for Vec<T> {
|
|
||||||
fn deref_mut(&mut self) -> &mut [T] {
|
|
||||||
unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T> FromIterator<T> for Vec<T> {
|
impl<T> FromIterator<T> for Vec<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
Loading…
Reference in New Issue