diff options
author | metamuffin <metamuffin@disroot.org> | 2022-12-07 17:55:27 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-12-07 17:55:27 +0100 |
commit | 8ca219c6b0d5448fd4529713ccd093e89de4e252 (patch) | |
tree | 8fe02fd35ae337766d6f8e7533da170830162d14 /evc/src/ser.rs | |
parent | a99674b911cb9b2fa398ccf61830d5933ccaf931 (diff) | |
download | video-codec-experiments-8ca219c6b0d5448fd4529713ccd093e89de4e252.tar video-codec-experiments-8ca219c6b0d5448fd4529713ccd093e89de4e252.tar.bz2 video-codec-experiments-8ca219c6b0d5448fd4529713ccd093e89de4e252.tar.zst |
refactor
Diffstat (limited to 'evc/src/ser.rs')
-rw-r--r-- | evc/src/ser.rs | 235 |
1 files changed, 0 insertions, 235 deletions
diff --git a/evc/src/ser.rs b/evc/src/ser.rs deleted file mode 100644 index d05e42e..0000000 --- a/evc/src/ser.rs +++ /dev/null @@ -1,235 +0,0 @@ -use anyhow::Context; -use std::io::{Read, Write}; - -pub trait Sink { - fn put<V: Ser>(&mut self, value: V) -> anyhow::Result<()>; -} -pub trait Source { - fn get<V: Ser>(&mut self) -> anyhow::Result<V>; -} - -impl<T: Write> Sink for T { - fn put<V: Ser>(&mut self, value: V) -> anyhow::Result<()> { - value.write(self) - } -} -impl<T: Read> Source for T { - fn get<V: Ser>(&mut self) -> anyhow::Result<V> { - V::read(self) - } -} - -pub trait Ser: Sized { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()>; - fn read(source: &mut impl Read) -> anyhow::Result<Self>; -} - -impl<A: Ser, B: Ser> Ser for (A, B) { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - self.0.write(sink).context("first tuple field")?; - self.1.write(sink).context("second tuple field")?; - Ok(()) - } - - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - Ok((A::read(source)?, B::read(source)?)) - } -} -impl<A: Ser, B: Ser, C: Ser> Ser for (A, B, C) { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - self.0.write(sink).context("first tuple field")?; - self.1.write(sink).context("second tuple field")?; - self.2.write(sink).context("third tuple field")?; - Ok(()) - } - - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - Ok((A::read(source)?, B::read(source)?, C::read(source)?)) - } -} - -impl<A: Ser, const N: usize> Ser for [A; N] { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - for e in self { - e.write(sink).context("some array")?; - } - Ok(()) - } - - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut k: [A; N] = unsafe { std::mem::zeroed() }; - for i in 0..N { - k[i] = A::read(source)?; - } - Ok(k) - } -} - -impl<T: Ser> Ser for Vec<T> { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - self.len().write(sink)?; - for e in self { - e.write(sink).context("some vec")?; - } - Ok(()) - } - - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut v = vec![]; - for _ in 0..usize::read(source)? { - v.push(T::read(source)?) - } - Ok(v) - } -} - -impl Ser for u8 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink.write_all(&[*self]).context("write u8")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 1]; - source.read_exact(&mut buf)?; - Ok(buf[0]) - } -} -impl Ser for i8 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 1]>(self) }) - .context("write i8")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 1]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for u16 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 2]>(self) }) - .context("write 16")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 2]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for u32 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 4]>(self) }) - .context("write u32")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 4]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for u64 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 8]>(self) }) - .context("write u64")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 8]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for usize { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 8]>(self) }) - .context("write usize")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 8]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for isize { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 8]>(self) }) - .context("write isize")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 8]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for f32 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 4]>(self) }) - .context("write f32")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 4]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} -impl Ser for f64 { - fn write(&self, sink: &mut impl Write) -> anyhow::Result<()> { - Ok(sink - .write_all(&unsafe { std::mem::transmute_copy::<_, [u8; 8]>(self) }) - .context("write f64")?) - } - fn read(source: &mut impl Read) -> anyhow::Result<Self> { - let mut buf = [0u8; 8]; - source.read_exact(&mut buf)?; - Ok(unsafe { std::mem::transmute_copy(&buf) }) - } -} - -#[cfg(test)] -mod test { - use super::{Ser, Sink}; - use crate::header::Header; - use crate::helpers::vector::Vec2; - use crate::ser::Source; - use std::fmt::Debug; - use std::io::Cursor; - - fn test_ser<T: PartialEq + Ser + Debug + Clone>(value: T) { - let mut buf = vec![]; - Cursor::new(&mut buf).put(value.clone()).unwrap(); - assert_eq!(value, Cursor::new(&mut buf).get().unwrap()); - } - - #[test] - fn simple() { - let mut buf = vec![]; - Cursor::new(&mut buf).put(10usize).unwrap(); - assert_eq!(10usize, Cursor::new(&mut buf).get().unwrap()); - } - #[test] - fn tuple() { - let mut buf = vec![]; - Cursor::new(&mut buf).put((10usize, 5u8, 3u16)).unwrap(); - assert_eq!((10usize, 5u8, 3u16), Cursor::new(&mut buf).get().unwrap()); - } - #[test] - fn header() { - test_ser(Header { - frame_count: 123, - resolution: Vec2 { x: 13, y: 37 }, - }); - } - #[test] - fn vec() { - test_ser(vec![1u16, 2, 3, 4]); - } - #[test] - fn array() { - test_ser([1u16, 2, 3, 4]); - } -} |