use super::NoiseMapGenerator;
use std::cmp::{PartialOrd, Ord, Ordering};
use std::default::Default;
use std::hash::{Hash, Hasher};
use std::collections::hash_map::DefaultHasher;
pub trait Property : Default + Copy {
fn set_to<NM: NoiseMapGenerator>(self, nm: NM) -> NM;
}
#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]
pub struct Seed {
pub value: u64
}
impl Seed {
pub fn of_value(value: u64) -> Seed {
Seed {
value
}
}
pub fn of<T: Hash>(value: T) -> Seed {
let mut hasher = DefaultHasher::new();
value.hash(&mut hasher);
Seed {
value: hasher.finish()
}
}
}
impl Property for Seed {
fn set_to<NM: NoiseMapGenerator>(self, nm: NM) -> NM {
nm.set_seed(self)
}
}
#[derive(Default, Copy, Clone, Debug, PartialEq)]
pub struct Step {
pub x: f64,
pub y: f64
}
impl Step {
pub fn of(x: f64, y: f64) -> Step {
Step {
x,
y
}
}
}
impl Property for Step {
fn set_to<NM: NoiseMapGenerator>(self, nm: NM) -> NM {
nm.set_step(self)
}
}
#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]
pub struct Size {
pub w: i64,
pub h: i64
}
impl Size {
pub fn of(w: i64, h: i64) -> Size {
Size {
w,
h
}
}
}
impl Property for Size {
fn set_to<NM: NoiseMapGenerator>(self, nm: NM) -> NM {
nm.set_size(self)
}
}
impl PartialOrd for Size {
fn partial_cmp(&self, other: &Size) -> Option<Ordering> {
(self.w * self.h).partial_cmp(&(other.w * other.h))
}
}
impl Ord for Size {
fn cmp(&self, other: &Size) -> Ordering {
self.partial_cmp(other).unwrap()
}
}