|
1 | 1 | use crate::alloc::{TryClone, try_realloc}; |
2 | 2 | use crate::error::OutOfMemory; |
| 3 | +use core::marker::PhantomData; |
3 | 4 | use core::{ |
4 | 5 | fmt, mem, |
5 | 6 | ops::{Deref, DerefMut, Index, IndexMut}, |
6 | 7 | }; |
| 8 | +use serde::ser::SerializeSeq; |
7 | 9 | use std_alloc::alloc::Layout; |
8 | 10 | use std_alloc::boxed::Box; |
9 | 11 | use std_alloc::vec::Vec as StdVec; |
@@ -262,11 +264,75 @@ impl<'a, T> IntoIterator for &'a mut Vec<T> { |
262 | 264 | } |
263 | 265 | } |
264 | 266 |
|
| 267 | +impl<T> From<StdVec<T>> for Vec<T> { |
| 268 | + fn from(inner: StdVec<T>) -> Self { |
| 269 | + Self { inner } |
| 270 | + } |
| 271 | +} |
| 272 | + |
265 | 273 | impl<T> From<Box<[T]>> for Vec<T> { |
266 | 274 | fn from(boxed_slice: Box<[T]>) -> Self { |
267 | | - Vec { |
268 | | - inner: StdVec::from(boxed_slice), |
| 275 | + Self::from(StdVec::from(boxed_slice)) |
| 276 | + } |
| 277 | +} |
| 278 | + |
| 279 | +impl<T> serde::ser::Serialize for Vec<T> |
| 280 | +where |
| 281 | + T: serde::ser::Serialize, |
| 282 | +{ |
| 283 | + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| 284 | + where |
| 285 | + S: serde::Serializer, |
| 286 | + { |
| 287 | + let mut seq = serializer.serialize_seq(Some(self.len()))?; |
| 288 | + for elem in self { |
| 289 | + seq.serialize_element(elem)?; |
| 290 | + } |
| 291 | + seq.end() |
| 292 | + } |
| 293 | +} |
| 294 | + |
| 295 | +impl<'de, T> serde::de::Deserialize<'de> for Vec<T> |
| 296 | +where |
| 297 | + T: serde::de::Deserialize<'de>, |
| 298 | +{ |
| 299 | + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| 300 | + where |
| 301 | + D: serde::Deserializer<'de>, |
| 302 | + { |
| 303 | + struct Visitor<T>(PhantomData<fn() -> Vec<T>>); |
| 304 | + |
| 305 | + impl<'de, T> serde::de::Visitor<'de> for Visitor<T> |
| 306 | + where |
| 307 | + T: serde::de::Deserialize<'de>, |
| 308 | + { |
| 309 | + type Value = Vec<T>; |
| 310 | + |
| 311 | + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| 312 | + f.write_str("a `wasmtime_core::alloc::Vec` sequence") |
| 313 | + } |
| 314 | + |
| 315 | + fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> |
| 316 | + where |
| 317 | + A: serde::de::SeqAccess<'de>, |
| 318 | + { |
| 319 | + use serde::de::Error as _; |
| 320 | + |
| 321 | + let mut v = Vec::new(); |
| 322 | + |
| 323 | + if let Some(len) = seq.size_hint() { |
| 324 | + v.reserve_exact(len).map_err(|oom| A::Error::custom(oom))?; |
| 325 | + } |
| 326 | + |
| 327 | + while let Some(elem) = seq.next_element()? { |
| 328 | + v.push(elem).map_err(|oom| A::Error::custom(oom))?; |
| 329 | + } |
| 330 | + |
| 331 | + Ok(v) |
| 332 | + } |
269 | 333 | } |
| 334 | + |
| 335 | + deserializer.deserialize_seq(Visitor(PhantomData)) |
270 | 336 | } |
271 | 337 | } |
272 | 338 |
|
|
0 commit comments