1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
use std::fmt; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] pub struct Position { x: usize, y: usize, } impl Position { #[must_use] pub fn new(x: usize, y: usize) -> Self { Self { x, y } } #[must_use] pub fn new_u16(x: u16, y: u16) -> Self { Self { x: x as usize, y: y as usize, } } pub fn set_x(&mut self, x: usize) { self.x = x } pub fn set_y(&mut self, y: usize) { self.y = y } pub fn add_to_x(&mut self, x: usize) { self.x = self.x.saturating_add(x); } pub fn sub_to_x(&mut self, x: usize) { self.x = self.x.saturating_sub(x); } pub fn add_to_y(&mut self, y: usize) { self.y = self.y.saturating_add(y); } pub fn sub_to_y(&mut self, y: usize) { self.y = self.y.saturating_sub(y); } #[must_use] pub fn as_usize(&self) -> (usize, usize) { (self.x, self.y) } #[must_use] pub fn as_usize_x(&self) -> usize { self.x } #[must_use] pub fn as_usize_y(&self) -> usize { self.y } #[must_use] pub fn as_u16(&self) -> (u16, u16) { (self.x as u16, self.y as u16) } #[must_use] pub fn as_u16_x(&self) -> u16 { self.x as u16 } #[must_use] pub fn as_u16_y(&self) -> u16 { self.y as u16 } #[must_use] pub fn is_zero(&self) -> bool { self.x == 0 && self.y == 0 } } impl std::ops::Add for Position { type Output = Self; fn add(self, other: Self) -> Self { Self { x: self.x + other.x, y: self.y + other.y, } } } impl std::ops::Sub for Position { type Output = Self; fn sub(self, other: Self) -> Self { Self { x: self.x.saturating_sub(other.x), y: self.y.saturating_sub(other.y), } } } impl fmt::Display for Position { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}/{}", self.x, self.y) } } impl From<(u16, u16)> for Position { fn from((x, y): (u16, u16)) -> Self { Self::new_u16(x, y) } } impl From<&(u16, u16)> for Position { fn from((x, y): &(u16, u16)) -> Self { Self::new_u16(*x, *y) } } impl From<(usize, usize)> for Position { fn from((x, y): (usize, usize)) -> Self { Self { x, y } } } impl From<(i32, i32)> for Position { fn from((x, y): (i32, i32)) -> Self { Self::new(x as usize, y as usize) } } impl From<&(i32, i32)> for Position { fn from((x, y): &(i32, i32)) -> Self { Self::new(*x as usize, *y as usize) } }