/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024, 2026 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://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 fldReverse ? fldCurrentIndex > fldTargetIndex : fldCurrentIndex < fldTargetIndex; }
public Object nextElement() {
int current = fldCurrentIndex;
int target = fldTargetIndex;
if(current == target)
{
throw new NoSuchElementException(package.getResourceString("empty.enumeration"));
}
fldCurrentIndex = fldReverse ? current - 1 : current + 1;
return fldArray[current];
}
}