use core::mem::{self, ManuallyDrop};
use core::slice;
use allocator_api2::alloc::{AllocError, Allocator};
use super::Vec;
use crate::arc::Arc;
use crate::r#box::Box;
impl<'a, T, A: Allocator + Clone> Vec<'a, T, A> {
#[must_use]
pub fn into_boxed_slice(self) -> Box<[T], A> {
let arena = self.arena;
let mut me = ManuallyDrop::new(self);
let iter = me.buf.drain_all();
let bx = arena.alloc_slice_fill_iter_box::<T, _>(iter);
drop(ManuallyDrop::into_inner(me));
bx
}
pub fn try_into_boxed_slice(self) -> Result<Box<[T], A>, AllocError> {
let arena = self.arena;
let mut me = ManuallyDrop::new(self);
let iter = me.buf.drain_all();
let result = arena.try_alloc_slice_fill_iter_box::<T, _>(iter);
drop(ManuallyDrop::into_inner(me));
result
}
pub fn try_into_arc(self) -> Result<Arc<[T], A>, AllocError>
where
T: Send + Sync,
A: Send + Sync,
{
let arena = self.arena;
let mut me = ManuallyDrop::new(self);
let iter = me.buf.drain_all();
let result = arena.try_alloc_slice_fill_iter_arc::<T, _>(iter);
drop(ManuallyDrop::into_inner(me));
result
}
#[must_use]
pub fn leak(mut self) -> &'a mut [T] {
const {
assert!(
!mem::needs_drop::<T>(),
"Vec::leak requires T not to need Drop; freeze via Box::from / Arc::from instead",
);
}
let _ = self.reclaim_capacity_tail(self.buf.len());
let mut me = ManuallyDrop::new(self);
let ptr = me.buf.as_mut_ptr();
let len = me.buf.len();
unsafe { slice::from_raw_parts_mut(ptr, len) }
}
pub(crate) fn freeze_into_arc(self) -> Arc<[T], A>
where
T: Send + Sync,
A: Send + Sync,
{
let arena = self.arena;
let mut me = ManuallyDrop::new(self);
let iter = me.buf.drain_all();
let arc = arena.alloc_slice_fill_iter_arc::<T, _>(iter);
drop(ManuallyDrop::into_inner(me));
arc
}
}