From 8778483b12529930081a9e56b60f613d723e9ad9 Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Tue, 25 May 2021 21:57:59 +0100 Subject: [PATCH] feat: API additions --- src/arrayvec.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/arrayvec.rs b/src/arrayvec.rs index 5700237..ef391f0 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -636,14 +636,29 @@ impl ArrayVec { if self.len() < self.capacity() { Err(self) } else { - unsafe { - let self_ = ManuallyDrop::new(self); - let array = ptr::read(self_.as_ptr() as *const [T; CAP]); - Ok(array) - } + unsafe { Ok(self.into_inner_unchecked()) } } } + pub unsafe fn into_inner_unchecked(self) -> [T; CAP] { + let self_ = ManuallyDrop::new(self); + let array = ptr::read(self_.as_ptr() as *const [T; CAP]); + array + } + + pub fn take(&mut self) -> Option<[T; CAP]> { + if self.len() < self.capacity() { + None + } else { + unsafe { Some(self.take_unchecked()) } + } + } + + pub unsafe fn take_unchecked(&mut self) -> [T; CAP] { + let data = std::mem::replace(self, Self::new()); + data.into_inner_unchecked() + } + /// Return a slice containing all elements of the vector. pub fn as_slice(&self) -> &[T] { ArrayVecImpl::as_slice(self)