@Override public Range getIndexRange(final int startOffset, final int endOffset) { // we assume that start/end is within our range int baseOffset = getStartOffset(); if (startOffset > getEndOffset() || endOffset < baseOffset) { throw new IllegalArgumentException("getIndexRange(" + startOffset + ", " + endOffset + ") not in range [" + baseOffset + ", " + getEndOffset() + "]"); } return Range.of(startOffset - baseOffset, endOffset - baseOffset); }
@Override public BasedSequence spliceAtEnd(BasedSequence other) { if (other.isEmpty()) { return this; } else if (isEmpty()) { return other; } assert isContinuedBy(other) : "sequence[" + getStartOffset() + ", " + getEndOffset() + "] is not continued by other[" + other.getStartOffset() + ", " + other.getEndOffset() + "]"; return baseSubSequence(getStartOffset(), other.getEndOffset()); }
@Override public BasedSequence prefixOf(final BasedSequence other) { if (getBase() != other.getBase()) return SubSequence.NULL; else if (other.getStartOffset() <= getStartOffset()) return subSequence(0, 0); else if (other.getStartOffset() >= getEndOffset()) return this; else return this.baseSubSequence(getStartOffset(), other.getStartOffset()); }
@Override public boolean isContinuationOf(BasedSequence other) { return other.length() > 0 && length() > 0 && other.getBase() == getBase() && other.getEndOffset() == getStartOffset(); }
@Override public boolean containsSomeOf(BasedSequence other) { return getBase() == other.getBase() && !(getStartOffset() >= other.getEndOffset() || getEndOffset() <= other.getStartOffset()); }
@Override public boolean containsAllOf(BasedSequence other) { return getBase() == other.getBase() && other.getStartOffset() >= getStartOffset() && other.getEndOffset() <= getEndOffset(); }
@Override public BasedSequence intersect(BasedSequence other) { if (getBase() != other.getBase()) return SubSequence.NULL; else if (other.getEndOffset() <= getStartOffset()) return subSequence(0, 0); else if (other.getStartOffset() >= getEndOffset()) return subSequence(length(), length()); else return this.baseSubSequence(Utils.max(getStartOffset(), other.getStartOffset()), Utils.min(getEndOffset(), other.getEndOffset())); }
@Override public BasedSequence suffixOf(final BasedSequence other) { if (getBase() != other.getBase()) return SubSequence.NULL; else if (other.getEndOffset() >= getEndOffset()) return subSequence(length(), length()); else if (other.getEndOffset() <= getStartOffset()) return this; else return this.baseSubSequence(other.getEndOffset(), getEndOffset()); }
@Override public Range getIndexRange(final int startOffset, final int endOffset) { // we assume that start/end is within our range int baseOffset = getStartOffset(); if (startOffset > getEndOffset() || endOffset < baseOffset) { throw new IllegalArgumentException("getIndexRange(" + startOffset + ", " + endOffset + ") not in range [" + baseOffset + ", " + getEndOffset() + "]"); } return Range.of(startOffset - baseOffset, endOffset - baseOffset); }
@Override public BasedSequence spliceAtEnd(BasedSequence other) { if (other.isEmpty()) { return this; } else if (isEmpty()) { return other; } assert isContinuedBy(other) : "sequence[" + getStartOffset() + ", " + getEndOffset() + "] is not continued by other[" + other.getStartOffset() + ", " + other.getEndOffset() + "]"; return baseSubSequence(getStartOffset(), other.getEndOffset()); }
@Override public BasedSequence prefixOf(final BasedSequence other) { if (getBase() != other.getBase()) return SubSequence.NULL; else if (other.getStartOffset() <= getStartOffset()) return subSequence(0, 0); else if (other.getStartOffset() >= getEndOffset()) return this; else return this.baseSubSequence(getStartOffset(), other.getStartOffset()); }
@Override public boolean containsSomeOf(BasedSequence other) { return getBase() == other.getBase() && !(getStartOffset() >= other.getEndOffset() || getEndOffset() <= other.getStartOffset()); }
@Override public boolean isContinuationOf(BasedSequence other) { return other.length() > 0 && length() > 0 && other.getBase() == getBase() && other.getEndOffset() == getStartOffset(); }
@Override public boolean containsAllOf(BasedSequence other) { return getBase() == other.getBase() && other.getStartOffset() >= getStartOffset() && other.getEndOffset() <= getEndOffset(); }
@Override public BasedSequence intersect(BasedSequence other) { if (getBase() != other.getBase()) return SubSequence.NULL; else if (other.getEndOffset() <= getStartOffset()) return subSequence(0, 0); else if (other.getStartOffset() >= getEndOffset()) return subSequence(length(), length()); else return this.baseSubSequence(Utils.max(getStartOffset(), other.getStartOffset()), Utils.min(getEndOffset(), other.getEndOffset())); }
@Override public BasedSequence suffixOf(final BasedSequence other) { if (getBase() != other.getBase()) return SubSequence.NULL; else if (other.getEndOffset() >= getEndOffset()) return subSequence(length(), length()); else if (other.getEndOffset() <= getStartOffset()) return this; else return this.baseSubSequence(other.getEndOffset(), getEndOffset()); }