001/*
002 *  Copyright 2001-2010 Stephen Colebourne
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.joda.primitives.listiterator.impl;
017
018import java.util.NoSuchElementException;
019
020import org.joda.primitives.CharUtils;
021import org.joda.primitives.listiterator.CharListIterator;
022
023/**
024 * An iterator over an array of <code>char</code> values.
025 * <p>
026 * This class implements {@link java.util.ListIterator ListIterator} allowing
027 * seamless integration with other APIs.
028 * <p>
029 * The iterator can be reset to the start if required.
030 * <code>add()</code> and <code>remove()</code> are unsupported, but
031 * <code>set()</code> is supported.
032 *
033 * @author Stephen Colebourne
034 * @author Jason Tiscione
035 * @version CODE GENERATED
036 * @since 1.0
037 */
038public class ArrayCharListIterator implements CharListIterator {
039    // This file is CODE GENERATED. Do not change manually.
040
041    /** The array to iterate over */
042    protected final char[] array;
043    /** Cursor position */
044    protected int cursor = 0;
045    /** Last returned position */
046    protected int last = -1;
047
048    /**
049     * Creates an iterator over a copy of an array of <code>char</code> values.
050     * <p>
051     * The specified array is copied, ensuring the original data is unaltered.
052     * Note that the class is not immutable due to the {@code set} methods.
053     * 
054     * @param array  the array to iterate over, must not be null
055     * @throws IllegalArgumentException if the array is null
056     */
057    public static ArrayCharListIterator copyOf(char[] array) {
058        if (array == null) {
059            throw new IllegalArgumentException("Array must not be null");
060        }
061        return new ArrayCharListIterator(array.clone());
062    }
063
064    /**
065     * Constructs an iterator over an array of <code>char</code> values.
066     * <p>
067     * The array is assigned internally, thus the caller holds a reference to
068     * the internal state of the returned iterator. It is not recommended to
069     * modify the state of the array after construction.
070     * 
071     * @param array  the array to iterate over, must not be null
072     * @throws IllegalArgumentException if the array is null
073     */
074    public ArrayCharListIterator(char[] array) {
075        super();
076        if (array == null) {
077            throw new IllegalArgumentException("Array must not be null");
078        }
079        this.array = array;
080    }
081
082    //-----------------------------------------------------------------------
083    public boolean isModifiable() {
084        return true;
085    }
086
087    public boolean isResettable() {
088        return true;
089    }
090
091    //-----------------------------------------------------------------------
092    public boolean hasNext() {
093        return (cursor < array.length);
094    }
095
096    public int nextIndex() {
097        return cursor;
098    }
099
100    public char nextChar() {
101        if (hasNext() == false) {
102            throw new NoSuchElementException("No more elements available");
103        }
104        last = cursor;
105        return array[cursor++];
106    }
107
108    public Character next() {
109        return CharUtils.toObject(nextChar());
110    }
111
112    public boolean hasPrevious() {
113        return (cursor > 0);
114    }
115
116    public int previousIndex() {
117        return cursor - 1;
118    }
119
120    public char previousChar() {
121        if (hasPrevious() == false) {
122            throw new NoSuchElementException("No more elements available");
123        }
124        last = --cursor;
125        return array[cursor];
126    }
127
128    public Character previous() {
129        return CharUtils.toObject(previousChar());
130    }
131
132    public void add(char value) {
133        throw new UnsupportedOperationException("ArrayCharListIterator does not support add");
134    }
135
136    public void add(Character value) {
137        throw new UnsupportedOperationException("ArrayCharListIterator does not support add");
138    }
139
140    public void remove() {
141        throw new UnsupportedOperationException("ArrayCharListIterator does not support remove");
142    }
143
144    public void set(char value) {
145        if (last < 0) {
146            throw new IllegalStateException("ArrayCharListIterator cannot be set until next is called");
147        }
148        array[last] = value;
149    }
150
151    public void set(Character value) {
152        set(CharUtils.toPrimitive(value));
153    }
154
155    public void reset() {
156        cursor = 0;
157        last = -1;
158    }
159
160}