aboutsummaryrefslogtreecommitdiff
path: root/evc/src/ser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'evc/src/ser.rs')
-rw-r--r--evc/src/ser.rs235
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]);
- }
-}