use necsim_core::{
cogs::{Backup, Habitat, MathsCore},
landscape::Location,
};
use necsim_partitioning_core::partition::Partition;
pub mod equal;
pub mod modulo;
pub mod monolithic;
pub mod radial;
#[allow(clippy::inline_always, clippy::inline_fn_without_body)]
#[contract_trait]
pub trait Decomposition<M: MathsCore, H: Habitat<M>>: Backup + Sized + core::fmt::Debug {
fn get_subdomain(&self) -> Partition;
#[debug_requires(habitat.is_location_habitable(location), "location is habitable")]
#[debug_ensures(
ret < self.get_subdomain().size().get(),
"subdomain rank is in range [0, self.get_subdomain().size())"
)]
fn map_location_to_subdomain_rank(&self, location: &Location, habitat: &H) -> u32;
}