@Override
public ComparableCharSequence subSequence(final int start, final int end) {
if (parts.length == 1) {
return new ComparableCharSequenceWrapper(parts[0].subSequence(start, end));
}
if (start == end) {
if (start <= length()) {
return ComparableCharSequenceWrapper.EMPTY_SEQUENCE;
} else {
throw new ArrayIndexOutOfBoundsException(start);
}
}
final PartInfo partInfoStart = getPartInfoForCharIndex(start);
final PartInfo partInfoEnd = getPartInfoForCharIndex(end - 1);
if (partInfoStart.partIndex == partInfoEnd.partIndex) {
return new ComparableCharSequenceWrapper(
parts[partInfoStart.partIndex]
.subSequence(start - partInfoStart.globalStart, end - partInfoStart.globalStart));
}
final CharSequence[] resParts = new CharSequence[partInfoEnd.partIndex - partInfoStart.partIndex + 1];
resParts[0] = parts[partInfoStart.partIndex]
.subSequence(start - partInfoStart.globalStart, parts[partInfoStart.partIndex].length());
for (int i = partInfoStart.partIndex + 1, j = 1; i < partInfoEnd.partIndex; i++) {
resParts[j++] = parts[i];
}
resParts[resParts.length - 1] = parts[partInfoEnd.partIndex].subSequence(0, end - partInfoEnd.globalStart);
return new CompoundCharSequence(null, resParts);
}