112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver/* 212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * Copyright 2012, Google Inc. 312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * All rights reserved. 412b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * 512b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * Redistribution and use in source and binary forms, with or without 612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * modification, are permitted provided that the following conditions are 712b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * met: 812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * 912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * * Redistributions of source code must retain the above copyright 1012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * notice, this list of conditions and the following disclaimer. 1112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * * Redistributions in binary form must reproduce the above 1212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * copyright notice, this list of conditions and the following disclaimer 1312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * in the documentation and/or other materials provided with the 1412b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * distribution. 1512b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * * Neither the name of Google Inc. nor the names of its 1612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * contributors may be used to endorse or promote products derived from 1712b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * this software without specific prior written permission. 1812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * 1912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2412b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2512b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2712b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver */ 3112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 3212b970ed4dfad768002335503e49c348ea0ed69bBen Gruverpackage org.jf.dexlib2.dexbacked.util; 3312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 3484c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 3512b970ed4dfad768002335503e49c348ea0ed69bBen Gruverimport org.jf.dexlib2.dexbacked.DexReader; 3612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 3712b970ed4dfad768002335503e49c348ea0ed69bBen Gruverimport javax.annotation.Nonnull; 3812b970ed4dfad768002335503e49c348ea0ed69bBen Gruverimport java.util.Iterator; 3912b970ed4dfad768002335503e49c348ea0ed69bBen Gruverimport java.util.NoSuchElementException; 4012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 4112b970ed4dfad768002335503e49c348ea0ed69bBen Gruverpublic abstract class VariableSizeIterator<T> implements Iterator<T> { 4212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver @Nonnull private final DexReader reader; 4312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver protected final int size; 4412b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 4512b970ed4dfad768002335503e49c348ea0ed69bBen Gruver private int index; 4612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 4784c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver protected VariableSizeIterator(@Nonnull DexBackedDexFile dexFile, int offset, int size) { 4884c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver this.reader = dexFile.readerAt(offset); 4912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver this.size = size; 5012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver } 5112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 520acc897cddb531d60bc61f5a5cbc872e40b4df58Ben Gruver protected VariableSizeIterator(@Nonnull DexReader reader, int size) { 530acc897cddb531d60bc61f5a5cbc872e40b4df58Ben Gruver this.reader = reader; 540acc897cddb531d60bc61f5a5cbc872e40b4df58Ben Gruver this.size = size; 550acc897cddb531d60bc61f5a5cbc872e40b4df58Ben Gruver } 560acc897cddb531d60bc61f5a5cbc872e40b4df58Ben Gruver 5712b970ed4dfad768002335503e49c348ea0ed69bBen Gruver /** 5812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * Reads the next item from reader. 5912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * 6012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * @param reader The {@code DexReader} to read the next item from 6112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * @param index The index of the item being read. This is guaranteed to be less than {@code size} 6212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver * @return The item that was read 6312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver */ 640acc897cddb531d60bc61f5a5cbc872e40b4df58Ben Gruver protected abstract T readNextItem(@Nonnull DexReader reader, int index); 6512b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 6612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver public int getReaderOffset() { 6712b970ed4dfad768002335503e49c348ea0ed69bBen Gruver return reader.getOffset(); 6812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver } 6912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 7012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver @Override 7112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver public boolean hasNext() { 7212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver return index < size; 7312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver } 7412b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 7512b970ed4dfad768002335503e49c348ea0ed69bBen Gruver @Override 7612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver public T next() { 7712b970ed4dfad768002335503e49c348ea0ed69bBen Gruver if (index >= size) { 7812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver throw new NoSuchElementException(); 7912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver } 8012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver return readNextItem(reader, index++); 8112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver } 8212b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 8312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver @Override public void remove() { throw new UnsupportedOperationException(); } 8412b970ed4dfad768002335503e49c348ea0ed69bBen Gruver} 85