use std::cmp::Eq; // use std::collections::VecDeque; use std::fmt::Debug; use std::hash::Hash; use std::ops::{Add, /* Index, IndexMut, */ Mul, Sub}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct Vector3D { x: T, y: T, z: T, } impl Vector3D { pub fn new(x: T, y: T, z: T) -> Vector3D { Vector3D { x, y, z } } } impl Vector3D { pub fn x(&self) -> T { self.x } pub fn y(&self) -> T { self.y } pub fn z(&self) -> T { self.z } } // [TODO] Implement indexing // macro_rules! generate_indices { // ($container:ty) => { // impl Index> for $container // where // I: Copy + TryInto, // >::Error: Debug, // C: Index, // { // type Output = C::Output; // fn index(&self, index: Vector3D) -> &Self::Output { // let (x, y): (usize, usize) = // (index.x.try_into().unwrap(), index.y.try_into().unwrap()); // &self[y][x] // } // } // impl IndexMut> for $container // where // I: Copy + TryInto, // >::Error: Debug, // C: IndexMut, // { // fn index_mut(&mut self, index: Vector3D) -> &mut Self::Output { // let (x, y): (usize, usize) = // (index.x.try_into().unwrap(), index.y.try_into().unwrap()); // &mut self[y][x] // } // } // }; // } // generate_indices!(VecDeque); // generate_indices!([C]); // generate_indices!(Vec); // // generate_indices!([C; N], const N: usize); // pub fn in_range(v: &[Vec], idx: &Vector3D) -> bool // where // I: Copy, // usize: TryFrom, // { // usize::try_from(idx.y) // .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len())) // .unwrap_or(false) // } // See: https://github.com/rust-lang/rust/issues/102731 // impl, T> From> for Vector3D { // fn from(value: Vector3D) -> Self { // Self { // x: U::from(value.x), // y: U::from(value.y), // } // } // } impl, U> Add for Vector3D { type Output = Vector3D; fn add(self, rhs: Self) -> Self::Output { Vector3D { x: self.x + rhs.x, y: self.y + rhs.y, z: self.z + rhs.z, } } } impl, U> Sub for Vector3D { type Output = Vector3D; fn sub(self, rhs: Self) -> Self::Output { Vector3D { x: self.x - rhs.x, y: self.y - rhs.y, z: self.z - rhs.z, } } } impl, U> Mul for Vector3D { type Output = Vector3D; fn mul(self, rhs: Self) -> Self::Output { Vector3D { x: self.x * rhs.x, y: self.y * rhs.y, z: self.z * rhs.z, } } } impl + Copy, U> Mul for Vector3D { type Output = Vector3D; fn mul(self, rhs: T) -> Self::Output { Vector3D { x: self.x * rhs, y: self.y * rhs, z: self.z * rhs, } } }