/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.javascript.typedarrays;

import java.util.ListIterator;
import java.util.NoSuchElementException;

public class NativeTypedArrayIterator<T>
    implements ListIterator<T>
{
    private final NativeTypedArrayView<T> view;

    /** Position represents the position of the NEXT element */
    private int position;
    private int lastPosition = -1;

    NativeTypedArrayIterator(NativeTypedArrayView<T> view, int start)
    {
        this.view = view;
        this.position = start;
    }

    @Override
    public boolean hasNext()
    {
        return (position < view.length);
    }

    @Override
    public boolean hasPrevious()
    {
        return (position > 0);
    }

    @Override
    public int nextIndex()
    {
        return position;
    }

    @Override
    public int previousIndex()
    {
        return position - 1;
    }

    @Override
    public T next()
    {
        if (hasNext()) {
            T ret = (T)view.get(position);
            lastPosition = position;
            position++;
            return ret;
        }
        throw new NoSuchElementException();
    }

    @Override
    public T previous()
    {
        if (hasPrevious()) {
            position--;
            lastPosition = position;
            return (T)view.get(position);
        }
        throw new NoSuchElementException();
    }

    @Override
    public void set(T t)
    {
        if (lastPosition < 0) {
            throw new IllegalStateException();
        }
        view.js_set(lastPosition, t);
    }

    @Override
    public void remove()
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public void add(T t)
    {
        throw new UnsupportedOperationException();
    }
}
