Struct bytecode::dataflow_domains::SetDomain
source · pub struct SetDomain<E: Ord + Clone>(_);
Expand description
Implements a set domain.
Implementations§
source§impl SetDomain<Addr>
impl SetDomain<Addr>
sourcepub fn footprint(ap: AccessPath) -> Self
pub fn footprint(ap: AccessPath) -> Self
Create a footprint address from access path ap
sourcepub fn formal(formal_index: TempIndex, func_env: &FunctionEnv<'_>) -> Self
pub fn formal(formal_index: TempIndex, func_env: &FunctionEnv<'_>) -> Self
Create a footprint address read from formal temp_index
sourcepub fn is_constant(&self) -> bool
pub fn is_constant(&self) -> bool
Return true
if self
is a constant
sourcepub fn is_statically_known(&self) -> bool
pub fn is_statically_known(&self) -> bool
Return true
if self
consists only of statically known constants
sourcepub fn substitute_footprint(
&mut self,
actuals: &[TempIndex],
type_actuals: &[Type],
func_env: &FunctionEnv<'_>,
sub_map: &dyn AccessPathMap<AbsAddr>
)
pub fn substitute_footprint( &mut self, actuals: &[TempIndex], type_actuals: &[Type], func_env: &FunctionEnv<'_>, sub_map: &dyn AccessPathMap<AbsAddr> )
Substitute all occurences of Footprint(ap) in self
by resolving the accesss path
ap
in sub_map
sourcepub fn add_struct_offset(
self,
mid: &ModuleId,
sid: StructId,
types: Vec<Type>
) -> Self
pub fn add_struct_offset( self, mid: &ModuleId, sid: StructId, types: Vec<Type> ) -> Self
Return a new abstract address by adding the offset mid::sid<types>
to each element
of self
sourcepub fn add_offset(&self, offset: Offset) -> Self
pub fn add_offset(&self, offset: Offset) -> Self
Return a new abstract address by adding the offset offset
to each element of self
sourcepub fn prepend(self, prefix: AccessPath) -> Self
pub fn prepend(self, prefix: AccessPath) -> Self
Produce a new version of self
with prefix
prepended to each footprint
value
sourcepub fn footprint_paths(&self) -> impl Iterator<Item = &AccessPath>
pub fn footprint_paths(&self) -> impl Iterator<Item = &AccessPath>
return an iterator over the footprint paths in self
sourcepub fn get_concrete_addresses(&self) -> Vec<AccountAddress> ⓘ
pub fn get_concrete_addresses(&self) -> Vec<AccountAddress> ⓘ
Return an iterator over the concrete addresses in self
sourcepub fn display<'a>(&'a self, env: &'a FunctionEnv<'_>) -> AbsAddrDisplay<'a>
pub fn display<'a>(&'a self, env: &'a FunctionEnv<'_>) -> AbsAddrDisplay<'a>
Return a wrapper of self
that implements Display
using env
source§impl<E: Ord + Clone> SetDomain<E>
impl<E: Ord + Clone> SetDomain<E>
pub fn singleton(e: E) -> Self
sourcepub fn difference<'a>(&'a self, other: &'a Self) -> impl Iterator<Item = &'a E>
pub fn difference<'a>(&'a self, other: &'a Self) -> impl Iterator<Item = &'a E>
Implements set difference, which is not following standard APIs for rust sets in OrdSet
sourcepub fn is_disjoint(&self, other: &Self) -> bool
pub fn is_disjoint(&self, other: &Self) -> bool
Implements is_disjoint which is not available in OrdSet
Methods from Deref<Target = OrdSet<E>>§
pub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Test whether a set is empty.
Time: O(1)
Examples
assert!(
!ordset![1, 2, 3].is_empty()
);
assert!(
OrdSet::<i32>::new().is_empty()
);
pub fn ptr_eq(&self, other: &OrdSet<A>) -> bool
pub fn ptr_eq(&self, other: &OrdSet<A>) -> bool
Test whether two sets refer to the same content in memory.
This is true if the two sides are references to the same set, or if the two sets refer to the same root node.
This would return true if you’re comparing a set to itself, or if you’re comparing a set to a fresh clone of itself.
Time: O(1)
pub fn get_min(&self) -> Option<&A>
pub fn get_min(&self) -> Option<&A>
Get the smallest value in a set.
If the set is empty, returns None
.
Time: O(log n)
pub fn get_max(&self) -> Option<&A>
pub fn get_max(&self) -> Option<&A>
Get the largest value in a set.
If the set is empty, returns None
.
Time: O(log n)
pub fn iter(&self) -> Iter<'_, A>
pub fn iter(&self) -> Iter<'_, A>
Create an iterator over the contents of the set.
pub fn range<R, BA>(&self, range: R) -> RangedIter<'_, A>where
R: RangeBounds<BA>,
A: Borrow<BA>,
BA: Ord + ?Sized,
pub fn range<R, BA>(&self, range: R) -> RangedIter<'_, A>where R: RangeBounds<BA>, A: Borrow<BA>, BA: Ord + ?Sized,
Create an iterator over a range inside the set.
pub fn diff<'a>(&'a self, other: &'a OrdSet<A>) -> DiffIter<'a, A>
pub fn diff<'a>(&'a self, other: &'a OrdSet<A>) -> DiffIter<'a, A>
Get an iterator over the differences between this set and another, i.e. the set of entries to add or remove to this set in order to make it equal to the other set.
This function will avoid visiting nodes which are shared between the two sets, meaning that even very large sets can be compared quickly if most of their structure is shared.
Time: O(n) (where n is the number of unique elements across the two sets, minus the number of elements belonging to nodes shared between them)
pub fn contains<BA>(&self, a: &BA) -> boolwhere
BA: Ord + ?Sized,
A: Borrow<BA>,
pub fn contains<BA>(&self, a: &BA) -> boolwhere BA: Ord + ?Sized, A: Borrow<BA>,
Test if a value is part of a set.
Time: O(log n)
Examples
let mut set = ordset!{1, 2, 3};
assert!(set.contains(&1));
assert!(!set.contains(&4));
pub fn get_prev(&self, key: &A) -> Option<&A>
pub fn get_prev(&self, key: &A) -> Option<&A>
Get the closest smaller value in a set to a given value.
If the set contains the given value, this is returned.
Otherwise, the closest value in the set smaller than the
given value is returned. If the smallest value in the set
is larger than the given value, None
is returned.
Examples
let set = ordset![1, 3, 5, 7, 9];
assert_eq!(Some(&5), set.get_prev(&6));
pub fn get_next(&self, key: &A) -> Option<&A>
pub fn get_next(&self, key: &A) -> Option<&A>
Get the closest larger value in a set to a given value.
If the set contains the given value, this is returned.
Otherwise, the closest value in the set larger than the
given value is returned. If the largest value in the set
is smaller than the given value, None
is returned.
Examples
let set = ordset![1, 3, 5, 7, 9];
assert_eq!(Some(&5), set.get_next(&4));
pub fn is_subset<RS>(&self, other: RS) -> boolwhere
RS: Borrow<OrdSet<A>>,
pub fn is_subset<RS>(&self, other: RS) -> boolwhere RS: Borrow<OrdSet<A>>,
Test whether a set is a subset of another set, meaning that all values in our set must also be in the other set.
Time: O(n log m) where m is the size of the other set
pub fn is_proper_subset<RS>(&self, other: RS) -> boolwhere
RS: Borrow<OrdSet<A>>,
pub fn is_proper_subset<RS>(&self, other: RS) -> boolwhere RS: Borrow<OrdSet<A>>,
Test whether a set is a proper subset of another set, meaning that all values in our set must also be in the other set. A proper subset must also be smaller than the other set.
Time: O(n log m) where m is the size of the other set
pub fn insert(&mut self, a: A) -> Option<A>
pub fn insert(&mut self, a: A) -> Option<A>
Insert a value into a set.
Time: O(log n)
Examples
let mut set = ordset!{};
set.insert(123);
set.insert(456);
assert_eq!(
set,
ordset![123, 456]
);
pub fn remove<BA>(&mut self, a: &BA) -> Option<A>where
BA: Ord + ?Sized,
A: Borrow<BA>,
pub fn remove<BA>(&mut self, a: &BA) -> Option<A>where BA: Ord + ?Sized, A: Borrow<BA>,
Remove a value from a set.
Time: O(log n)
pub fn remove_min(&mut self) -> Option<A>
pub fn remove_min(&mut self) -> Option<A>
Remove the smallest value from a set.
Time: O(log n)
pub fn remove_max(&mut self) -> Option<A>
pub fn remove_max(&mut self) -> Option<A>
Remove the largest value from a set.
Time: O(log n)
pub fn update(&self, a: A) -> OrdSet<A>
pub fn update(&self, a: A) -> OrdSet<A>
Construct a new set from the current set with the given value added.
Time: O(log n)
Examples
let set = ordset![456];
assert_eq!(
set.update(123),
ordset![123, 456]
);
pub fn without<BA>(&self, a: &BA) -> OrdSet<A>where
BA: Ord + ?Sized,
A: Borrow<BA>,
pub fn without<BA>(&self, a: &BA) -> OrdSet<A>where BA: Ord + ?Sized, A: Borrow<BA>,
Construct a new set with the given value removed if it’s in the set.
Time: O(log n)
pub fn without_min(&self) -> (Option<A>, OrdSet<A>)
pub fn without_min(&self) -> (Option<A>, OrdSet<A>)
Remove the smallest value from a set, and return that value as well as the updated set.
Time: O(log n)
pub fn without_max(&self) -> (Option<A>, OrdSet<A>)
pub fn without_max(&self) -> (Option<A>, OrdSet<A>)
Remove the largest value from a set, and return that value as well as the updated set.
Time: O(log n)
Trait Implementations§
source§impl<E: Ord + Clone> AbstractDomain for SetDomain<E>
impl<E: Ord + Clone> AbstractDomain for SetDomain<E>
fn join(&mut self, other: &Self) -> JoinResult
source§impl<E: Ord + Clone> FromIterator<E> for SetDomain<E>
impl<E: Ord + Clone> FromIterator<E> for SetDomain<E>
source§fn from_iter<I: IntoIterator<Item = E>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = E>>(iter: I) -> Self
source§impl<E: Ord + Ord + Clone> Ord for SetDomain<E>
impl<E: Ord + Ord + Clone> Ord for SetDomain<E>
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere Self: Sized,
source§impl<E: PartialEq + Ord + Clone> PartialEq<SetDomain<E>> for SetDomain<E>
impl<E: PartialEq + Ord + Clone> PartialEq<SetDomain<E>> for SetDomain<E>
source§impl<E: PartialOrd + Ord + Clone> PartialOrd<SetDomain<E>> for SetDomain<E>
impl<E: PartialOrd + Ord + Clone> PartialOrd<SetDomain<E>> for SetDomain<E>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moreimpl<E: Eq + Ord + Clone> Eq for SetDomain<E>
impl<E: Ord + Clone> StructuralEq for SetDomain<E>
impl<E: Ord + Clone> StructuralPartialEq for SetDomain<E>
Auto Trait Implementations§
impl<E> RefUnwindSafe for SetDomain<E>where E: RefUnwindSafe,
impl<E> Send for SetDomain<E>where E: Send + Sync,
impl<E> Sync for SetDomain<E>where E: Send + Sync,
impl<E> Unpin for SetDomain<E>where E: Unpin,
impl<E> UnwindSafe for SetDomain<E>where E: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.