use data::LinkReference;
use super::{
CascadeUniquenessAndUsagesResolver, CascadeUsagesResolver, UniquenessResolver,
UniquenessValidator, UsagesValidator,
};
use crate::Doublets;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Validate;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Resolve;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CascadeResolve;
pub trait UniquenessPolicy {
type Decorator<T: LinkReference, L: Doublets<T>>: Doublets<T>;
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L>;
}
pub trait UsagesPolicy {
type Decorator<T: LinkReference, L: Doublets<T>>: Doublets<T>;
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L>;
}
impl UniquenessPolicy for Validate {
type Decorator<T: LinkReference, L: Doublets<T>> = UniquenessValidator<T, L>;
#[inline]
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L> {
UniquenessValidator::new(links)
}
}
impl UniquenessPolicy for Resolve {
type Decorator<T: LinkReference, L: Doublets<T>> = UniquenessResolver<T, L>;
#[inline]
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L> {
UniquenessResolver::new(links)
}
}
impl UniquenessPolicy for CascadeResolve {
type Decorator<T: LinkReference, L: Doublets<T>> = CascadeUniquenessAndUsagesResolver<T, L>;
#[inline]
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L> {
CascadeUniquenessAndUsagesResolver::new(links)
}
}
impl UsagesPolicy for Validate {
type Decorator<T: LinkReference, L: Doublets<T>> = UsagesValidator<T, L>;
#[inline]
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L> {
UsagesValidator::new(links)
}
}
impl UsagesPolicy for CascadeResolve {
type Decorator<T: LinkReference, L: Doublets<T>> = CascadeUsagesResolver<T, L>;
#[inline]
fn decorate<T: LinkReference, L: Doublets<T>>(links: L) -> Self::Decorator<T, L> {
CascadeUsagesResolver::new(links)
}
}
const _: () = {
assert!(size_of::<Validate>() == 0);
assert!(size_of::<Resolve>() == 0);
assert!(size_of::<CascadeResolve>() == 0);
};