draco_oxide_core/codec/attribute/
mod.rs1use 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}