1use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
2
3#[derive(Debug, Clone, Copy, Eq, PartialEq)]
5pub struct Pos {
6 pub x: i32,
7 pub y: i32,
8}
9
10impl Pos {
11 pub fn new(x: i32, y: i32) -> Self {
13 Self { x, y }
14 }
15}
16
17impl Add<Pos> for Pos {
18 type Output = Pos;
19
20 fn add(self, rhs: Pos) -> Self::Output {
21 Self::new(self.x + rhs.x, self.y + rhs.y)
22 }
23}
24
25impl AddAssign<Pos> for Pos {
26 fn add_assign(&mut self, rhs: Pos) {
27 self.x += rhs.x;
28 self.y += rhs.y;
29 }
30}
31
32impl Sub<Pos> for Pos {
33 type Output = Pos;
34
35 fn sub(self, rhs: Pos) -> Self::Output {
36 Self::new(self.x - rhs.x, self.y - rhs.y)
37 }
38}
39
40impl SubAssign<Pos> for Pos {
41 fn sub_assign(&mut self, rhs: Pos) {
42 self.x -= rhs.x;
43 self.y -= rhs.y;
44 }
45}
46
47impl Mul<i32> for Pos {
48 type Output = Self;
49
50 fn mul(self, rhs: i32) -> Self::Output {
51 Self::new(self.x * rhs, self.y * rhs)
52 }
53}
54
55impl MulAssign<i32> for Pos {
56 fn mul_assign(&mut self, rhs: i32) {
57 self.x *= rhs;
58 self.y *= rhs;
59 }
60}
61
62impl Mul<Pos> for Pos {
63 type Output = Self;
64
65 fn mul(self, rhs: Pos) -> Self::Output {
66 Self::new(self.x * rhs.x, self.y * rhs.y)
67 }
68}
69
70impl MulAssign<Pos> for Pos {
71 fn mul_assign(&mut self, rhs: Pos) {
72 self.x *= rhs.x;
73 self.y *= rhs.y;
74 }
75}
76
77impl Div<i32> for Pos {
78 type Output = Self;
79
80 fn div(self, rhs: i32) -> Self::Output {
81 Self::new(self.x / rhs, self.y / rhs)
82 }
83}
84
85impl DivAssign<i32> for Pos {
86 fn div_assign(&mut self, rhs: i32) {
87 self.x /= rhs;
88 self.y /= rhs;
89 }
90}
91
92impl Div<Pos> for Pos {
93 type Output = Self;
94
95 fn div(self, rhs: Pos) -> Self::Output {
96 Self::new(self.x / rhs.x, self.y / rhs.y)
97 }
98}
99
100impl DivAssign<Pos> for Pos {
101 fn div_assign(&mut self, rhs: Pos) {
102 self.x /= rhs.x;
103 self.y /= rhs.y;
104 }
105}