use std::hash::{Hash, Hasher};
use bevy_gpu_compute_core::IterSpaceDimmension;
#[derive(Hash, Copy, Debug, Clone)]
pub struct IterationSpace {
x: usize,
y: usize,
z: usize,
num_dimmensions: IterSpaceDimmension,
}
impl Default for IterationSpace {
fn default() -> Self {
IterationSpace::new_unsafe(1, 1, 1)
}
}
impl IterationSpace {
pub fn new_unsafe(x: usize, y: usize, z: usize) -> Self {
let num_dimmensions = if z > 1 {
IterSpaceDimmension::ThreeD
} else if y > 1 {
IterSpaceDimmension::TwoD
} else {
IterSpaceDimmension::OneD
};
IterationSpace {
x,
y,
z,
num_dimmensions,
}
}
pub fn new(x: usize, y: usize, z: usize) -> Self {
if x == 0 || y == 0 || z == 0 {
panic!("Each dimmension must be greater than 0");
}
let num_dimmensions = if x > 1 && y > 1 && z > 1 {
IterSpaceDimmension::ThreeD
} else if x > 1 && y > 1 {
IterSpaceDimmension::TwoD
} else {
IterSpaceDimmension::OneD
};
IterationSpace {
x,
y,
z,
num_dimmensions,
}
}
pub fn get_hash(&self) -> u64 {
let mut hasher = std::collections::hash_map::DefaultHasher::new();
self.hash(&mut hasher);
hasher.finish()
}
pub fn num_dimmensions(&self) -> IterSpaceDimmension {
self.num_dimmensions
}
pub fn x(&self) -> usize {
self.x
}
pub fn y(&self) -> usize {
self.y
}
pub fn z(&self) -> usize {
self.z
}
}