@Override public Object getAnnotation(int location, String key) { Preconditions.checkElementIndex(location, size()); checkKeyNotNull(key); Values values = ranges.performActionAt(location, finder).getValue(); return values == null ? null : values.get(key); }
@Override public int firstAnnotationChange(int start, int end, String key, Object fromValue) { Preconditions.checkPositionIndexes(start, end, size()); checkKeyNotNull(key); start = Math.max(0, start); end = Math.min(end, ranges.size()); OffsetPoint<Values> point = ranges.performActionAt(start, finder); OffsetList.Container<Values> container = point.getContainer(); int offset = point.getOffset(); int location = start; while (location < end) { if (!eq(getValue(container, key), fromValue)) { return location; } if (container == ranges.sentinel()) { break; } location += container.size() - offset; container = container.getNextContainer(); offset = 0; } return -1; }
@Override public int lastAnnotationChange(int start, int end, String key, Object fromValue) { Preconditions.checkPositionIndexes(start, end, size()); checkKeyNotNull(key); start = Math.max(0, start); end = Math.min(end, ranges.size()); OffsetPoint<Values> point = ranges.performActionAt(end, finder); OffsetList.Container<Values> container = point.getContainer(); int offset = point.getOffset(); if (offset == 0) { container = container.getPreviousContainer(); offset = container == ranges.sentinel() ? 0 : container.size(); } int location = end; while (location > start) { if (!eq(getValue(container, key), fromValue)) { return location; } if (container == null) { break; } location -= offset; container = container.getPreviousContainer(); offset = container == ranges.sentinel() ? 0 : container.size(); } return -1; }