public int CompareTo(BinaryUnion other) { if (other == null) { return(1); } ISet <Expression> visitedExpressions = new HashSet <Expression>(); ISet <Expression> expression1 = UnionHelper.Iterate(visitedExpressions, Left.AsSequence().Concat(Right)).ToSortedSet(); visitedExpressions.Clear(); ISet <Expression> expression2 = UnionHelper.Iterate(visitedExpressions, other.Left.AsSequence().Concat(other.Right)).ToSortedSet(); return(expression1.SequenceCompare(expression2)); }
public bool Equals(Union other) { if (other == null) { return(false); } ISet <Expression> visitedExpressions = new HashSet <Expression>(); ISet <Expression> expression1 = UnionHelper.Iterate(visitedExpressions, Expressions).ToSortedSet(); visitedExpressions.Clear(); ISet <Expression> expression2 = UnionHelper.Iterate(visitedExpressions, other.Expressions).ToSortedSet(); return(expression1.SequenceEqual(expression2)); }
public int CompareTo(Union other) { if (other == null) { return(1); } ISet <Expression> visitedExpressions = new HashSet <Expression>(); ISet <Expression> expression1 = UnionHelper.Iterate(visitedExpressions, Expressions).ToSortedSet(); visitedExpressions.Clear(); ISet <Expression> expression2 = UnionHelper.Iterate(visitedExpressions, other.Expressions).ToSortedSet(); return(expression1.SequenceCompare(expression2)); }
public override Expression Optimize() { ISet <Expression> visitedExpressions = new HashSet <Expression>(); return(new Union(UnionHelper.Iterate(visitedExpressions, Left.AsSequence().Concat(Right))).Optimize()); }
internal override void ToString(StringBuilder builder) { ISet <Expression> visitedExpressions = new HashSet <Expression>(); UnionHelper.ToString(builder, UnionHelper.Iterate(visitedExpressions, Left.AsSequence().Concat(Right)).ToSortedSet().AsReadOnly(), Priority); }
public override Expression Optimize() { bool somethingChanged; ISet <Expression> visitedExpressions = new HashSet <Expression>(); ISet <Expression> set = UnionHelper.Iterate(visitedExpressions, Expressions.Select(e => e.Optimize())).ToHashSet(); do { somethingChanged = false; if (set.Any(e => e.CanBeEmpty())) { set = set.Select(e => e.TryToLetItBeEmpty().Optimize()).ToHashSet(); } if (set.Any(e => e != Empty.Instance && e.CanBeEmpty())) { set = set.Where(e => e != Empty.Instance).ToHashSet(); } IList <Expression> list = set.ToList(); for (int i = 0; i < list.Count; i++) { for (int j = 0; j < list.Count; j++) { if (i != j && IsASuperSetOfB(list[i], list[j])) { list.RemoveAt(j); j--; if (i > j) { i--; } somethingChanged = true; } } } for (int i = 0; i < list.Count; i++) { for (int j = 0; j < list.Count; j++) { if (i != j) { Expression expression = ExtractFromBrackets(list[i], list[j]); if (expression != null) { list.RemoveAt(j); if (i > j) { i--; } list.RemoveAt(i); list.Add(expression); j--; somethingChanged = true; } } } } set = list.ToHashSet(); } while (somethingChanged); return(UnionHelper.MakeExpression(set)); }