diff options
| author | Nika Layzell <nika@thelayzells.com> | 2021-07-01 12:56:07 -0400 |
|---|---|---|
| committer | Nika Layzell <nika@thelayzells.com> | 2022-06-14 22:12:46 -0400 |
| commit | 1793ee06589193a33f7f3d6670928dcb5a0f4742 (patch) | |
| tree | 4b9e5b14d947c9c0c95c67a3500bcbce011c35b6 | |
| parent | 7678e6ad8560cb559e1ca0b37e362890c25fe92b (diff) | |
| download | rust-1793ee06589193a33f7f3d6670928dcb5a0f4742.tar.gz rust-1793ee06589193a33f7f3d6670928dcb5a0f4742.zip | |
proc_macro: support encoding/decoding Vec<T>
| -rw-r--r-- | library/proc_macro/src/bridge/mod.rs | 15 | ||||
| -rw-r--r-- | library/proc_macro/src/bridge/rpc.rs | 20 |
2 files changed, 35 insertions, 0 deletions
diff --git a/library/proc_macro/src/bridge/mod.rs b/library/proc_macro/src/bridge/mod.rs index 4d3e89ba093..aca43945491 100644 --- a/library/proc_macro/src/bridge/mod.rs +++ b/library/proc_macro/src/bridge/mod.rs @@ -337,6 +337,21 @@ impl<T: Unmark, E: Unmark> Unmark for Result<T, E> { } } +impl<T: Mark> Mark for Vec<T> { + type Unmarked = Vec<T::Unmarked>; + fn mark(unmarked: Self::Unmarked) -> Self { + // Should be a no-op due to std's in-place collect optimizations. + unmarked.into_iter().map(T::mark).collect() + } +} +impl<T: Unmark> Unmark for Vec<T> { + type Unmarked = Vec<T::Unmarked>; + fn unmark(self) -> Self::Unmarked { + // Should be a no-op due to std's in-place collect optimizations. + self.into_iter().map(T::unmark).collect() + } +} + macro_rules! mark_noop { ($($ty:ty),* $(,)?) => { $( diff --git a/library/proc_macro/src/bridge/rpc.rs b/library/proc_macro/src/bridge/rpc.rs index e19fcf68c5c..a94334e0736 100644 --- a/library/proc_macro/src/bridge/rpc.rs +++ b/library/proc_macro/src/bridge/rpc.rs @@ -248,6 +248,26 @@ impl<S> DecodeMut<'_, '_, S> for String { } } +impl<S, T: Encode<S>> Encode<S> for Vec<T> { + fn encode(self, w: &mut Writer, s: &mut S) { + self.len().encode(w, s); + for x in self { + x.encode(w, s); + } + } +} + +impl<'a, S, T: for<'s> DecodeMut<'a, 's, S>> DecodeMut<'a, '_, S> for Vec<T> { + fn decode(r: &mut Reader<'a>, s: &mut S) -> Self { + let len = usize::decode(r, s); + let mut vec = Vec::with_capacity(len); + for _ in 0..len { + vec.push(T::decode(r, s)); + } + vec + } +} + /// Simplified version of panic payloads, ignoring /// types other than `&'static str` and `String`. pub enum PanicMessage { |
