diff --git a/proc_macros/src/lib.rs b/proc_macros/src/lib.rs index 6e86f54..6adb24c 100644 --- a/proc_macros/src/lib.rs +++ b/proc_macros/src/lib.rs @@ -26,43 +26,67 @@ fn impl_pixel(name: syn::Ident, fields: Vec) -> TokenStream { } } - impl std::ops::MulAssign for #name { - fn mul_assign(&mut self, scalar: f32) { - #( self.#fields *= scalar; )* - } - } + impl std::ops::SubAssign for #name { + fn sub_assign(&mut self, other: Self) { + #( self.#fields -= other.#fields; )* + } + } - impl std::ops::DivAssign for #name { - fn div_assign(&mut self, scalar: f32) { - #( self.#fields /= scalar; )* - } - } + impl std::ops::MulAssign for #name { + fn mul_assign(&mut self, scalar: f32) { + #( self.#fields *= scalar; )* + } + } - impl std::ops::Mul for #name { - type Output = Self; + impl std::ops::DivAssign for #name { + fn div_assign(&mut self, scalar: f32) { + #( self.#fields /= scalar; )* + } + } - fn mul(mut self, scalar: f32) -> Self { - self *= scalar; - self - } - } + impl std::ops::Add for #name { + type Output = Self; - impl std::ops::Div for #name { - type Output = Self; + fn add(mut self, other: Self) -> Self { + self += other; + self + } + } - fn div(mut self, scalar: f32) -> Self { - self /= scalar; - self - } - } + impl std::ops::Sub for #name { + type Output = Self; - impl std::default::Default for #name { - fn default() -> Self { - Self { - #( #fields: Default::default(), )* - } - } - } + fn sub(mut self, other: Self) -> Self { + self -= other; + self + } + } + + impl std::ops::Mul for #name { + type Output = Self; + + fn mul(mut self, scalar: f32) -> Self { + self *= scalar; + self + } + } + + impl std::ops::Div for #name { + type Output = Self; + + fn div(mut self, scalar: f32) -> Self { + self /= scalar; + self + } + } + + impl std::default::Default for #name { + fn default() -> Self { + Self { + #( #fields: Default::default(), )* + } + } + } } .into() } diff --git a/src/image.rs b/src/image.rs index f917171..95db9ca 100644 --- a/src/image.rs +++ b/src/image.rs @@ -36,8 +36,11 @@ pub trait Format

{ pub trait Pixel: std::ops::AddAssign + + std::ops::SubAssign + std::ops::MulAssign + std::ops::DivAssign + + std::ops::Add + + std::ops::Sub + std::ops::Mul + std::ops::Div + Clone @@ -51,8 +54,11 @@ pub trait Pixel: impl

Pixel for P where P: std::ops::AddAssign + + std::ops::SubAssign + std::ops::MulAssign + std::ops::DivAssign + + std::ops::Add + + std::ops::Sub + std::ops::Mul + std::ops::Div + Clone