122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver/* 222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * Copyright 2012, Google Inc. 322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * All rights reserved. 422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * 522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * Redistribution and use in source and binary forms, with or without 622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * modification, are permitted provided that the following conditions are 722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * met: 822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * 922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * * Redistributions of source code must retain the above copyright 1022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * notice, this list of conditions and the following disclaimer. 1122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * * Redistributions in binary form must reproduce the above 1222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * copyright notice, this list of conditions and the following disclaimer 1322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * in the documentation and/or other materials provided with the 1422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * distribution. 1522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * * Neither the name of Google Inc. nor the names of its 1622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * contributors may be used to endorse or promote products derived from 1722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * this software without specific prior written permission. 1822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * 1922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver */ 3122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 3222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverpackage org.jf.dexlib2.dexbacked.util; 3322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 3484c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 3522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport org.jf.dexlib2.dexbacked.DexReader; 3622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 3722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport javax.annotation.Nonnull; 3822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport java.util.ListIterator; 3922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport java.util.NoSuchElementException; 4022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 4122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverpublic abstract class VariableSizeListIterator<T> implements ListIterator<T> { 4222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull private DexReader reader; 4322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver protected final int size; 4422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver private final int startOffset; 4522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 4622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver private int index; 4722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 4884c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver protected VariableSizeListIterator(@Nonnull DexBackedDexFile dexFile, int offset, int size) { 4984c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver this.reader = dexFile.readerAt(offset); 5022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver this.startOffset = offset; 5122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver this.size = size; 5222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 5322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 5422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver /** 5522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * Reads the next item from reader. 5622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * 5722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * @param reader The {@code DexReader} to read the next item from 5822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * @param index The index of the item being read. This is guaranteed to be less than {@code size} 5922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * @return The item that was read 6022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver */ 618c7400196703fd18d321e15c6d47ae15e7edb87cBen Gruver protected abstract T readNextItem(@Nonnull DexReader reader, int index); 6222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 6322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public int getReaderOffset() { 6422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return reader.getOffset(); 6522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 6622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 6722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override 6822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public boolean hasNext() { 6922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return index < size; 7022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 7122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 7222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override 7322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public T next() { 7422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver if (index >= size) { 7522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver throw new NoSuchElementException(); 7622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 7722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return readNextItem(reader, index++); 7822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 7922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 8022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override 8122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public boolean hasPrevious() { 8222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return index > 0; 8322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 8422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 8522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override 8622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public T previous() { 8722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver int targetIndex = index-1; 8822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver reader.setOffset(startOffset); 8922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver index = 0; 9022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver while (index < targetIndex) { 9122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver readNextItem(reader, index++); 9222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 9322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return readNextItem(reader, index++); 9422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 9522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 9622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override 9722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public int nextIndex() { 9822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return index; 9922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 10022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 10122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override 10222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public int previousIndex() { 10322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver return index - 1; 10422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 10522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver 10622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override public void remove() { throw new UnsupportedOperationException(); } 10722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override public void set(T t) { throw new UnsupportedOperationException(); } 10822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Override public void add(T t) { throw new UnsupportedOperationException(); } 10922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver} 110