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);
}