public CompositeRange <T> Intersect <TKey2>(CompositeRange <T, TKey2> other) { if (IsEmpty) { return(this); } if (other.IsEmpty || !ContainingRange.HasIntersection(other.ContainingRange)) { return(Empty); } var intersectionResult = new List <Range <T> >(SubRanges.Count); var rangesToIntersect = new List <Range <T> >(SubRanges); foreach (var otherRange in other.GetMergedRanges()) { for (var i = 0; i < rangesToIntersect.Count; i++) { var intersectionRange = rangesToIntersect[i]; if (intersectionRange.StartsAfter(otherRange)) { break; } intersectionRange = intersectionRange.Intersect(otherRange); if (intersectionRange.IsEmpty) { rangesToIntersect.RemoveAt(i); i--; } else { intersectionResult.Add(intersectionRange); } } if (rangesToIntersect.Count == 0) { break; } } CompositeRange <T> result; if (intersectionResult.Count == 0) { result = Empty; } else { var overload = IsMerged ? UnsafeOverload.NoEmptyRangesAlreadySortedAndMerged : UnsafeOverload.RangesAlreadySorted; result = new CompositeRange <T>(intersectionResult, overload); } return(result); }
public bool HasIntersection <TKey2>(CompositeRange <T, TKey2> other) { if (IsEmpty && other.IsEmpty) { return(true); } if (!ContainingRange.HasIntersection(other.ContainingRange)) { return(false); } var result = false; using (var containingRanges = GetMergedRanges().GetEnumerator()) { var hasContainingRange = containingRanges.MoveNext(); foreach (var otherRange in other.GetMergedRanges()) { while (hasContainingRange && containingRanges.Current.EndsBefore(otherRange)) { hasContainingRange = containingRanges.MoveNext(); } if (!hasContainingRange || containingRanges.Current.HasIntersection(otherRange)) { result = hasContainingRange; break; } } } return(result); }
public RangeIntersection <T> GetIntersection <TKey2>(Range <T, TKey2> other) { var ranges = new List <Range <T> >(); if (!ContainingRange.HasIntersection(other)) { return (GetRangeIntersection( other.From, other.To, Array <Range <T> > .Empty)); } foreach (var range in SubRanges) { if (range.From > other.To) { break; } if (range.To >= other.From) { ranges.Add(range); } } return(GetRangeIntersection(other.From, other.To, ranges.ToArray())); }
public CompositeRange <T> Except <TKey2>(CompositeRange <T, TKey2> other) { if (IsEmpty || other.IsEmpty || !ContainingRange.HasIntersection(other.ContainingRange)) { return(this); } return(Intersect(other.GetComplementation())); }
public bool HasIntersection( #region T4-dont-replace Range <T> other #endregion ) => ContainingRange.HasIntersection(other) && SubRanges.Any(r => r.HasIntersection(other));
public CompositeRange <T> Except( #region T4-dont-replace CompositeRange <T> other #endregion ) { if (IsEmpty || other.IsEmpty || !ContainingRange.HasIntersection(other.ContainingRange)) { return(this); } return(Intersect(other.GetComplementation())); }
public bool HasIntersection <TKey2>(Range <T, TKey2> other) => ContainingRange.HasIntersection(other) && SubRanges.Any(r => r.HasIntersection(other));