Skip to main content

draco_oxide_core/codec/attribute/
mod.rs

1use crate::bit_coder::ReaderErr;
2use crate::bit_coder::{ByteReader, ByteWriter};
3
4pub mod geom;
5pub mod portabilization;
6pub mod prediction_scheme;
7pub mod sequence;
8
9#[derive(thiserror::Error, Debug)]
10#[allow(unused)]
11pub enum Err {
12    #[error("Reader Error: {0}")]
13    ReaderError(#[from] ReaderErr),
14}
15
16pub trait Portable: Sized {
17    fn to_bytes(self) -> Vec<u8>;
18    fn write_to<W>(self, writer: &mut W)
19    where
20        W: ByteWriter;
21    fn read_from<R>(reader: &mut R) -> Result<Self, ReaderErr>
22    where
23        R: ByteReader;
24}
25
26impl Portable for bool {
27    fn to_bytes(self) -> Vec<u8> {
28        vec![self as u8]
29    }
30    fn write_to<W>(self, writer: &mut W)
31    where
32        W: ByteWriter,
33    {
34        writer.write_u8(self as u8);
35    }
36    fn read_from<R>(reader: &mut R) -> Result<Self, ReaderErr>
37    where
38        R: ByteReader,
39    {
40        Ok(reader.read_u8()? != 0)
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::Portable;
47    use crate::types::NdVector;
48
49    #[test]
50    fn from_bits_f32() {
51        let data = NdVector::from([1_f32, -1.0, 1.0]);
52        let mut buff_writer = Vec::new();
53        data.write_to(&mut buff_writer);
54        let mut buff_reader = buff_writer.into_iter();
55        let dequant_data: NdVector<3, f32> = NdVector::read_from(&mut buff_reader).unwrap();
56        assert_eq!(data, dequant_data);
57    }
58
59    #[test]
60    fn from_bits_f64() {
61        let data = NdVector::from([1_f64, -1.0, 1.0]);
62        let mut buff_writer = Vec::new();
63        data.write_to(&mut buff_writer);
64        let mut buff_reader = buff_writer.into_iter();
65        let dequant_data: NdVector<3, f64> = NdVector::read_from(&mut buff_reader).unwrap();
66        assert_eq!(data, dequant_data);
67    }
68}