jay-compositor 1.15.0

The Jay compositor
use crate::criteria::CritMatcherIds;
use crate::criteria::FixedRootMatcher;
use crate::criteria::crit_graph::CritFixedRootCriterion;
use crate::criteria::crit_graph::CritFixedRootCriterionBase;
use crate::criteria::crit_graph::CritMgr;
use crate::criteria::crit_graph::CritRoot;
use crate::criteria::crit_graph::CritRootFixed;
use crate::criteria::crit_graph::CritTarget;
use linearize::static_map;
use std::marker::PhantomData;
use std::rc::Rc;

pub struct CritMatchConstant<Target>(pub bool, pub PhantomData<fn(&Target)>);

impl<Target> CritMatchConstant<Target>
where
    Target: CritTarget,
{
    pub fn create(
        roots: &Rc<Target::RootMatchers>,
        ids: &CritMatcherIds,
    ) -> FixedRootMatcher<Target, CritMatchConstant<Target>> {
        static_map! {
            v => CritRoot::new(
                roots,
                ids.next(),
                CritRootFixed(Self(v, PhantomData), PhantomData),
            ),
        }
    }
}

impl<Target> CritFixedRootCriterionBase<Target> for CritMatchConstant<Target>
where
    Target: CritTarget,
{
    fn constant(&self) -> bool {
        self.0
    }

    fn not<'a>(&self, mgr: &'a Target::Mgr) -> &'a FixedRootMatcher<Target, Self>
    where
        Self: CritFixedRootCriterion<Target>,
    {
        mgr.match_constant()
    }
}

impl<Target> CritFixedRootCriterion<Target> for CritMatchConstant<Target>
where
    Target: CritTarget,
{
    const COMPARE: bool = false;

    fn matches(&self, _data: &Target) -> bool {
        self.0
    }
}