pub trait ObligationProcessor {
type Obligation: ForestObligation;
type Error: Debug;
type OUT: OutcomeTrait<Obligation = Self::Obligation, Error = Error<Self::Obligation, Self::Error>>;
// Required methods
fn needs_process_obligation(&self, _obligation: &Self::Obligation) -> bool;
fn process_obligation(
&mut self,
obligation: &mut Self::Obligation,
) -> ProcessResult<Self::Obligation, Self::Error>;
fn process_backedge<'c, I>(
&mut self,
cycle: I,
_marker: PhantomData<&'c Self::Obligation>,
) -> Result<(), Self::Error>
where I: Clone + Iterator<Item = &'c Self::Obligation>;
// Provided method
fn skippable_obligations<'a>(
&'a self,
_it: impl Iterator<Item = &'a Self::Obligation>,
) -> usize { ... }
}
Required Associated Types§
type Obligation: ForestObligation
type Error: Debug
type OUT: OutcomeTrait<Obligation = Self::Obligation, Error = Error<Self::Obligation, Self::Error>>
Required Methods§
fn needs_process_obligation(&self, _obligation: &Self::Obligation) -> bool
fn process_obligation( &mut self, obligation: &mut Self::Obligation, ) -> ProcessResult<Self::Obligation, Self::Error>
sourcefn process_backedge<'c, I>(
&mut self,
cycle: I,
_marker: PhantomData<&'c Self::Obligation>,
) -> Result<(), Self::Error>
fn process_backedge<'c, I>( &mut self, cycle: I, _marker: PhantomData<&'c Self::Obligation>, ) -> Result<(), Self::Error>
As we do the cycle check, we invoke this callback when we
encounter an actual cycle. cycle
is an iterator that starts
at the start of the cycle in the stack and walks toward the
top.
In other words, if we had O1 which required O2 which required O3 which required O1, we would give an iterator yielding O1, O2, O3 (O1 is not yielded twice).
Provided Methods§
sourcefn skippable_obligations<'a>(
&'a self,
_it: impl Iterator<Item = &'a Self::Obligation>,
) -> usize
fn skippable_obligations<'a>( &'a self, _it: impl Iterator<Item = &'a Self::Obligation>, ) -> usize
Implementations can provide a fast-path to obligation-processing
by counting the prefix of the passed iterator for which
needs_process_obligation
would return false.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.