pub trait GenKill<T> {
// Required methods
fn gen_(&mut self, elem: T);
fn kill(&mut self, elem: T);
// Provided methods
fn gen_all(&mut self, elems: impl IntoIterator<Item = T>) { ... }
fn kill_all(&mut self, elems: impl IntoIterator<Item = T>) { ... }
}
Expand description
The legal operations for a transfer function in a gen/kill problem.
This abstraction exists because there are two different contexts in which we call the methods in
GenKillAnalysis
. Sometimes we need to store a single transfer function that can be efficiently
applied multiple times, such as when computing the cumulative transfer function for each block.
These cases require a GenKillSet
, which in turn requires two BitSet
s of storage. Oftentimes,
however, we only need to apply an effect once. In these cases, it is more efficient to pass the
BitSet
representing the state vector directly into the *_effect
methods as opposed to
building up a GenKillSet
and then throwing it away.
Required Methods§
Provided Methods§
sourcefn gen_all(&mut self, elems: impl IntoIterator<Item = T>)
fn gen_all(&mut self, elems: impl IntoIterator<Item = T>)
Calls gen
for each element in elems
.
sourcefn kill_all(&mut self, elems: impl IntoIterator<Item = T>)
fn kill_all(&mut self, elems: impl IntoIterator<Item = T>)
Calls kill
for each element in elems
.