#[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub(crate) struct DomainId(Option<usize>);
pub trait DomainEnumeration {
fn id(&self) -> usize;
}
pub struct DefaultDomain;
impl DomainEnumeration for DefaultDomain {
fn id(&self) -> usize {
0
}
}
impl DomainId {
pub(crate) fn new(d: &impl DomainEnumeration) -> DomainId {
DomainId(Some(d.id()))
}
pub(crate) fn index(&self) -> Option<usize> {
self.0
}
}
#[macro_export]
macro_rules! domain_enum {
( $e:tt ) => {
impl DomainEnumeration for $e {
fn id(&self) -> usize {
*self as usize
}
}
};
}