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
use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Shape1D { width: usize, } impl Shape1D { pub fn new(width: usize) -> Self { Self { width } } pub fn width(&self) -> usize { self.width } pub fn volume(&self) -> usize { self.width() } pub fn x_idx_min(&self) -> i64 { dim_idx_min(self.width()) } pub fn x_idx_max(&self) -> i64 { dim_idx_max(self.width()) } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Shape2D { width: usize, height: usize, } impl Shape2D { pub fn new(width: usize, height: usize) -> Self { Self { width, height } } pub fn width(&self) -> usize { self.width } pub fn height(&self) -> usize { self.height } pub fn volume(&self) -> usize { self.width() * self.height() } pub fn x_idx_min(&self) -> i64 { dim_idx_min(self.width()) } pub fn x_idx_max(&self) -> i64 { dim_idx_max(self.width()) } pub fn y_idx_min(&self) -> i64 { dim_idx_min(self.height()) } pub fn y_idx_max(&self) -> i64 { dim_idx_max(self.height()) } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Shape3D { width: usize, height: usize, depth: usize, } impl Shape3D { pub fn new(width: usize, height: usize, depth: usize) -> Self { Self { width, height, depth, } } pub fn width(&self) -> usize { self.width } pub fn height(&self) -> usize { self.height } pub fn depth(&self) -> usize { self.depth } pub fn volume(&self) -> usize { self.width() * self.height() * self.depth() } pub fn x_idx_min(&self) -> i64 { dim_idx_min(self.width()) } pub fn x_idx_max(&self) -> i64 { dim_idx_max(self.width()) } pub fn y_idx_min(&self) -> i64 { dim_idx_min(self.height()) } pub fn y_idx_max(&self) -> i64 { dim_idx_max(self.height()) } pub fn z_idx_min(&self) -> i64 { dim_idx_min(self.depth()) } pub fn z_idx_max(&self) -> i64 { dim_idx_max(self.depth()) } } #[inline(always)] fn dim_idx_min(len: usize) -> i64 { -(len as i64) / 2 } #[inline(always)] fn dim_idx_max(len: usize) -> i64 { len as i64 + dim_idx_min(len) - 1 }