pub struct CompTraversal { /* private fields */ }
Expand description
Define traversal order of components: pre-order, post-order, or none.
§No order
Iterates over the components in any order
§Post-order
If a component B
creates a cell of type A
then component A
is
guaranteed to be visited before B
.
This is done by finding a topological order over a graph where A
will
have a directed edge to B
.
Instead of constructing a new vector of components in a topological order,
the implementation builds an order
vector which contains indices into the
original component vector.
This way, we can return the components in the input order once we’re done
with the post order traversal.
§Pre-order
Reverse of post-order
§Example
let comps: Vec<ir::Component>;
// Construct a post order.
let post = PostOrder::new(comps, Order::Post);
// Apply a mutable update to components.
let upd: FnMut(&mut ir::Component) -> CalyxResult<()>;
post.apply_update(upd);
// Recover the components in original order.
let new_comps = post.take();
Implementations§
Source§impl CompTraversal
impl CompTraversal
Sourcepub fn new(comps: Vec<Component>, order: Order) -> Self
pub fn new(comps: Vec<Component>, order: Order) -> Self
Returns a new instance the PostOrder iterator given a Vector of components.
§Panics
Panics if there is no post-order traversal of the vectors possible.
Sourcepub fn apply_update<F>(&mut self, upd: F) -> CalyxResult<()>
pub fn apply_update<F>(&mut self, upd: F) -> CalyxResult<()>
Traverses components in post-order and applies upd
.
Auto Trait Implementations§
impl Freeze for CompTraversal
impl !RefUnwindSafe for CompTraversal
impl !Send for CompTraversal
impl !Sync for CompTraversal
impl Unpin for CompTraversal
impl !UnwindSafe for CompTraversal
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> 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