1b8e97b5bSNick Fitzgerald use crate::alloc::{TryClone, try_realloc}; 2e0ee4552SNick Fitzgerald use crate::error::OutOfMemory; 3*cfd8a4d2SNick Fitzgerald use core::borrow::Borrow; 4e0ee4552SNick Fitzgerald use core::{ 55c2795e4SNick Fitzgerald cmp::Ordering, 65c2795e4SNick Fitzgerald fmt, 75c2795e4SNick Fitzgerald marker::PhantomData, 85c2795e4SNick Fitzgerald mem, 95c2795e4SNick Fitzgerald num::NonZeroUsize, 10e0ee4552SNick Fitzgerald ops::{Deref, DerefMut, Index, IndexMut}, 115c2795e4SNick Fitzgerald slice::SliceIndex, 12e0ee4552SNick Fitzgerald }; 1371c51d03SNick Fitzgerald use serde::ser::SerializeSeq; 1428f6f5e7SAlex Crichton use std_alloc::alloc::Layout; 1528f6f5e7SAlex Crichton use std_alloc::boxed::Box; 16e0ee4552SNick Fitzgerald use std_alloc::vec::Vec as StdVec; 17e0ee4552SNick Fitzgerald 1883cf59f2SNick Fitzgerald /// Same as the [`std::vec!`] macro but returns an error on allocation failure. 1983cf59f2SNick Fitzgerald #[macro_export] 2083cf59f2SNick Fitzgerald macro_rules! vec { 2183cf59f2SNick Fitzgerald ( $( $elem:expr ),* ) => {{ 2283cf59f2SNick Fitzgerald let len = $crate::private_len!( $( $elem ),* ); 2383cf59f2SNick Fitzgerald $crate::alloc::Vec::with_capacity(len).and_then(|mut v| { 2483cf59f2SNick Fitzgerald $( v.push($elem)?; )* 2583cf59f2SNick Fitzgerald let _ = &mut v; 2683cf59f2SNick Fitzgerald Ok(v) 2783cf59f2SNick Fitzgerald }) 2883cf59f2SNick Fitzgerald }}; 2983cf59f2SNick Fitzgerald 3083cf59f2SNick Fitzgerald ( $elem:expr; $len:expr ) => {{ 3183cf59f2SNick Fitzgerald let len: usize = $len; 3283cf59f2SNick Fitzgerald if let Some(len) = ::core::num::NonZeroUsize::new(len) { 3383cf59f2SNick Fitzgerald let elem = $elem; 3483cf59f2SNick Fitzgerald $crate::alloc::Vec::from_elem(elem, len) 3583cf59f2SNick Fitzgerald } else { 3683cf59f2SNick Fitzgerald Ok($crate::alloc::Vec::new()) 3783cf59f2SNick Fitzgerald } 3883cf59f2SNick Fitzgerald }}; 3983cf59f2SNick Fitzgerald 4083cf59f2SNick Fitzgerald } 4183cf59f2SNick Fitzgerald 4283cf59f2SNick Fitzgerald // Only for use by the `vec!` macro. 4383cf59f2SNick Fitzgerald #[doc(hidden)] 4483cf59f2SNick Fitzgerald #[macro_export] 4583cf59f2SNick Fitzgerald macro_rules! private_len { 4683cf59f2SNick Fitzgerald ( ) => { 0 }; 4783cf59f2SNick Fitzgerald ( $e:expr $( , $es:expr )* ) => { 1 + $crate::private_len!( $( $es ),* ) }; 4883cf59f2SNick Fitzgerald } 4983cf59f2SNick Fitzgerald 50e0ee4552SNick Fitzgerald /// Like `std::vec::Vec` but all methods that allocate force handling allocation 51e0ee4552SNick Fitzgerald /// failure. 52e0ee4552SNick Fitzgerald #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] 53e0ee4552SNick Fitzgerald pub struct Vec<T> { 54e0ee4552SNick Fitzgerald inner: StdVec<T>, 55e0ee4552SNick Fitzgerald } 56e0ee4552SNick Fitzgerald 57e0ee4552SNick Fitzgerald impl<T> Default for Vec<T> { 58e0ee4552SNick Fitzgerald fn default() -> Self { 59e0ee4552SNick Fitzgerald Self { 60e0ee4552SNick Fitzgerald inner: Default::default(), 61e0ee4552SNick Fitzgerald } 62e0ee4552SNick Fitzgerald } 63e0ee4552SNick Fitzgerald } 64e0ee4552SNick Fitzgerald 65e0ee4552SNick Fitzgerald impl<T: fmt::Debug> fmt::Debug for Vec<T> { 66e0ee4552SNick Fitzgerald fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 67e0ee4552SNick Fitzgerald fmt::Debug::fmt(&self.inner, f) 68e0ee4552SNick Fitzgerald } 69e0ee4552SNick Fitzgerald } 70e0ee4552SNick Fitzgerald 71b8e97b5bSNick Fitzgerald impl<T> TryClone for Vec<T> 72b8e97b5bSNick Fitzgerald where 73b8e97b5bSNick Fitzgerald T: TryClone, 74b8e97b5bSNick Fitzgerald { 75b8e97b5bSNick Fitzgerald fn try_clone(&self) -> Result<Self, OutOfMemory> { 76b8e97b5bSNick Fitzgerald let mut v = Vec::with_capacity(self.len())?; 77b8e97b5bSNick Fitzgerald for x in self { 78b8e97b5bSNick Fitzgerald v.push(x.try_clone()?).expect("reserved capacity"); 79b8e97b5bSNick Fitzgerald } 80b8e97b5bSNick Fitzgerald Ok(v) 81b8e97b5bSNick Fitzgerald } 82b8e97b5bSNick Fitzgerald } 83b8e97b5bSNick Fitzgerald 84e0ee4552SNick Fitzgerald impl<T> Vec<T> { 85e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::new`]. 86c2112959SNick Fitzgerald pub const fn new() -> Self { 87c2112959SNick Fitzgerald Self { 88c2112959SNick Fitzgerald inner: StdVec::new(), 89c2112959SNick Fitzgerald } 90e0ee4552SNick Fitzgerald } 91e0ee4552SNick Fitzgerald 92e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::with_capacity`] but returns an error on 93e0ee4552SNick Fitzgerald /// allocation failure. 94e0ee4552SNick Fitzgerald pub fn with_capacity(capacity: usize) -> Result<Self, OutOfMemory> { 95e0ee4552SNick Fitzgerald let mut v = Self::new(); 96e0ee4552SNick Fitzgerald v.reserve(capacity)?; 97e0ee4552SNick Fitzgerald Ok(v) 98e0ee4552SNick Fitzgerald } 99e0ee4552SNick Fitzgerald 10083cf59f2SNick Fitzgerald // For use with the `vec!` macro. 10183cf59f2SNick Fitzgerald #[doc(hidden)] 10283cf59f2SNick Fitzgerald #[inline] 10383cf59f2SNick Fitzgerald pub fn from_elem(elem: T, len: NonZeroUsize) -> Result<Self, OutOfMemory> 10483cf59f2SNick Fitzgerald where 10583cf59f2SNick Fitzgerald T: TryClone, 10683cf59f2SNick Fitzgerald { 10783cf59f2SNick Fitzgerald let mut v = Self::with_capacity(len.get())?; 10883cf59f2SNick Fitzgerald 10983cf59f2SNick Fitzgerald // Minimize calls to `TryClone` by always pushing `elem` itself as the 11083cf59f2SNick Fitzgerald // last element. 11183cf59f2SNick Fitzgerald for _ in 0..len.get() - 1 { 11283cf59f2SNick Fitzgerald v.push(elem.try_clone()?)?; 11383cf59f2SNick Fitzgerald } 11483cf59f2SNick Fitzgerald v.push(elem)?; 11583cf59f2SNick Fitzgerald 11683cf59f2SNick Fitzgerald Ok(v) 11783cf59f2SNick Fitzgerald } 11883cf59f2SNick Fitzgerald 119e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::reserve`] but returns an error on allocation 120e0ee4552SNick Fitzgerald /// failure. 121e0ee4552SNick Fitzgerald pub fn reserve(&mut self, additional: usize) -> Result<(), OutOfMemory> { 122e0ee4552SNick Fitzgerald self.inner.try_reserve(additional).map_err(|_| { 123e0ee4552SNick Fitzgerald OutOfMemory::new( 124e0ee4552SNick Fitzgerald self.len() 125e0ee4552SNick Fitzgerald .saturating_add(additional) 12635483cc4SNick Fitzgerald .saturating_mul(mem::size_of::<T>()), 127e0ee4552SNick Fitzgerald ) 128e0ee4552SNick Fitzgerald }) 129e0ee4552SNick Fitzgerald } 130e0ee4552SNick Fitzgerald 131e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::reserve_exact`] but returns an error on allocation 132e0ee4552SNick Fitzgerald /// failure. 133e0ee4552SNick Fitzgerald pub fn reserve_exact(&mut self, additional: usize) -> Result<(), OutOfMemory> { 134e0ee4552SNick Fitzgerald self.inner 135e0ee4552SNick Fitzgerald .try_reserve_exact(additional) 136e0ee4552SNick Fitzgerald .map_err(|_| OutOfMemory::new(self.len().saturating_add(additional))) 137e0ee4552SNick Fitzgerald } 138e0ee4552SNick Fitzgerald 139e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::len`]. 140e0ee4552SNick Fitzgerald pub fn len(&self) -> usize { 141e0ee4552SNick Fitzgerald self.inner.len() 142e0ee4552SNick Fitzgerald } 143e0ee4552SNick Fitzgerald 144e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::capacity`]. 145e0ee4552SNick Fitzgerald pub fn capacity(&self) -> usize { 146e0ee4552SNick Fitzgerald self.inner.capacity() 147e0ee4552SNick Fitzgerald } 148e0ee4552SNick Fitzgerald 149e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::is_empty`]. 150e0ee4552SNick Fitzgerald pub fn is_empty(&self) -> bool { 151e0ee4552SNick Fitzgerald self.inner.is_empty() 152e0ee4552SNick Fitzgerald } 153e0ee4552SNick Fitzgerald 154e0ee4552SNick Fitzgerald /// Same as [`std::vec::Vec::push`] but returns an error on allocation 155e0ee4552SNick Fitzgerald /// failure. 156e0ee4552SNick Fitzgerald pub fn push(&mut self, value: T) -> Result<(), OutOfMemory> { 157e0ee4552SNick Fitzgerald self.reserve(1)?; 158e0ee4552SNick Fitzgerald self.inner.push(value); 159e0ee4552SNick Fitzgerald Ok(()) 160e0ee4552SNick Fitzgerald } 161342710aeSNick Fitzgerald 1629cc85ab9SNick Fitzgerald /// Same as [`std::vec::Vec::pop`]. 1639cc85ab9SNick Fitzgerald pub fn pop(&mut self) -> Option<T> { 1649cc85ab9SNick Fitzgerald self.inner.pop() 1659cc85ab9SNick Fitzgerald } 1669cc85ab9SNick Fitzgerald 1679ead02e7SNick Fitzgerald /// Same as [`std::vec::Vec::truncate`]. 1689ead02e7SNick Fitzgerald pub fn truncate(&mut self, len: usize) { 1699ead02e7SNick Fitzgerald self.inner.truncate(len); 1709ead02e7SNick Fitzgerald } 1719ead02e7SNick Fitzgerald 1729ead02e7SNick Fitzgerald /// Same as [`std::vec::Vec::resize`] but returns an error on allocation 1739ead02e7SNick Fitzgerald /// failure. 1749ead02e7SNick Fitzgerald pub fn resize(&mut self, new_len: usize, value: T) -> Result<(), OutOfMemory> 1759ead02e7SNick Fitzgerald where 1769ead02e7SNick Fitzgerald T: TryClone, 1779ead02e7SNick Fitzgerald { 1789ead02e7SNick Fitzgerald match new_len.cmp(&self.len()) { 1799ead02e7SNick Fitzgerald Ordering::Less => self.truncate(new_len), 1809ead02e7SNick Fitzgerald Ordering::Equal => {} 1819ead02e7SNick Fitzgerald Ordering::Greater => { 1829ead02e7SNick Fitzgerald let delta = new_len - self.len(); 1839ead02e7SNick Fitzgerald self.reserve(delta)?; 1849ead02e7SNick Fitzgerald // Minimize `try_clone` calls by always pushing `value` directly 1859ead02e7SNick Fitzgerald // as the last element. 1869ead02e7SNick Fitzgerald for _ in 0..delta - 1 { 1879ead02e7SNick Fitzgerald self.push(value.try_clone()?)?; 1889ead02e7SNick Fitzgerald } 1899ead02e7SNick Fitzgerald self.push(value)?; 1909ead02e7SNick Fitzgerald } 1919ead02e7SNick Fitzgerald } 1929ead02e7SNick Fitzgerald Ok(()) 1939ead02e7SNick Fitzgerald } 1949ead02e7SNick Fitzgerald 1955999e5beSNick Fitzgerald /// Same as [`std::vec::Vec::into_raw_parts`]. 1965999e5beSNick Fitzgerald pub fn into_raw_parts(mut self) -> (*mut T, usize, usize) { 1975999e5beSNick Fitzgerald // NB: Can't use `Vec::into_raw_parts` until our MSRV is >= 1.93. 19828f6f5e7SAlex Crichton #[cfg(not(miri))] 19928f6f5e7SAlex Crichton { 2005999e5beSNick Fitzgerald let ptr = self.as_mut_ptr(); 2015999e5beSNick Fitzgerald let len = self.len(); 2025999e5beSNick Fitzgerald let cap = self.capacity(); 20335483cc4SNick Fitzgerald mem::forget(self); 2045999e5beSNick Fitzgerald (ptr, len, cap) 2055999e5beSNick Fitzgerald } 20628f6f5e7SAlex Crichton // NB: Miri requires using `into_raw_parts`, but always run on nightly, 20728f6f5e7SAlex Crichton // so it's fine to use there. 20828f6f5e7SAlex Crichton #[cfg(miri)] 20928f6f5e7SAlex Crichton { 21028f6f5e7SAlex Crichton let _ = &mut self; 21128f6f5e7SAlex Crichton self.inner.into_raw_parts() 21228f6f5e7SAlex Crichton } 21328f6f5e7SAlex Crichton } 2145999e5beSNick Fitzgerald 2155999e5beSNick Fitzgerald /// Same as [`std::vec::Vec::from_raw_parts`]. 2165999e5beSNick Fitzgerald pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Self { 2175999e5beSNick Fitzgerald Vec { 2185999e5beSNick Fitzgerald // Safety: Same as our unsafe contract. 2195999e5beSNick Fitzgerald inner: unsafe { StdVec::from_raw_parts(ptr, length, capacity) }, 2205999e5beSNick Fitzgerald } 2215999e5beSNick Fitzgerald } 2225999e5beSNick Fitzgerald 223342710aeSNick Fitzgerald /// Same as [`std::vec::Vec::drain`]. 224342710aeSNick Fitzgerald pub fn drain<R>(&mut self, range: R) -> std_alloc::vec::Drain<'_, T> 225342710aeSNick Fitzgerald where 226342710aeSNick Fitzgerald R: core::ops::RangeBounds<usize>, 227342710aeSNick Fitzgerald { 228342710aeSNick Fitzgerald self.inner.drain(range) 229342710aeSNick Fitzgerald } 23028f6f5e7SAlex Crichton 2310c673b70SNick Fitzgerald /// Same as [`std::vec::Vec::shrink_to_fit`] but returns an error on 2320c673b70SNick Fitzgerald /// allocation failure. 2330c673b70SNick Fitzgerald pub fn shrink_to_fit(&mut self) -> Result<(), OutOfMemory> { 2340c673b70SNick Fitzgerald // If our length is already equal to our capacity, then there is nothing 2350c673b70SNick Fitzgerald // to shrink. 2360c673b70SNick Fitzgerald if self.len() == self.capacity() { 2370c673b70SNick Fitzgerald return Ok(()); 2380c673b70SNick Fitzgerald } 2390c673b70SNick Fitzgerald 24028f6f5e7SAlex Crichton // `realloc` requires a non-zero original layout as well as a non-zero 24128f6f5e7SAlex Crichton // destination layout, so this guard ensures that the sizes below are 2420c673b70SNick Fitzgerald // all nonzero. This handles a few cases: 24328f6f5e7SAlex Crichton // 24428f6f5e7SAlex Crichton // * If `len == cap == 0` then no allocation has ever been made. 24528f6f5e7SAlex Crichton // * If `len == 0` and `cap != 0` then this function effectively frees 24628f6f5e7SAlex Crichton // the memory. 24728f6f5e7SAlex Crichton // * If `T` is a zero-sized type then nothing's been allocated either. 24828f6f5e7SAlex Crichton // 24928f6f5e7SAlex Crichton // In all of these cases delegate to the standard library's 2500c673b70SNick Fitzgerald // `shrink_to_fit` which is guaranteed to not perform a `realloc`. 2510c673b70SNick Fitzgerald if self.is_empty() || mem::size_of::<T>() == 0 { 2520c673b70SNick Fitzgerald self.inner.shrink_to_fit(); 2530c673b70SNick Fitzgerald return Ok(()); 25428f6f5e7SAlex Crichton } 25528f6f5e7SAlex Crichton 2560c673b70SNick Fitzgerald let (ptr, len, cap) = mem::take(self).into_raw_parts(); 25728f6f5e7SAlex Crichton let layout = Layout::array::<T>(cap).unwrap(); 2580c673b70SNick Fitzgerald let new_size = Layout::array::<T>(len).unwrap().size(); 25928f6f5e7SAlex Crichton 26028f6f5e7SAlex Crichton // SAFETY: `ptr` was previously allocated in the global allocator, 26128f6f5e7SAlex Crichton // `layout` has a nonzero size and matches the current allocation of 26228f6f5e7SAlex Crichton // `ptr`, `new_size` is nonzero, and `new_size` is a valid array size 26328f6f5e7SAlex Crichton // for `len` elements given its constructor. 2640c673b70SNick Fitzgerald let result = unsafe { try_realloc(ptr.cast(), layout, new_size) }; 26528f6f5e7SAlex Crichton 26628f6f5e7SAlex Crichton match result { 26728f6f5e7SAlex Crichton Ok(ptr) => { 2680c673b70SNick Fitzgerald // SAFETY: `result` is allocated with the global allocator and 2690c673b70SNick Fitzgerald // has room for exactly `[T; len]`. 2700c673b70SNick Fitzgerald *self = unsafe { Self::from_raw_parts(ptr.cast::<T>().as_ptr(), len, len) }; 2710c673b70SNick Fitzgerald Ok(()) 27228f6f5e7SAlex Crichton } 27328f6f5e7SAlex Crichton Err(oom) => { 27428f6f5e7SAlex Crichton // SAFETY: If reallocation fails then it's guaranteed that the 27528f6f5e7SAlex Crichton // original allocation is not tampered with, so it's safe to 2760c673b70SNick Fitzgerald // reassemble the original vector. 2770c673b70SNick Fitzgerald *self = unsafe { Vec::from_raw_parts(ptr, len, cap) }; 27828f6f5e7SAlex Crichton Err(oom) 27928f6f5e7SAlex Crichton } 28028f6f5e7SAlex Crichton } 28128f6f5e7SAlex Crichton } 2820c673b70SNick Fitzgerald 2830c673b70SNick Fitzgerald /// Same as [`std::vec::Vec::into_boxed_slice`] but returns an error on 2840c673b70SNick Fitzgerald /// allocation failure. 2850c673b70SNick Fitzgerald pub fn into_boxed_slice(mut self) -> Result<Box<[T]>, OutOfMemory> { 2860c673b70SNick Fitzgerald self.shrink_to_fit()?; 2870c673b70SNick Fitzgerald 2880c673b70SNick Fitzgerald // Once we've shrunken the allocation to just the actual length, we can 2890c673b70SNick Fitzgerald // use `std`'s `into_boxed_slice` without fear of `realloc`. 2900c673b70SNick Fitzgerald Ok(self.inner.into_boxed_slice()) 2910c673b70SNick Fitzgerald } 292763ace02SNick Fitzgerald 293763ace02SNick Fitzgerald /// Same as [`std::vec::Vec::clear`]. 294763ace02SNick Fitzgerald pub fn clear(&mut self) { 295763ace02SNick Fitzgerald self.inner.clear(); 296763ace02SNick Fitzgerald } 297e0ee4552SNick Fitzgerald } 298e0ee4552SNick Fitzgerald 299e0ee4552SNick Fitzgerald impl<T> Deref for Vec<T> { 300e0ee4552SNick Fitzgerald type Target = [T]; 301e0ee4552SNick Fitzgerald 302e0ee4552SNick Fitzgerald fn deref(&self) -> &Self::Target { 303e0ee4552SNick Fitzgerald &self.inner 304e0ee4552SNick Fitzgerald } 305e0ee4552SNick Fitzgerald } 306e0ee4552SNick Fitzgerald 307e0ee4552SNick Fitzgerald impl<T> DerefMut for Vec<T> { 308e0ee4552SNick Fitzgerald fn deref_mut(&mut self) -> &mut Self::Target { 309e0ee4552SNick Fitzgerald &mut self.inner 310e0ee4552SNick Fitzgerald } 311e0ee4552SNick Fitzgerald } 312e0ee4552SNick Fitzgerald 313*cfd8a4d2SNick Fitzgerald impl<T> AsRef<[T]> for Vec<T> { 314*cfd8a4d2SNick Fitzgerald fn as_ref(&self) -> &[T] { 315*cfd8a4d2SNick Fitzgerald self 316*cfd8a4d2SNick Fitzgerald } 317*cfd8a4d2SNick Fitzgerald } 318*cfd8a4d2SNick Fitzgerald 319*cfd8a4d2SNick Fitzgerald impl<T> Borrow<[T]> for Vec<T> { 320*cfd8a4d2SNick Fitzgerald fn borrow(&self) -> &[T] { 321*cfd8a4d2SNick Fitzgerald self 322*cfd8a4d2SNick Fitzgerald } 323*cfd8a4d2SNick Fitzgerald } 324*cfd8a4d2SNick Fitzgerald 3255c2795e4SNick Fitzgerald impl<T, I> Index<I> for Vec<T> 3265c2795e4SNick Fitzgerald where 3275c2795e4SNick Fitzgerald I: SliceIndex<[T]>, 3285c2795e4SNick Fitzgerald { 3295c2795e4SNick Fitzgerald type Output = <I as SliceIndex<[T]>>::Output; 330e0ee4552SNick Fitzgerald 3315c2795e4SNick Fitzgerald fn index(&self, index: I) -> &Self::Output { 332e0ee4552SNick Fitzgerald &self.inner[index] 333e0ee4552SNick Fitzgerald } 334e0ee4552SNick Fitzgerald } 335e0ee4552SNick Fitzgerald 3365c2795e4SNick Fitzgerald impl<T, I> IndexMut<I> for Vec<T> 3375c2795e4SNick Fitzgerald where 3385c2795e4SNick Fitzgerald I: SliceIndex<[T]>, 3395c2795e4SNick Fitzgerald { 3405c2795e4SNick Fitzgerald fn index_mut(&mut self, index: I) -> &mut Self::Output { 341e0ee4552SNick Fitzgerald &mut self.inner[index] 342e0ee4552SNick Fitzgerald } 343e0ee4552SNick Fitzgerald } 344e0ee4552SNick Fitzgerald 3457b929e7fSNick Fitzgerald impl<T> IntoIterator for Vec<T> { 3467b929e7fSNick Fitzgerald type Item = T; 3477b929e7fSNick Fitzgerald type IntoIter = std_alloc::vec::IntoIter<T>; 3487b929e7fSNick Fitzgerald 3497b929e7fSNick Fitzgerald fn into_iter(self) -> Self::IntoIter { 3507b929e7fSNick Fitzgerald self.inner.into_iter() 3517b929e7fSNick Fitzgerald } 3527b929e7fSNick Fitzgerald } 3537b929e7fSNick Fitzgerald 354e0ee4552SNick Fitzgerald impl<'a, T> IntoIterator for &'a Vec<T> { 355e0ee4552SNick Fitzgerald type Item = &'a T; 356e0ee4552SNick Fitzgerald 357e0ee4552SNick Fitzgerald type IntoIter = core::slice::Iter<'a, T>; 358e0ee4552SNick Fitzgerald 359e0ee4552SNick Fitzgerald fn into_iter(self) -> Self::IntoIter { 360e0ee4552SNick Fitzgerald (**self).iter() 361e0ee4552SNick Fitzgerald } 362e0ee4552SNick Fitzgerald } 363e0ee4552SNick Fitzgerald 364e0ee4552SNick Fitzgerald impl<'a, T> IntoIterator for &'a mut Vec<T> { 365e0ee4552SNick Fitzgerald type Item = &'a mut T; 366e0ee4552SNick Fitzgerald 367e0ee4552SNick Fitzgerald type IntoIter = core::slice::IterMut<'a, T>; 368e0ee4552SNick Fitzgerald 369e0ee4552SNick Fitzgerald fn into_iter(self) -> Self::IntoIter { 370e0ee4552SNick Fitzgerald (**self).iter_mut() 371e0ee4552SNick Fitzgerald } 372e0ee4552SNick Fitzgerald } 37328f6f5e7SAlex Crichton 374efb98a9fSNick Fitzgerald impl<T> From<Vec<T>> for StdVec<T> { 375efb98a9fSNick Fitzgerald fn from(v: Vec<T>) -> Self { 376efb98a9fSNick Fitzgerald v.inner 377efb98a9fSNick Fitzgerald } 378efb98a9fSNick Fitzgerald } 379efb98a9fSNick Fitzgerald 380282546d4SNick Fitzgerald impl<T> From<StdVec<T>> for Vec<T> { 381282546d4SNick Fitzgerald fn from(inner: StdVec<T>) -> Self { 382282546d4SNick Fitzgerald Self { inner } 383282546d4SNick Fitzgerald } 384282546d4SNick Fitzgerald } 385282546d4SNick Fitzgerald 38628f6f5e7SAlex Crichton impl<T> From<Box<[T]>> for Vec<T> { 38728f6f5e7SAlex Crichton fn from(boxed_slice: Box<[T]>) -> Self { 38871c51d03SNick Fitzgerald Self::from(StdVec::from(boxed_slice)) 38928f6f5e7SAlex Crichton } 39028f6f5e7SAlex Crichton } 39171c51d03SNick Fitzgerald 39271c51d03SNick Fitzgerald impl<T> serde::ser::Serialize for Vec<T> 39371c51d03SNick Fitzgerald where 39471c51d03SNick Fitzgerald T: serde::ser::Serialize, 39571c51d03SNick Fitzgerald { 39671c51d03SNick Fitzgerald fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 39771c51d03SNick Fitzgerald where 39871c51d03SNick Fitzgerald S: serde::Serializer, 39971c51d03SNick Fitzgerald { 40071c51d03SNick Fitzgerald let mut seq = serializer.serialize_seq(Some(self.len()))?; 40171c51d03SNick Fitzgerald for elem in self { 40271c51d03SNick Fitzgerald seq.serialize_element(elem)?; 40371c51d03SNick Fitzgerald } 40471c51d03SNick Fitzgerald seq.end() 40571c51d03SNick Fitzgerald } 40671c51d03SNick Fitzgerald } 40771c51d03SNick Fitzgerald 40871c51d03SNick Fitzgerald impl<'de, T> serde::de::Deserialize<'de> for Vec<T> 40971c51d03SNick Fitzgerald where 41071c51d03SNick Fitzgerald T: serde::de::Deserialize<'de>, 41171c51d03SNick Fitzgerald { 41271c51d03SNick Fitzgerald fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 41371c51d03SNick Fitzgerald where 41471c51d03SNick Fitzgerald D: serde::Deserializer<'de>, 41571c51d03SNick Fitzgerald { 41671c51d03SNick Fitzgerald struct Visitor<T>(PhantomData<fn() -> Vec<T>>); 41771c51d03SNick Fitzgerald 41871c51d03SNick Fitzgerald impl<'de, T> serde::de::Visitor<'de> for Visitor<T> 41971c51d03SNick Fitzgerald where 42071c51d03SNick Fitzgerald T: serde::de::Deserialize<'de>, 42171c51d03SNick Fitzgerald { 42271c51d03SNick Fitzgerald type Value = Vec<T>; 42371c51d03SNick Fitzgerald 42471c51d03SNick Fitzgerald fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { 42571c51d03SNick Fitzgerald f.write_str("a `wasmtime_core::alloc::Vec` sequence") 42671c51d03SNick Fitzgerald } 42771c51d03SNick Fitzgerald 42871c51d03SNick Fitzgerald fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> 42971c51d03SNick Fitzgerald where 43071c51d03SNick Fitzgerald A: serde::de::SeqAccess<'de>, 43171c51d03SNick Fitzgerald { 43271c51d03SNick Fitzgerald use serde::de::Error as _; 43371c51d03SNick Fitzgerald 43471c51d03SNick Fitzgerald let mut v = Vec::new(); 43571c51d03SNick Fitzgerald 43671c51d03SNick Fitzgerald if let Some(len) = seq.size_hint() { 43771c51d03SNick Fitzgerald v.reserve_exact(len).map_err(|oom| A::Error::custom(oom))?; 43871c51d03SNick Fitzgerald } 43971c51d03SNick Fitzgerald 44071c51d03SNick Fitzgerald while let Some(elem) = seq.next_element()? { 44171c51d03SNick Fitzgerald v.push(elem).map_err(|oom| A::Error::custom(oom))?; 44271c51d03SNick Fitzgerald } 44371c51d03SNick Fitzgerald 44471c51d03SNick Fitzgerald Ok(v) 44571c51d03SNick Fitzgerald } 44671c51d03SNick Fitzgerald } 44771c51d03SNick Fitzgerald 44871c51d03SNick Fitzgerald deserializer.deserialize_seq(Visitor(PhantomData)) 44971c51d03SNick Fitzgerald } 45028f6f5e7SAlex Crichton } 45128f6f5e7SAlex Crichton 45228f6f5e7SAlex Crichton #[cfg(test)] 45328f6f5e7SAlex Crichton mod tests { 45428f6f5e7SAlex Crichton use super::Vec; 45528f6f5e7SAlex Crichton use crate::error::OutOfMemory; 45628f6f5e7SAlex Crichton 45728f6f5e7SAlex Crichton #[test] 45828f6f5e7SAlex Crichton fn test_into_boxed_slice() -> Result<(), OutOfMemory> { 45928f6f5e7SAlex Crichton assert_eq!(*Vec::<i32>::new().into_boxed_slice()?, []); 46028f6f5e7SAlex Crichton 46128f6f5e7SAlex Crichton let mut vec = Vec::new(); 46228f6f5e7SAlex Crichton vec.push(1)?; 46328f6f5e7SAlex Crichton assert_eq!(*vec.into_boxed_slice()?, [1]); 46428f6f5e7SAlex Crichton 46528f6f5e7SAlex Crichton let mut vec = Vec::with_capacity(2)?; 46628f6f5e7SAlex Crichton vec.push(1)?; 46728f6f5e7SAlex Crichton assert_eq!(*vec.into_boxed_slice()?, [1]); 46828f6f5e7SAlex Crichton 46928f6f5e7SAlex Crichton let mut vec = Vec::with_capacity(2)?; 47028f6f5e7SAlex Crichton vec.push(1_u128)?; 47128f6f5e7SAlex Crichton assert_eq!(*vec.into_boxed_slice()?, [1]); 47228f6f5e7SAlex Crichton 47328f6f5e7SAlex Crichton assert_eq!(*Vec::<()>::new().into_boxed_slice()?, []); 47428f6f5e7SAlex Crichton 47528f6f5e7SAlex Crichton let mut vec = Vec::new(); 47628f6f5e7SAlex Crichton vec.push(())?; 47728f6f5e7SAlex Crichton assert_eq!(*vec.into_boxed_slice()?, [()]); 47828f6f5e7SAlex Crichton 47928f6f5e7SAlex Crichton let vec = Vec::<i32>::with_capacity(2)?; 48028f6f5e7SAlex Crichton assert_eq!(*vec.into_boxed_slice()?, []); 48128f6f5e7SAlex Crichton Ok(()) 48228f6f5e7SAlex Crichton } 48328f6f5e7SAlex Crichton } 484