コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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()));
        }
コード例 #4
0
        public CompositeRange <T> Except <TKey2>(CompositeRange <T, TKey2> other)
        {
            if (IsEmpty || other.IsEmpty || !ContainingRange.HasIntersection(other.ContainingRange))
            {
                return(this);
            }

            return(Intersect(other.GetComplementation()));
        }
コード例 #5
0
        public bool HasIntersection(

            #region T4-dont-replace
            Range <T> other
            #endregion

            ) =>
        ContainingRange.HasIntersection(other) &&
        SubRanges.Any(r => r.HasIntersection(other));
コード例 #6
0
        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()));
        }
コード例 #7
0
 public bool HasIntersection <TKey2>(Range <T, TKey2> other) =>
 ContainingRange.HasIntersection(other) &&
 SubRanges.Any(r => r.HasIntersection(other));