use super::{traits::Storable, Endianness, VarVec};
use crate::fixed::{FixedVec, LEFixedVec};
use dsi_bitstream::prelude::{Codes, LE};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
impl<T: Storable, E: Endianness, B: AsRef<[u64]> + Serialize> Serialize for VarVec<T, E, B> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
#[derive(Serialize)]
struct SerializeProxy<'a, BSamples: AsRef<[u64]> + Serialize> {
data: &'a [u64],
samples: &'a FixedVec<u64, u64, LE, BSamples>,
k: usize,
len: usize,
encoding: Codes,
}
let proxy = SerializeProxy {
data: self.data.as_ref(),
samples: &self.samples,
k: self.k,
len: self.len,
encoding: self.encoding,
};
proxy.serialize(serializer)
}
}
#[derive(Deserialize)]
#[serde(rename = "VarVec")]
struct VarVecProxy {
data: Vec<u64>,
samples: LEFixedVec,
k: usize,
len: usize,
encoding: Codes,
}
impl<'de, T: Storable, E: Endianness> Deserialize<'de> for VarVec<T, E, Vec<u64>> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let helper = VarVecProxy::deserialize(deserializer)?;
Ok(unsafe {
VarVec::new_unchecked(
helper.data,
helper.samples,
helper.k,
helper.len,
helper.encoding,
)
})
}
}