vec2
Diffstat (limited to 'src/ops.rs')
-rw-r--r--src/ops.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/ops.rs b/src/ops.rs
new file mode 100644
index 0000000..c5cb338
--- /dev/null
+++ b/src/ops.rs
@@ -0,0 +1,90 @@
+use crate::Vector2;
+use core::ops::{
+ Add as add, AddAssign as add_assign, Div as div, DivAssign as div_assign, Mul as mul,
+ MulAssign as mul_assign, Neg, Rem as rem, RemAssign as rem_assign, Sub as sub,
+ SubAssign as sub_assign,
+};
+
+macro_rules! op {
+ ($name:ident) => {
+ impl<T: $name<T, Output = T>> $name<Vector2<T>> for Vector2<T> {
+ type Output = Vector2<T>;
+
+ fn $name(self, rhs: Vector2<T>) -> Self::Output {
+ Self::new(self.x.$name(rhs.x), self.y.$name(rhs.y))
+ }
+ }
+
+ impl<T: Copy + $name<T, Output = T>> $name<&Vector2<T>> for Vector2<T> {
+ type Output = Vector2<T>;
+
+ fn $name(self, rhs: &Vector2<T>) -> Self::Output {
+ Self::new(self.x.$name(rhs.x), self.y.$name(rhs.y))
+ }
+ }
+
+ impl<T: Copy + $name<T, Output = T>> $name<T> for Vector2<T> {
+ type Output = Vector2<T>;
+ fn $name(self, rhs: T) -> Self::Output {
+ Self::new(self.x.$name(rhs), self.y.$name(rhs))
+ }
+ }
+
+ impl<T: Copy + $name<T, Output = T>> $name<&T> for Vector2<T> {
+ type Output = Vector2<T>;
+ fn $name(self, rhs: &T) -> Self::Output {
+ Self::new(self.x.$name(*rhs), self.y.$name(*rhs))
+ }
+ }
+ };
+}
+op!(add);
+op!(div);
+op!(mul);
+op!(rem);
+op!(sub);
+
+macro_rules! assign {
+ ($name:ident, $op:ident) => {
+ impl<T: $name<T>> $name<Vector2<T>> for Vector2<T> {
+ fn $name(&mut self, rhs: Vector2<T>) {
+ self.x.$name(rhs.x);
+ self.y.$name(rhs.y);
+ }
+ }
+
+ impl<T: Copy + $name<T>> $name<&Vector2<T>> for Vector2<T> {
+ fn $name(&mut self, rhs: &Vector2<T>) {
+ self.x.$name(rhs.x);
+ self.y.$name(rhs.y);
+ }
+ }
+
+ impl<T: Copy + $name<T>> $name<T> for Vector2<T> {
+ fn $name(&mut self, rhs: T) {
+ self.x.$name(rhs);
+ self.y.$name(rhs);
+ }
+ }
+
+ impl<T: Copy + $name<T>> $name<&T> for Vector2<T> {
+ fn $name(&mut self, rhs: &T) {
+ self.x.$name(*rhs);
+ self.y.$name(*rhs);
+ }
+ }
+ };
+}
+assign!(add_assign, add);
+assign!(div_assign, div);
+assign!(mul_assign, mul);
+assign!(rem_assign, rem);
+assign!(sub_assign, sub);
+
+impl<T: Neg<Output = T>> Neg for Vector2<T> {
+ type Output = Vector2<T>;
+
+ fn neg(self) -> Self::Output {
+ Self::new(-self.x, -self.y)
+ }
+}