/*
Исходный код среды исполнения ПВТ-ОО.
Этот исходный код является частью проекта ПВТ-ОО.
Copyright © 2021 Малик Разработчик
Это свободная программа: вы можете перераспространять её и/или
изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она может быть полезна,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<http://www.gnu.org/licenses/>.
*/
package avt.util;
public class ArrayEnumeration(Enumeration)
{
private int fldCurrentIndex;
private final boolean fldReverse;
private final int fldTargetIndex;
private final Object[] fldArray;
public (Object[] array) {
fldCurrentIndex = 0;
fldReverse = false;
fldTargetIndex = array == null ? 0 : array.length;
fldArray = array;
}
public (Object[] array, boolean reverse) {
int length = array == null ? 0 : array.length;
fldCurrentIndex = reverse ? length - 1 : 0;
fldReverse = reverse;
fldTargetIndex = reverse ? -1 : length;
fldArray = array;
}
public (Object[] array, int offset, int length) {
int2 bounds = array == null ? 0 : Array.intersectBounds(array, offset, length);
offset = bounds[0];
length = bounds[1];
fldCurrentIndex = offset;
fldReverse = false;
fldTargetIndex = offset + length;
fldArray = array;
}
public (Object[] array, int offset, int length, boolean reverse) {
int2 bounds = array == null ? 0 : Array.intersectBounds(array, offset, length);
offset = bounds[0];
length = bounds[1];
fldCurrentIndex = reverse ? offset + length - 1 : offset;
fldReverse = reverse;
fldTargetIndex = reverse ? offset - 1 : offset + length;
fldArray = array;
}
public boolean hasMoreElements() { return fldCurrentIndex != fldTargetIndex; }
public Object nextElement() {
int target = fldTargetIndex;
int current = fldCurrentIndex;
if(current == target) return super.nextElement();
Object result = fldArray[current];
fldCurrentIndex = fldReverse ? current - 1 : current + 1;
return result;
}
}