From b04d0578c59299598c298f3ca83af3278b13f08c Mon Sep 17 00:00:00 2001 From: hachem Date: Sat, 12 Oct 2024 17:31:16 +0200 Subject: Refactor 2: Complex --- libpsi-core/src/maths/complex.rs | 94 ++++++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 18 deletions(-) (limited to 'libpsi-core/src/maths/complex.rs') diff --git a/libpsi-core/src/maths/complex.rs b/libpsi-core/src/maths/complex.rs index bb19510..86e4788 100644 --- a/libpsi-core/src/maths/complex.rs +++ b/libpsi-core/src/maths/complex.rs @@ -1,7 +1,5 @@ use crate::Float; -use core::fmt; - -use super::Numeric; +use core::{fmt, ops}; #[macro_export] macro_rules! complex { @@ -10,6 +8,51 @@ macro_rules! complex { }; } +macro_rules! impl_ops { + ($trait:ident, $method:ident, $op:tt) => { + impl ops::$trait for Complex { + type Output = Complex; + + fn $method(self, other: Complex) -> Complex { + Complex { + real: self.real $op other.real, + imaginary: self.imaginary $op other.imaginary, + } + } + } + }; + + ($trait:ident, $method:ident, $op:tt, real) => { + impl ops::$trait for Complex { + type Output = Complex; + + fn $method(self, other: T) -> Complex { + Complex { + real: self.real $op other, + imaginary: self.imaginary, + } + } + } + }; + + ($trait_assign:ident, $method_assign:ident, $op:tt, assign) => { + impl ops::$trait_assign for Complex { + fn $method_assign(&mut self, other: Complex) { + self.real = self.real $op other.real; + self.imaginary = self.imaginary $op other.imaginary; + } + } + }; + + ($trait_assign:ident, $method_assign:ident, $op:tt, assign_real) => { + impl ops::$trait_assign for Complex { + fn $method_assign(&mut self, other: T) { + self.real = self.real $op other; + } + } + }; +} + #[derive(Copy, Clone, PartialOrd, PartialEq)] pub struct Complex { pub real: T, @@ -32,23 +75,23 @@ impl fmt::Display for Complex { } } -impl Numeric for Complex { - fn zero() -> Self { - Complex::new(0.0, 0.0) - } +impl ops::Neg for Complex { + type Output = Complex; - fn one() -> Self { - Complex::new(1.0, 0.0) + fn neg(self) -> Complex { + Complex { + real: -self.real, + imaginary: -self.imaginary, + } } } -impl Numeric for Complex { - fn zero() -> Self { - Complex::new(0.0, 0.0) - } - - fn one() -> Self { - Complex::new(1.0, 0.0) +impl From for Complex { + fn from(real: T) -> Complex { + Complex { + real, + imaginary: T::zero(), + } } } @@ -72,11 +115,26 @@ impl Complex { T::atan2(self.imaginary, self.real) } - pub fn norm(&self) -> T { + pub fn norm2(&self) -> T { self.real * self.real + self.imaginary * self.imaginary } pub fn abs(&self) -> T { - T::sqrt(self.norm()) + T::sqrt(self.norm2()) } } + +impl_ops!(Add, add, +); +impl_ops!(Sub, sub, -); +impl_ops!(Mul, mul, *); +impl_ops!(Div, div, /); + +impl_ops!(AddAssign, add_assign, +, assign); +impl_ops!(SubAssign, sub_assign, -, assign); +impl_ops!(MulAssign, mul_assign, *, assign); +impl_ops!(DivAssign, div_assign, /, assign); + +impl_ops!(Add, add, +, real); +impl_ops!(Sub, sub, -, real); +impl_ops!(Mul, mul, *, real); +impl_ops!(Div, div, /, real); -- cgit v1.3