use core::{ num::TryFromIntError, ops::{Add, AddAssign, Div, Sub, SubAssign}, }; #[derive(Clone, Copy)] pub struct Vec2 { pub x: T, pub y: T, } #[macro_export] macro_rules! vec2 { ($x:expr, $y:expr $(,)?) => { $crate::canvas::Vec2 { x: $x, y: $y } }; } impl Default for Vec2 { fn default() -> Self { Self { x: Default::default(), y: Default::default(), } } } impl TryFrom> for Vec2 { type Error = TryFromIntError; fn try_from(Vec2 { x, y }: Vec2) -> Result { let x = usize::try_from(x)?; let y = usize::try_from(y)?; Ok(Vec2 { x, y }) } } impl From> for Vec2 { fn from(Vec2 { x, y }: Vec2) -> Self { Self { x: x as isize, y: y as isize, } } } impl From> for Vec2 { fn from(Vec2 { x, y }: Vec2) -> Self { Self { x: x as isize, y: y as isize, } } } impl AddAssign for Vec2 { fn add_assign(&mut self, rhs: Self) { self.x += rhs.x; self.y += rhs.y; } } impl Add for Vec2 { type Output = Vec2; fn add(mut self, rhs: Self) -> Self::Output { self += rhs; self } } impl SubAssign for Vec2 { fn sub_assign(&mut self, rhs: Self) { self.x -= rhs.x; self.y -= rhs.y; } } impl Sub for Vec2 { type Output = Vec2; fn sub(mut self, rhs: Self) -> Self::Output { self -= rhs; self } } impl + Clone> Div for Vec2 { type Output = Self; fn div(self, rhs: T) -> Self::Output { Self { x: self.x / rhs.clone(), y: self.y / rhs, } } }