1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.logging.log4j.core.util; 18 19 import java.util.Iterator; 20 import java.util.NoSuchElementException; 21 22 /** 23 * An {@link java.util.Iterator Iterator} over an array of objects. 24 * <p> 25 * This iterator does not support {@link #remove}, as the object array cannot be 26 * structurally modified. 27 * <p> 28 * The iterator implements a {@link #reset} method, allowing the reset of the iterator 29 * back to the start if required. 30 * 31 * @param <E> the type to iterate over 32 * @since 3.0 33 * @version $Id: ObjectArrayIterator.java 1734648 2016-03-11 23:51:22Z ggregory $ 34 */ 35 public class ObjectArrayIterator<E> implements /*Resettable*/ Iterator<E> { 36 37 /** The array */ 38 final E[] array; 39 /** The start index to loop from */ 40 final int startIndex; 41 /** The end index to loop to */ 42 final int endIndex; 43 /** The current iterator index */ 44 int index = 0; 45 46 //------------------------------------------------------------------------- 47 /** 48 * Constructs an ObjectArrayIterator that will iterate over the values in the 49 * specified array. 50 * 51 * @param array the array to iterate over 52 * @throws NullPointerException if <code>array</code> is <code>null</code> 53 */ 54 @SafeVarargs 55 public ObjectArrayIterator(final E... array) { 56 this(array, 0, array.length); 57 } 58 59 /** 60 * Constructs an ObjectArrayIterator that will iterate over the values in the 61 * specified array from a specific start index. 62 * 63 * @param array the array to iterate over 64 * @param start the index to start iterating at 65 * @throws NullPointerException if <code>array</code> is <code>null</code> 66 * @throws IndexOutOfBoundsException if the start index is out of bounds 67 */ 68 public ObjectArrayIterator(final E array[], final int start) { 69 this(array, start, array.length); 70 } 71 72 /** 73 * Construct an ObjectArrayIterator that will iterate over a range of values 74 * in the specified array. 75 * 76 * @param array the array to iterate over 77 * @param start the index to start iterating at 78 * @param end the index (exclusive) to finish iterating at 79 * @throws IndexOutOfBoundsException if the start or end index is out of bounds 80 * @throws IllegalArgumentException if end index is before the start 81 * @throws NullPointerException if <code>array</code> is <code>null</code> 82 */ 83 public ObjectArrayIterator(final E array[], final int start, final int end) { 84 super(); 85 if (start < 0) { 86 throw new ArrayIndexOutOfBoundsException("Start index must not be less than zero"); 87 } 88 if (end > array.length) { 89 throw new ArrayIndexOutOfBoundsException("End index must not be greater than the array length"); 90 } 91 if (start > array.length) { 92 throw new ArrayIndexOutOfBoundsException("Start index must not be greater than the array length"); 93 } 94 if (end < start) { 95 throw new IllegalArgumentException("End index must not be less than start index"); 96 } 97 this.array = array; 98 this.startIndex = start; 99 this.endIndex = end; 100 this.index = start; 101 } 102 103 // Iterator interface 104 //------------------------------------------------------------------------- 105 106 /** 107 * Returns true if there are more elements to return from the array. 108 * 109 * @return true if there is a next element to return 110 */ 111 @Override 112 public boolean hasNext() { 113 return this.index < this.endIndex; 114 } 115 116 /** 117 * Returns the next element in the array. 118 * 119 * @return the next element in the array 120 * @throws NoSuchElementException if all the elements in the array 121 * have already been returned 122 */ 123 @Override 124 public E next() { 125 if (hasNext() == false) { 126 throw new NoSuchElementException(); 127 } 128 return this.array[this.index++]; 129 } 130 131 /** 132 * Throws {@link UnsupportedOperationException}. 133 * 134 * @throws UnsupportedOperationException always 135 */ 136 @Override 137 public void remove() { 138 throw new UnsupportedOperationException("remove() method is not supported for an ObjectArrayIterator"); 139 } 140 141 // Properties 142 //------------------------------------------------------------------------- 143 144 /** 145 * Gets the array that this iterator is iterating over. 146 * 147 * @return the array this iterator iterates over 148 */ 149 public E[] getArray() { 150 return this.array; 151 } 152 153 /** 154 * Gets the start index to loop from. 155 * 156 * @return the start index 157 */ 158 public int getStartIndex() { 159 return this.startIndex; 160 } 161 162 /** 163 * Gets the end index to loop to. 164 * 165 * @return the end index 166 */ 167 public int getEndIndex() { 168 return this.endIndex; 169 } 170 171 /** 172 * Resets the iterator back to the start index. 173 */ 174 //@Override 175 public void reset() { 176 this.index = this.startIndex; 177 } 178 179 }