pub struct SymbolicStore<A, N> { /* private fields */ }Expand description
Statement-ordered symbolic state used while constructing SLT values.
Each clone is a cheap branch version: the fixed-size page table, its pages, and every range remain shared until a definition mutates them. This gives conditional evaluation SSA-like snapshot semantics while preserving the map-shaped API expected by the frontend.
Implementations§
Source§impl<A, N> SymbolicStore<A, N>
impl<A, N> SymbolicStore<A, N>
Source§impl<A: Eq + Hash, N> SymbolicStore<A, N>
impl<A: Eq + Hash, N> SymbolicStore<A, N>
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
pub fn reserve(&mut self, additional: usize)
pub fn contains_key(&self, key: &A) -> bool
pub fn get( &self, key: &A, ) -> Option<&RangeStore<Option<(N, FxHashSet<VarAtomBase<A>>)>>>
pub fn insert( &mut self, key: A, value: RangeStore<Option<(N, FxHashSet<VarAtomBase<A>>)>>, ) -> Option<Arc<RangeStore<Option<(N, FxHashSet<VarAtomBase<A>>)>>>>
pub fn remove( &mut self, key: &A, ) -> Option<Arc<RangeStore<Option<(N, FxHashSet<VarAtomBase<A>>)>>>>
pub fn iter(&self) -> Iter<'_, A, N>
pub fn values(&self) -> Values<'_, A, N>
pub fn keys(&self) -> Keys<'_, A, N>
pub fn extend<I>(&mut self, values: I)where
A: Clone,
N: Clone,
I: IntoIterator<Item = (A, RangeStore<Option<(N, FxHashSet<VarAtomBase<A>>)>>)>,
Whether two branch versions still refer to the same definition for a key.
A shared entry can bypass a deep RangeStore comparison during phi construction, which is the common case for untouched variables.
Sourcepub fn differing_keys<'a>(
&'a self,
other: &'a Self,
) -> impl Iterator<Item = &'a A>
pub fn differing_keys<'a>( &'a self, other: &'a Self, ) -> impl Iterator<Item = &'a A>
Keys whose symbolic definitions differ between two branch versions.
Entire shared pages are skipped without visiting their keys. Within a copied page, entries that still share the same range version are also skipped. The returned sparse iterator is therefore the only set that can require phi construction. Keys are borrowed directly from their store version, so walking a diff does not allocate or clone addresses.
Source§impl<A: Clone + Eq + Hash, N: Clone> SymbolicStore<A, N>
impl<A: Clone + Eq + Hash, N: Clone> SymbolicStore<A, N>
pub fn clone_entry_from(&mut self, key: &A, source: &Self) -> bool
pub fn entry(&mut self, key: A) -> Entry<'_, A, N>
pub fn get_mut( &mut self, key: &A, ) -> Option<&mut RangeStore<Option<(N, FxHashSet<VarAtomBase<A>>)>>>
pub fn values_mut(&mut self) -> ValuesMut<'_, A, N>
Trait Implementations§
Source§impl<A: Clone, N: Clone> Clone for SymbolicStore<A, N>
impl<A: Clone, N: Clone> Clone for SymbolicStore<A, N>
Source§fn clone(&self) -> SymbolicStore<A, N>
fn clone(&self) -> SymbolicStore<A, N>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more