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]; type Value = [T; N];
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { 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> 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. /// PrefixlessVec overrides the serialization to _not_ write a length prefix.
#[derive(Clone, Debug, Hash, PartialEq, PartialOrd)] #[derive(Clone, Debug, Hash, PartialEq, PartialOrd)]
struct PrefixlessVec<T> { struct PrefixlessVec<T> {
data: Vec<T>, inner: Vec<T>,
} }
impl<T> Serialize for PrefixlessVec<T> impl<T> Serialize for PrefixlessVec<T>
@ -21,7 +21,7 @@ where
#[inline] #[inline]
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut seq = serializer.serialize_seq(None)?; let mut seq = serializer.serialize_seq(None)?;
for item in &self.data { for item in &self.inner {
seq.serialize_element(item)?; seq.serialize_element(item)?;
} }
seq.end() 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>, 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 { fn from(data: Vec<T>) -> Self {
Self { Self {
__phantom: std::marker::PhantomData, __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> impl<L, T> Serialize for PrefixedVec<L, T>
where where
T: Serialize, T: Serialize,
@ -123,7 +144,7 @@ where
{ {
#[inline] #[inline]
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { 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)?; let mut st = serializer.serialize_struct("SizedVec", 1)?;
st.serialize_field("len", &len)?; st.serialize_field("len", &len)?;
st.serialize_field("data", &self.data)?; st.serialize_field("data", &self.data)?;