protected MatchNumber(MatchNumber copy) : base(copy) { Op = copy.Op; Value = copy.Value; Value2 = copy.Value2; Min = copy.Min; Max = copy.Max; }
public bool Subsets(Match match) { if (Priority != match.Priority) { return(false); } MatchNumber number = match as MatchNumber; // Non-equality operator cannot be subsetted. if (Op == Operator.NotEqual || number.Op == Operator.NotEqual) { return(false); } return(Value >= number.Value && Value2 <= number.Value2); }
// Overriden due to more restrictive conditions. public override bool CanMerge(Match match) { if (!base.CanMerge(match)) { return(false); } MatchNumber number = match as MatchNumber; // Non-equality operators are not mergeable. if (Op == Operator.NotEqual || number.Op == Operator.NotEqual) { return(false); } // This match subsets, is subsetted by match, or complements match. return(Subsets(match) || number.Subsets(this) || Complements(match)); }
public bool Complements(Match match) { // The different priorities cannot complement each other (e.g. "Quality" cannot complement "ItemLevel" and vice versa). if (Priority != match.Priority) { return(false); } MatchNumber number = match as MatchNumber; // Non-equality operator cannot complement anything. if (Op == Operator.NotEqual || number.Op == Operator.NotEqual) { return(false); } // Complements from left or right. // XXX: Don't have to take operator into account at all, due to conversion of all operators into Between ranges in constructor. return(Value2 + 1 == number.Value || Value == number.Value2 + 1); }
public void Merge(Match match) { MatchNumber number = match as MatchNumber; if (Complements(number)) { // Complements from left. if (Value2 + 1 == number.Value) { Value2 = number.Value2; } else // Value 1 == number.Value2 + 1 { Value = number.Value; } } else // If we subset the match. if (Subsets(number)) { Op = number.Op; Value = number.Value; Value2 = number.Value2; } // Otherwise match subsets us, nothing to do. }