pub struct SparseDataFlowAnalysis<A, D> { /* private fields */ }
Expand description
This type provides an AnalysisStrategy for sparse data-flow analyses.
In short, it implements the DataFlowAnalysis trait, and handles all of the boilerplate that any well-structured sparse data-flow analysis requires. Analyses can make use of this strategy by implementing one of the sparse data-flow analysis traits, which SparseDataFlowAnalysis will use to delegate analysis-specific details to the analysis implementation. The two traits are:
- SparseForwardDataFlowAnalysis, for forward-propagating sparse analyses
- SparseBackwardDataFlowAnalysis, for backward-propagating sparse analyses
§What is a sparse analysis?
A sparse data-flow analysis is one which associates analysis state with SSA value definitions, in order to represent known facts about those values, either as a result of deriving them from previous values used as operands of the defining operation (forward analysis), or as a result of deriving them based on how the value is used along all possible paths that execution might take (backward analysis). The state associated with a value does not change as a program executes, it is fixed at the value definition, derived only from the states of other values and the defining op itself.
This is in contrast to dense data-flow analysis, which associates state with program points, which then evolves as the program executes. This is also where the distinction between dense and sparse comes from - program points are dense, while SSA value definitions are sparse (insofar as the state associated with an SSA value only ever occurs once, while states associated with program points are duplicated at each point).
Some examples of sparse analyses:
- Constant propagation - if a value is determined to be constant, the constant value is the state associated with a given value definition. This determination is made based on the semantics of an operation and its operands (i.e. if an operation can be constant-folded, then the results of that operation are themselves constant). This is a forward analysis.
- Dead value analysis - determines whether or not a value is ever used. This is a backward analysis, as it propagates uses to definitions. In our IR, we do not require this analysis, as it is implicit in the use-def graph, however the concept is what we’re interested in here.
§Usage
This type is meant to be used indirectly, as an AnalysisStrategy implementation, rather than directly as a DataFlowAnalysis implementation, as shown below:
use midenc_hir::dataflow::*;
#[derive(Default)]
pub struct MyAnalysis;
impl BuildableDataFlowAnalysis for MyAnalysis {
type Strategy = SparseDataFlowAnalysis<Self, Forward>;
fn new(_solver: &mut DataFlowSolver) -> Self {
Self
}
}
impl SparseForwardDataFlowAnalysis for MyAnalysis {
type Lattice = Lattice<u32>;
//...
}
The above permits us to load MyAnalysis
into a DataFlowSolver
without ever mentioning the
SparseDataFlowAnalysis
type at all, like so:
let mut solver = DataFlowSolver::default();
solver.load::<MyAnalysis>();
solver.initialize_and_run(&op, analysis_manager);
Trait Implementations§
Source§impl<A: SparseBackwardDataFlowAnalysis> AnalysisStrategy<A> for SparseDataFlowAnalysis<A, Backward>
impl<A: SparseBackwardDataFlowAnalysis> AnalysisStrategy<A> for SparseDataFlowAnalysis<A, Backward>
Source§type Direction = Backward
type Direction = Backward
Source§fn build(analysis: A, _solver: &mut DataFlowSolver) -> Self
fn build(analysis: A, _solver: &mut DataFlowSolver) -> Self
Source§impl<A: SparseForwardDataFlowAnalysis> AnalysisStrategy<A> for SparseDataFlowAnalysis<A, Forward>
impl<A: SparseForwardDataFlowAnalysis> AnalysisStrategy<A> for SparseDataFlowAnalysis<A, Forward>
Source§type Direction = Forward
type Direction = Forward
Source§fn build(analysis: A, _solver: &mut DataFlowSolver) -> Self
fn build(analysis: A, _solver: &mut DataFlowSolver) -> Self
Source§impl<A: SparseBackwardDataFlowAnalysis> DataFlowAnalysis for SparseDataFlowAnalysis<A, Backward>
impl<A: SparseBackwardDataFlowAnalysis> DataFlowAnalysis for SparseDataFlowAnalysis<A, Backward>
Source§fn initialize(
&self,
top: &Operation,
solver: &mut DataFlowSolver,
_analysis_manager: AnalysisManager,
) -> Result<(), Report>
fn initialize( &self, top: &Operation, solver: &mut DataFlowSolver, _analysis_manager: AnalysisManager, ) -> Result<(), Report>
Initialize the analysis by visiting the operation and everything nested under it.
Source§fn visit(
&self,
point: &ProgramPoint,
solver: &mut DataFlowSolver,
) -> Result<(), Report>
fn visit( &self, point: &ProgramPoint, solver: &mut DataFlowSolver, ) -> Result<(), Report>
Visit a program point.
If it is after call operation or an operation with block or region control-flow, then operand lattices are set accordingly. Otherwise, invokes the operation transfer function.
Source§fn debug_name(&self) -> &'static str
fn debug_name(&self) -> &'static str
Source§fn analysis_id(&self) -> TypeId
fn analysis_id(&self) -> TypeId
Source§impl<A: SparseForwardDataFlowAnalysis> DataFlowAnalysis for SparseDataFlowAnalysis<A, Forward>
impl<A: SparseForwardDataFlowAnalysis> DataFlowAnalysis for SparseDataFlowAnalysis<A, Forward>
Source§fn initialize(
&self,
top: &Operation,
solver: &mut DataFlowSolver,
_analysis_manager: AnalysisManager,
) -> Result<(), Report>
fn initialize( &self, top: &Operation, solver: &mut DataFlowSolver, _analysis_manager: AnalysisManager, ) -> Result<(), Report>
Initialize the analysis by visiting every owner of an SSA value: all operations and blocks.
Source§fn visit(
&self,
point: &ProgramPoint,
solver: &mut DataFlowSolver,
) -> Result<(), Report>
fn visit( &self, point: &ProgramPoint, solver: &mut DataFlowSolver, ) -> Result<(), Report>
Visit a program point.
If this is at beginning of block and all control-flow predecessors or callsites are known, then the arguments lattices are propagated from them. If this is after call operation or an operation with region control-flow, then its result lattices are set accordingly. Otherwise, the operation transfer function is invoked.
Source§fn debug_name(&self) -> &'static str
fn debug_name(&self) -> &'static str
Source§fn analysis_id(&self) -> TypeId
fn analysis_id(&self) -> TypeId
Source§impl<A: SparseBackwardDataFlowAnalysis> SparseBackwardDataFlowAnalysis for SparseDataFlowAnalysis<A, Backward>
impl<A: SparseBackwardDataFlowAnalysis> SparseBackwardDataFlowAnalysis for SparseDataFlowAnalysis<A, Backward>
type Lattice = <A as SparseBackwardDataFlowAnalysis>::Lattice
fn debug_name(&self) -> &'static str
Source§fn visit_operation(
&self,
op: &Operation,
operands: &mut [AnalysisStateGuardMut<'_, Self::Lattice>],
results: &[AnalysisStateGuard<'_, Self::Lattice>],
solver: &mut DataFlowSolver,
) -> Result<(), Report>
fn visit_operation( &self, op: &Operation, operands: &mut [AnalysisStateGuardMut<'_, Self::Lattice>], results: &[AnalysisStateGuard<'_, Self::Lattice>], solver: &mut DataFlowSolver, ) -> Result<(), Report>
Source§fn set_to_exit_state(
&self,
lattice: &mut AnalysisStateGuardMut<'_, Self::Lattice>,
)
fn set_to_exit_state( &self, lattice: &mut AnalysisStateGuardMut<'_, Self::Lattice>, )
Source§fn visit_call_operand(
&self,
operand: &OpOperandImpl,
solver: &mut DataFlowSolver,
)
fn visit_call_operand( &self, operand: &OpOperandImpl, solver: &mut DataFlowSolver, )
Source§fn visit_external_call(
&self,
call: &dyn CallOpInterface,
arguments: &mut [AnalysisStateGuardMut<'_, Self::Lattice>],
results: &[AnalysisStateGuard<'_, Self::Lattice>],
solver: &mut DataFlowSolver,
)
fn visit_external_call( &self, call: &dyn CallOpInterface, arguments: &mut [AnalysisStateGuardMut<'_, Self::Lattice>], results: &[AnalysisStateGuard<'_, Self::Lattice>], solver: &mut DataFlowSolver, )
Source§fn visit_branch_operand(
&self,
operand: &OpOperandImpl,
solver: &mut DataFlowSolver,
)
fn visit_branch_operand( &self, operand: &OpOperandImpl, solver: &mut DataFlowSolver, )
Source§impl<A: SparseForwardDataFlowAnalysis> SparseForwardDataFlowAnalysis for SparseDataFlowAnalysis<A, Forward>
impl<A: SparseForwardDataFlowAnalysis> SparseForwardDataFlowAnalysis for SparseDataFlowAnalysis<A, Forward>
type Lattice = <A as SparseForwardDataFlowAnalysis>::Lattice
fn debug_name(&self) -> &'static str
Source§fn visit_operation(
&self,
op: &Operation,
operands: &[AnalysisStateGuard<'_, Self::Lattice>],
results: &mut [AnalysisStateGuardMut<'_, Self::Lattice>],
solver: &mut DataFlowSolver,
) -> Result<(), Report>
fn visit_operation( &self, op: &Operation, operands: &[AnalysisStateGuard<'_, Self::Lattice>], results: &mut [AnalysisStateGuardMut<'_, Self::Lattice>], solver: &mut DataFlowSolver, ) -> Result<(), Report>
Source§fn set_to_entry_state(
&self,
lattice: &mut AnalysisStateGuardMut<'_, Self::Lattice>,
)
fn set_to_entry_state( &self, lattice: &mut AnalysisStateGuardMut<'_, Self::Lattice>, )
Source§fn visit_external_call(
&self,
call: &dyn CallOpInterface,
arguments: &[AnalysisStateGuard<'_, Self::Lattice>],
results: &mut [AnalysisStateGuardMut<'_, Self::Lattice>],
solver: &mut DataFlowSolver,
)
fn visit_external_call( &self, call: &dyn CallOpInterface, arguments: &[AnalysisStateGuard<'_, Self::Lattice>], results: &mut [AnalysisStateGuardMut<'_, Self::Lattice>], solver: &mut DataFlowSolver, )
Source§fn visit_non_control_flow_arguments(
&self,
op: &Operation,
successor: &RegionSuccessor<'_>,
arguments: &mut [AnalysisStateGuardMut<'_, Self::Lattice>],
first_index: usize,
solver: &mut DataFlowSolver,
)
fn visit_non_control_flow_arguments( &self, op: &Operation, successor: &RegionSuccessor<'_>, arguments: &mut [AnalysisStateGuardMut<'_, Self::Lattice>], first_index: usize, solver: &mut DataFlowSolver, )
Auto Trait Implementations§
impl<A, D> Freeze for SparseDataFlowAnalysis<A, D>where
A: Freeze,
impl<A, D> RefUnwindSafe for SparseDataFlowAnalysis<A, D>where
A: RefUnwindSafe,
D: RefUnwindSafe,
impl<A, D> Send for SparseDataFlowAnalysis<A, D>
impl<A, D> Sync for SparseDataFlowAnalysis<A, D>
impl<A, D> Unpin for SparseDataFlowAnalysis<A, D>
impl<A, D> UnwindSafe for SparseDataFlowAnalysis<A, D>where
A: UnwindSafe,
D: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg
or
a color-specific method, such as OwoColorize::green
, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg
or
a color-specific method, such as OwoColorize::on_yellow
, Read moreSource§fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
Source§fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
Source§fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
Source§fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
Source§impl<T> PassTarget for Twhere
T: 'static,
impl<T> PassTarget for Twhere
T: 'static,
default fn target_name(_context: &Context) -> Option<OperationName>
default fn into_target( op: &RawEntityRef<Operation, IntrusiveLink>, ) -> EntityRef<'_, T>
default fn into_target_mut( op: &mut RawEntityRef<Operation, IntrusiveLink>, ) -> EntityMut<'_, T>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.Source§impl<T, Trait> Verifier<Trait> for Twhere
Trait: ?Sized,
impl<T, Trait> Verifier<Trait> for Twhere
Trait: ?Sized,
Source§const VACUOUS: bool = true
const VACUOUS: bool = true
Verifier
sets this flag to true when its implementation is vacuous,
i.e. it always succeeds and is not dependent on runtime context. Read moreSource§default fn should_verify(&self, _context: &Context) -> bool
default fn should_verify(&self, _context: &Context) -> bool
Source§default fn maybe_verify(&self, _context: &Context) -> Result<(), Report>
default fn maybe_verify(&self, _context: &Context) -> Result<(), Report>
true