pub struct PathTree {
root: Option<PathNode>,
len: usize,
}Expand description
A prefix-tree (trie) of whole-CFG paths sharing common prefixes.
Paths are sequences of MIR block indices. The trie compresses shared
prefixes — if two paths [0,1,2,5] and [0,1,2,6] are both inserted,
blocks 0→1→2 are stored once and branch at block 2.
Each node is a PathNode; a node with is_path_end == true marks the
end of a complete path that exists in the tree. The len field tracks
the number of complete paths stored.
§Invariants
- All paths inserted into a given tree start with the same root block (by construction, block 0 — the CFG entry).
- A path is only stored if it passed reachability filtering
(see
PathGraph::check_transition).
Fields§
§root: Option<PathNode>§len: usizeImplementations§
Source§impl PathTree
impl PathTree
pub fn new() -> Self
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
pub fn root(&self) -> Option<&PathNode>
Sourcepub fn insert(&mut self, path: &[usize]) -> bool
pub fn insert(&mut self, path: &[usize]) -> bool
Insert a path into the tree. Returns true if the path was
newly added (not already present as a terminal path).
fn insert_into(node: &mut PathNode, suffix: &[usize]) -> bool
Sourcepub fn contains(&self, path: &[usize]) -> bool
pub fn contains(&self, path: &[usize]) -> bool
Check whether the given path exists as a complete path in the tree.
Sourcepub fn iter(&self) -> PathTreeIter<'_> ⓘ
pub fn iter(&self) -> PathTreeIter<'_> ⓘ
Enumerate all paths as owned Vec<usize>.
Sourcepub fn walk_prefixes<F>(&self, target_block: usize, f: &mut F) -> Result<(), ()>
pub fn walk_prefixes<F>(&self, target_block: usize, f: &mut F) -> Result<(), ()>
Walk the tree and call f with each unique prefix that ends at
target_block. The walk stops at target_block (does not recurse
into its children), so the callback receives the path from the root
up to and including target_block.
Returns Ok(()) if the walk completed, or Err(()) if f returned
false to request early termination.
Sourcepub fn walk_all_prefixes<F>(
&self,
target_block: usize,
f: &mut F,
) -> Result<(), ()>
pub fn walk_all_prefixes<F>( &self, target_block: usize, f: &mut F, ) -> Result<(), ()>
Like [walk_prefixes] but continues past the target block into
children, finding ALL occurrences (e.g. multiple iterations of the
same checkpoint block in a loop).
fn walk_prefixes_impl<F>( node: &PathNode, path: &mut Vec<usize>, target_block: usize, continue_past_target: bool, f: &mut F, ) -> Result<(), ()>
Trait Implementations§
Auto Trait Implementations§
impl Freeze for PathTree
impl RefUnwindSafe for PathTree
impl Send for PathTree
impl Sync for PathTree
impl Unpin for PathTree
impl UnwindSafe for PathTree
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 more