ArrayEnumeration.avt

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

/*
    Исходный код среды исполнения ПВТ-ОО.

    Этот исходный код является частью проекта ПВТ-ОО.

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