/* 
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package java.text;

/**
 * An interface for the bidirectional iteration over a group of characters. The
 * iteration starts at the begin index in the group of characters and continues
 * to one index before the end index.
 */
public interface CharacterIterator extends Cloneable {

    /**
     * A constant which indicates that there is no character at the current
     * index.
     */
    public static final char DONE = '\uffff';

    /**
     * Returns a new {@code CharacterIterator} with the same properties.
     * 
     * @return a shallow copy of this character iterator.
     * 
     * @see java.lang.Cloneable
     */
    public Object clone();

    /**
     * Returns the character at the current index.
     * 
     * @return the current character, or {@code DONE} if the current index is
     *         past the beginning or end of the sequence.
     */
    public char current();

    /**
     * Sets the current position to the begin index and returns the character at
     * the new position.
     * 
     * @return the character at the begin index.
     */
    public char first();

    /**
     * Returns the begin index.
     * 
     * @return the index of the first character of the iteration.
     */
    public int getBeginIndex();

    /**
     * Returns the end index.
     * 
     * @return the index one past the last character of the iteration.
     */
    public int getEndIndex();

    /**
     * Returns the current index.
     * 
     * @return the current index.
     */
    public int getIndex();

    /**
     * Sets the current position to the end index - 1 and returns the character
     * at the new position.
     * 
     * @return the character before the end index.
     */
    public char last();

    /**
     * Increments the current index and returns the character at the new index.
     * 
     * @return the character at the next index, or {@code DONE} if the next
     *         index would be past the end.
     */
    public char next();

    /**
     * Decrements the current index and returns the character at the new index.
     * 
     * @return the character at the previous index, or {@code DONE} if the
     *         previous index would be past the beginning.
     */
    public char previous();

    /**
     * Sets the current index to a new position and returns the character at the
     * new index.
     * 
     * @param location
     *            the new index that this character iterator is set to.
     * @return the character at the new index, or {@code DONE} if the index is
     *         past the end.
     * @throws IllegalArgumentException
     *         if {@code location} is less than the begin index or greater than
     *         the end index.
     */
    public char setIndex(int location);
}
