use crate::ser::{Ser, Sink, Source}; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Vec2 { pub x: isize, pub y: isize, } impl Vec2 { pub const ZERO: Vec2 = Vec2 { x: 0, y: 0 }; pub const UP: Vec2 = Vec2 { x: 0, y: -1 }; pub const LEFT: Vec2 = Vec2 { x: -1, y: 0 }; pub fn downscale(&self, f: isize) -> Self { Self { x: self.x / f, y: self.y / f, } } } impl Ser for Vec2 { fn write(&self, sink: &mut impl std::io::Write) -> anyhow::Result<()> { sink.put((self.x, self.y)) } fn read(source: &mut impl std::io::Read) -> anyhow::Result { let (x, y) = source.get()?; Ok(Vec2 { x, y }) } } pub struct Small(pub T); impl Ser for Small { fn write(&self, sink: &mut impl std::io::Write) -> anyhow::Result<()> { sink.put((self.0.x as i8, self.0.y as i8)) } fn read(source: &mut impl std::io::Read) -> anyhow::Result { let (x, y): (i8, i8) = source.get()?; Ok(Small(Vec2 { x: x as isize, y: y as isize, })) } } impl std::ops::Add for Vec2 { type Output = Vec2; #[inline] fn add(self, rhs: Self) -> Self::Output { Vec2 { x: self.x + rhs.x, y: self.y + rhs.y, } } } impl std::ops::Sub for Vec2 { type Output = Vec2; #[inline] fn sub(self, rhs: Self) -> Self::Output { Vec2 { x: self.x - rhs.x, y: self.y - rhs.y, } } } impl std::ops::Mul for Vec2 { type Output = Vec2; #[inline] fn mul(self, rhs: Self) -> Self::Output { Vec2 { x: self.x * rhs.x, y: self.y * rhs.y, } } } impl From<(isize, isize)> for Vec2 { #[inline] fn from((x, y): (isize, isize)) -> Self { Vec2 { x, y } } }