ArrayEnumeration.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Реализация среды исполнения языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    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];
    }
}