public SetDomain <T> Join(SetDomain <T> newState, out bool weaker, bool widen) { if (set == newState.set) { weaker = false; return(this); } if (this.IsBottom) { weaker = !newState.IsBottom; return(newState); } if (newState.IsBottom || this.IsTop) { weaker = false; return(this); } if (newState.IsTop) { weaker = !this.IsTop; return(newState); } Contract.Assert(set != null); IFunctionalSet <T> result = set.Intersect(newState.set); weaker = result.Count < set.Count; return(new SetDomain <T>(result)); }
public Domain Join(Domain newState, out bool weaker) { IFunctionalSet <SymbolicValue> result = this.NonNullValues.Intersect(newState.NonNullValues); weaker = result.Count < this.NonNullValues.Count; return(new Domain(result)); }
public Domain ConstrainEqual(SymbolicValue target, SymbolicValue source) { if (NonNullValues.Contains(source)) { NonNullValues = NonNullValues.Add(target); } return(this); }
public Domain Rename(IFunctionalMap <SymbolicValue, SymbolicValue> substitution) { foreach (SymbolicValue v in NonNullValues.Elements) { if (substitution.Contains(v)) { NonNullValues = NonNullValues.Remove(v).Add(substitution[v]); } } return(this); }
public SetDomain <T> Meet(SetDomain <T> that) { if (set == that.set) { return(this); } if (this.IsBottom || that.IsTop) { return(this); } if (that.IsBottom || this.IsTop) { return(that); } Contract.Assert(set != null); IFunctionalSet <T> result = set.Union(that.set); return(new SetDomain <T>(result)); }
public SetDomain(Converter <T, int> keyNumber) { set = FunctionalSet <T> .Empty(keyNumber); }
public SetDomain(IFunctionalSet <T> /*?*/ value) { set = value; }
/// <summary> /// Returns a set of definitely null variables and a set of definitely non-null variables /// </summary> public IFunctionalSet NullVariableSet(out IFunctionalSet nonNullResult) { ISymValue nullSym = this.Null; IFunctionalSet nullSet = FunctionalSet.Empty; IFunctionalSet nonNullSet = FunctionalSet.Empty; foreach (IUniqueKey key in this.egraph.Constants) { Variable v = key as Variable; if (v == null) continue; if (v is StackVariable) continue; ISymValue varSym = Value(v); if (varSym == nullSym) { nullSet = nullSet.Add(v); continue; } if (IsNonNull(varSym)) { nonNullSet = nonNullSet.Add(v); } } nonNullResult = nonNullSet; return nullSet; }
private Domain(IFunctionalSet <SymbolicValue> underlying) { this.NonNullValues = underlying; }