package com.wrox.algorithms.iteration;

public class ArrayIterator implements Iterator {
    /** Tablica, po której iterator nawiguje */
    private final Object[] _array;

    /** Indeks pierwszego elementu wycinka */
    private final int _first;

    /* Indeks ostatniego elementu wycinka */
    private final int _last;

    /** Indeks bieżącego elementu */
    private int _current = -1;

    /**
     * Konstruktor specyfikujący wycinek tablicy
     * parametrami są: tablica, indeks pierwszego elementu i liczba elementów
    */

    public ArrayIterator(Object[] array, int start, int length) {
        assert array != null : "nie określono tablicy";
        assert start >= 0 : "ujemny indeks elementu początkowego";
        assert start < array.length : "indeks elementu początkowego poza tablicą";
        assert length >= 0 : "ujemna liczba elementów";

        _array = array;
        _first = start;
        _last = start + length - 1;

        assert _last < array.length : "wycinek wykracza poza tablicę";
    }

    /**
     * Konstruktor specyfikujący całą tablicę
     */

    public ArrayIterator(Object[] array) {
        assert array != null : "nie określono tablicy";
        _array = array;
        _first = 0;
        _last = array.length - 1;
    }

    public void first() {
        _current = _first;
    }

    public void last() {
        _current = _last;
    }
    

    public void next() {
        ++_current;
    }

    public void previous() {
        --_current;
    }


    public boolean isDone() {
        return _current < _first || _current > _last;
    }


    public Object current() throws IteratorOutOfBoundsException {
        if (isDone()) {
            throw new IteratorOutOfBoundsException();
        }
        return _array[_current];
    }


}
