Struct rustc_ap_rustc_data_structures::transitive_relation::TransitiveRelation [−][src]
pub struct TransitiveRelation<T> { /* fields omitted */ }
Implementations
impl<T: Eq + Hash> TransitiveRelation<T>
[src]
impl<T: Eq + Hash> TransitiveRelation<T>
[src]pub fn is_empty(&self) -> bool
[src]
pub fn elements(&self) -> impl Iterator<Item = &T>
[src]
pub fn maybe_map<F, U>(&self, f: F) -> Option<TransitiveRelation<U>> where
F: FnMut(&T) -> Option<U>,
U: Clone + Debug + Eq + Hash,
[src]
pub fn maybe_map<F, U>(&self, f: F) -> Option<TransitiveRelation<U>> where
F: FnMut(&T) -> Option<U>,
U: Clone + Debug + Eq + Hash,
[src]Applies the (partial) function to each edge and returns a new
relation. If f
returns None
for any end-point, returns
None
.
pub fn reachable_from(&self, a: &T) -> Vec<&T>
[src]
pub fn reachable_from(&self, a: &T) -> Vec<&T>
[src]Thinking of x R y
as an edge x -> y
in a graph, this
returns all things reachable from a
.
Really this probably ought to be impl Iterator<Item = &T>
, but
I’m too lazy to make that work, and – given the caching
strategy – it’d be a touch tricky anyhow.
pub fn postdom_upper_bound(&self, a: &T, b: &T) -> Option<&T>
[src]
pub fn postdom_upper_bound(&self, a: &T, b: &T) -> Option<&T>
[src]Picks what I am referring to as the “postdominating”
upper-bound for a
and b
. This is usually the least upper
bound, but in cases where there is no single least upper
bound, it is the “mutual immediate postdominator”, if you
imagine a graph where a < b
means a -> b
.
This function is needed because region inference currently requires that we produce a single “UB”, and there is no best choice for the LUB. Rather than pick arbitrarily, I pick a less good, but predictable choice. This should help ensure that region inference yields predictable results (though it itself is not fully sufficient).
Examples are probably clearer than any prose I could write
(there are corresponding tests below, btw). In each case,
the query is postdom_upper_bound(a, b)
:
// Returns Some(x), which is also LUB.
a -> a1 -> x
^
|
b -> b1 ---+
// Returns `Some(x)`, which is not LUB (there is none)
// diagonal edges run left-to-right.
a -> a1 -> x
\/ ^
/\ |
b -> b1 ---+
// Returns `None`.
a -> a1
b -> b1
pub fn mutual_immediate_postdominator<'a>(
&'a self,
mubs: Vec<&'a T>
) -> Option<&'a T>
[src]
pub fn mutual_immediate_postdominator<'a>(
&'a self,
mubs: Vec<&'a T>
) -> Option<&'a T>
[src]Viewing the relation as a graph, computes the “mutual
immediate postdominator” of a set of points (if one
exists). See postdom_upper_bound
for details.
pub fn minimal_upper_bounds(&self, a: &T, b: &T) -> Vec<&T>
[src]
pub fn minimal_upper_bounds(&self, a: &T, b: &T) -> Vec<&T>
[src]Returns the set of bounds X
such that:
a < X
andb < X
- there is no
Y != X
such thata < Y
andY < X
- except for the case where
X < a
(i.e., a strongly connected component in the graph). In that case, the smallest representative of the SCC is returned (as determined by the internal indices).
- except for the case where
Note that this set can, in principle, have any size.
pub fn parents(&self, a: &T) -> Vec<&T>
[src]
pub fn parents(&self, a: &T) -> Vec<&T>
[src]Given an element A, returns the maximal set {B} of elements B such that
- A != B
- A R B is true
- for each i, j:
B[i]
RB[j]
does not hold
The intuition is that this moves “one step up” through a lattice
(where the relation is encoding the <=
relation for the lattice).
So e.g., if the relation is ->
and we have
a -> b -> d -> f | ^ +--> c -> e ---+
then parents(a)
returns [b, c]
. The postdom_parent
function
would further reduce this to just f
.
Trait Implementations
impl<T: Clone> Clone for TransitiveRelation<T>
[src]
impl<T: Clone> Clone for TransitiveRelation<T>
[src]fn clone(&self) -> TransitiveRelation<T>
[src]
fn clone(&self) -> TransitiveRelation<T>
[src]Returns a copy of the value. Read more
fn clone_from(&mut self, source: &Self)
1.0.0[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]Performs copy-assignment from source
. Read more
impl<T: Debug> Debug for TransitiveRelation<T>
[src]
impl<T: Debug> Debug for TransitiveRelation<T>
[src]Auto Trait Implementations
impl<T> !RefUnwindSafe for TransitiveRelation<T>
impl<T> Send for TransitiveRelation<T> where
T: Send,
T: Send,
impl<T> !Sync for TransitiveRelation<T>
impl<T> Unpin for TransitiveRelation<T> where
T: Unpin,
T: Unpin,
impl<T> UnwindSafe for TransitiveRelation<T> where
T: UnwindSafe,
T: UnwindSafe,
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]pub fn borrow_mut(&mut self) -> &mut T
[src]
pub fn borrow_mut(&mut self) -> &mut T
[src]Mutably borrows from an owned value. Read more
impl<T> Instrument for T
[src]
impl<T> Instrument for T
[src]fn instrument(self, span: Span) -> Instrumented<Self>
[src]
fn instrument(self, span: Span) -> Instrumented<Self>
[src]Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
fn in_current_span(self) -> Instrumented<Self>
[src]
fn in_current_span(self) -> Instrumented<Self>
[src]impl<T> ToOwned for T where
T: Clone,
[src]
impl<T> ToOwned for T where
T: Clone,
[src]type Owned = T
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn to_owned(&self) -> T
[src]Creates owned data from borrowed data, usually by cloning. Read more
pub fn clone_into(&self, target: &mut T)
[src]
pub fn clone_into(&self, target: &mut T)
[src]🔬 This is a nightly-only experimental API. (toowned_clone_into
)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
pub fn vzip(self) -> V
impl<'a, T> Captures<'a> for T where
T: ?Sized,
[src]
T: ?Sized,