struct SpantreeBuilder<'a, Node: Idx> {
supernodes: &'a IndexSlice<Node, Node>,
succ_supernodes: &'a IndexSlice<Node, Node>,
is_unvisited: DenseBitSet<Node>,
span_edges: IndexVec<Node, Option<SpantreeEdge<Node>>>,
yank_buffer: Vec<Node>,
counter_terms: IndexVec<Node, Vec<CounterTerm<Node>>>,
}
Fields§
§supernodes: &'a IndexSlice<Node, Node>
§succ_supernodes: &'a IndexSlice<Node, Node>
§is_unvisited: DenseBitSet<Node>
§span_edges: IndexVec<Node, Option<SpantreeEdge<Node>>>
Links supernodes to each other, gradually forming a spanning tree of the merged-flow graph.
A supernode without a span edge is the root of its component of the spantree. Nodes that aren’t supernodes cannot have a spantree edge.
yank_buffer: Vec<Node>
Shared path buffer recycled by all calls to yank_to_spantree_root
.
counter_terms: IndexVec<Node, Vec<CounterTerm<Node>>>
An in-progress counter expression for each node. Each expression is initially empty, and will be filled in as relevant nodes are visited.
Implementations§
Source§impl<'a, Node: Idx> SpantreeBuilder<'a, Node>
impl<'a, Node: Idx> SpantreeBuilder<'a, Node>
fn new(node_flow_data: &'a NodeFlowData<Node>) -> Self
fn is_supernode(&self, node: Node) -> bool
Sourcefn spantree_root(&self, this: Node) -> Node
fn spantree_root(&self, this: Node) -> Node
Given a supernode, finds the supernode that is the “root” of its spantree component. Two nodes that have the same spantree root are connected in the spantree.
Sourcefn yank_to_spantree_root(&mut self, this: Node)
fn yank_to_spantree_root(&mut self, this: Node)
Rotates edges in the spantree so that this
is the root of its
spantree component.
Sourcefn visit_node(&mut self, this: Node)
fn visit_node(&mut self, this: Node)
Must be called exactly once for each node in the balanced-flow graph.
Sourcefn finish(self) -> IndexVec<Node, Vec<CounterTerm<Node>>>
fn finish(self) -> IndexVec<Node, Vec<CounterTerm<Node>>>
Asserts that all nodes have been visited, and returns the computed counter expressions (made up of physical counters) for each node.
Trait Implementations§
Auto Trait Implementations§
impl<'a, Node> DynSend for SpantreeBuilder<'a, Node>
impl<'a, Node> DynSync for SpantreeBuilder<'a, Node>where
Node: DynSync,
impl<'a, Node> Freeze for SpantreeBuilder<'a, Node>
impl<'a, Node> RefUnwindSafe for SpantreeBuilder<'a, Node>where
Node: RefUnwindSafe,
impl<'a, Node> Send for SpantreeBuilder<'a, Node>
impl<'a, Node> Sync for SpantreeBuilder<'a, Node>where
Node: Sync,
impl<'a, Node> Unpin for SpantreeBuilder<'a, Node>where
Node: Unpin,
impl<'a, Node> UnwindSafe for SpantreeBuilder<'a, Node>where
Node: UnwindSafe + RefUnwindSafe,
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, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
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<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 136 bytes