private static RS deoverlapSorted()

in accord-core/src/main/java/accord/primitives/AbstractRanges.java [756:824]


    private static <RS extends AbstractRanges> RS deoverlapSorted(Function<Range[], RS> constructor, Range[] ranges, int count, UnionMode mode, boolean copyOnWrite)
    {
        if (count == 0)
            return constructor.apply(NO_RANGES);

        if (count == 1)
        {
            if (ranges.length == 1)
                return constructor.apply(ranges);

            return constructor.apply(Arrays.copyOf(ranges, count));
        }

        Range prev = ranges[0];
        Range[] out = null;
        int removed = 0;
        int compareTo = mode == UnionMode.MERGE_OVERLAPPING ? 1 : 0;
        for (int i = 1 ; i < count ; ++i)
        {
            Range next = ranges[i];
            if (prev.end().compareTo(next.start()) >= compareTo)
            {
                RoutingKey end = max(prev.end(), next.end());
                boolean copy = removed == 0;
                ++removed;
                while (++i < count && end.compareTo((next = ranges[i]).start()) >= compareTo)
                {
                    end = max(end, next.end());
                    ++removed;
                }

                if (copy)
                {
                    if (i == count && end == prev.end())
                        break;

                    if (copyOnWrite)
                    {
                        out = new Range[count - removed];
                        System.arraycopy(ranges, 0, out, 0, i - removed);
                    }
                    else
                    {
                        out = ranges;
                    }
                }

                if (end != prev.end())
                {
                    prev = prev.newRange(prev.start(), end);
                    out[i - (1 + removed)] = prev;
                }

                if (i < count)
                    out[i - removed] = prev = next;
                continue;
            }

            if (removed > 0)
                out[i - removed] = next;
            prev = next;
        }

        if (out == null) out = ranges;
        count -= removed;
        if (count != out.length)
            out = Arrays.copyOf(out, count);
        return constructor.apply(out);
    }