public LatticeQueryable(Lattice /*!*/ lattice, Lattice.Element /*!*/ element) { Contract.Requires(element != null); Contract.Requires(lattice != null); this.lattice = lattice; this.element = element; // base(); }
private Element /*!*/ Combine(Element /*!*/ first, ICombineNameMap /*?*/ firstToResult, Element /*!*/ second, ICombineNameMap /*?*/ secondToResult, CombineOp c) { Contract.Requires(second != null); Contract.Requires(first != null); Contract.Ensures(Contract.Result <Element>() != null); Elt a = (Elt)first; Elt b = (Elt)second; int unionCount = System.Math.Max(a.Count, b.Count); Elt combined = new Elt(unionCount, IsBottom(a) && IsBottom(b)); for (int i = 0; i < unionCount; i++) { bool thisExists = a.Contains(i); bool thatExists = b.Contains(i); if (thisExists && thatExists) { Lattice.Element suba = a[i]; Lattice.Element subb = b[i]; Contract.Assert(suba != null && subb != null); switch (c) { case CombineOp.Meet: combined[i] = SubLattice(i).Meet(suba, subb); break; case CombineOp.Join: if (firstToResult != null && secondToResult != null) { combined[i] = SubLattice(i).Join(suba, firstToResult, subb, secondToResult); } else { combined[i] = SubLattice(i).Join(suba, subb); } break; case CombineOp.Widen: if (firstToResult != null && secondToResult != null) { combined[i] = SubLattice(i).Widen(suba, firstToResult, subb, secondToResult); } else { combined[i] = SubLattice(i).Widen(suba, subb); } break; } } else if (thisExists) { combined[i] = a[i]; } else { combined[i] = b[i]; } } Debug.Assert(combined.IsValid); return(combined); }
public LatticeQueryable(Lattice/*!*/ lattice, Lattice.Element/*!*/ element) { Contract.Requires(element != null); Contract.Requires(lattice != null); this.lattice = lattice; this.element = element; // base(); }