xref: /wasmtime-44.0.1/crates/core/src/alloc/vec.rs (revision cfd8a4d2)
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