Implement useful methods on PrefixedVec

This commit is contained in:
Ali Behjati 2023-06-02 15:20:56 +02:00 committed by Reisen
parent c707e42fb8
commit c19f519839
2 changed files with 28 additions and 7 deletions

View File

@ -47,7 +47,7 @@ where
type Value = [T; N];
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(formatter, "an array of length {}", N)
write!(formatter, "an array of length {N}")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>

View File

@ -11,7 +11,7 @@ use serde::{
/// PrefixlessVec overrides the serialization to _not_ write a length prefix.
#[derive(Clone, Debug, Hash, PartialEq, PartialOrd)]
struct PrefixlessVec<T> {
data: Vec<T>,
inner: Vec<T>,
}
impl<T> Serialize for PrefixlessVec<T>
@ -21,7 +21,7 @@ where
#[inline]
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut seq = serializer.serialize_seq(None)?;
for item in &self.data {
for item in &self.inner {
seq.serialize_element(item)?;
}
seq.end()
@ -75,7 +75,7 @@ where
);
}
Ok(PrefixlessVec { data })
Ok(PrefixlessVec { inner: data })
}
}
@ -105,15 +105,36 @@ pub struct PrefixedVec<L, T> {
data: PrefixlessVec<T>,
}
impl<T, L> From<Vec<T>> for PrefixedVec<L, T> {
impl<L, T> From<Vec<T>> for PrefixedVec<L, T> {
fn from(data: Vec<T>) -> Self {
Self {
__phantom: std::marker::PhantomData,
data: PrefixlessVec { data },
data: PrefixlessVec { inner: data },
}
}
}
impl<L, T> From<PrefixedVec<L, T>> for Vec<T> {
fn from(data: PrefixedVec<L, T>) -> Self {
data.data.inner
}
}
impl<L, T> IntoIterator for PrefixedVec<L, T> {
type Item = T;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.data.inner.into_iter()
}
}
impl<L, T> PrefixedVec<L, T> {
pub fn iter(&self) -> std::slice::Iter<T> {
self.data.inner.iter()
}
}
impl<L, T> Serialize for PrefixedVec<L, T>
where
T: Serialize,
@ -123,7 +144,7 @@ where
{
#[inline]
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let len: L = L::try_from(self.data.data.len()).unwrap();
let len: L = L::try_from(self.data.inner.len()).unwrap();
let mut st = serializer.serialize_struct("SizedVec", 1)?;
st.serialize_field("len", &len)?;
st.serialize_field("data", &self.data)?;