blob: df51ad32942bb670a07bdf015a26da1b1e864239 [file] [log] [blame]
/*
// Licensed to Julian Hyde under one or more contributor license
// agreements. See the NOTICE file distributed with this work for
// additional information regarding copyright ownership.
//
// Julian Hyde 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 net.hydromatic.linq4j;
import java.io.Closeable;
/**
* Supports a simple iteration over a collection.
*
* <p>Analogous to LINQ's System.Collections.Enumerator. Unlike LINQ, if the
* underlying collection has been modified it is only optional that an
* implementation of the Enumerator interface detects it and throws a
* {@link java.util.ConcurrentModificationException}.</p>
*
* @param <T> element type
*/
public interface Enumerator<T> extends Closeable {
/**
* Gets the current element in the collection.
*
* <p>After an enumerator is created or after the {@link #reset} method is
* called, the {@link #moveNext} method must be called to advance the
* enumerator to the first element of the collection before reading the
* value of the {@code current} property; otherwise, {@code current} is
* undefined.</p>
*
* <p>This method also throws {@link java.util.NoSuchElementException} if
* the last call to {@code moveNext} returned {@code false}, which indicates
* the end of the collection.</p>
*
* <p>This method does not move the position of the enumerator, and
* consecutive calls to {@code current} return the same object until either
* {@code moveNext} or {@code reset} is called.</p>
*
* <p>An enumerator remains valid as long as the collection remains
* unchanged. If changes are made to the collection, such as adding,
* modifying, or deleting elements, the enumerator is irrecoverably
* invalidated. The next call to {@code moveNext} or {@code reset} may,
* at the discretion of the implementation, throw a
* {@link java.util.ConcurrentModificationException}. If the collection is
* modified between {@code moveNext} and {@code current}, {@code current}
* returns the element that it is set to, even if the enumerator is already
* invalidated.
*
* @return Current element
* @throws java.util.ConcurrentModificationException
* if collection has
* been modified
* @throws java.util.NoSuchElementException
* if {@code moveToNext} has not
* been called, has not been called since the most recent call to
* {@code reset}, or returned false
*/
T current();
/**
* Advances the enumerator to the next element of the collection.
*
* <p>After an enumerator is created or after the {@code reset} method is
* called, an enumerator is positioned before the first element of the
* collection, and the first call to the {@code moveNext} method moves the
* enumerator over the first element of the collection.</p>
*
* <p>If {@code moveNext} passes the end of the collection, the enumerator
* is positioned after the last element in the collection and
* {@code moveNext} returns {@code false}. When the enumerator is at this
* position, subsequent calls to {@code moveNext} also return {@code false}
* until {@code #reset} is called.</p>
*
* <p>An enumerator remains valid as long as the collection remains
* unchanged. If changes are made to the collection, such as adding,
* modifying, or deleting elements, the enumerator is irrecoverably
* invalidated. The next call to {@code moveNext} or {@link #reset} may,
* at the discretion of the implementation, throw a
* {@link java.util.ConcurrentModificationException}.</p>
*
* @return {@code true} if the enumerator was successfully advanced to the
* next element; {@code false} if the enumerator has passed the end of
* the collection
*/
boolean moveNext();
/**
* Sets the enumerator to its initial position, which is before the first
* element in the collection.
*
* <p>An enumerator remains valid as long as the collection remains
* unchanged. If changes are made to the collection, such as adding,
* modifying, or deleting elements, the enumerator is irrecoverably
* invalidated. The next call to {@link #moveNext} or {@code reset} may,
* at the discretion of the implementation, throw a
* {@link java.util.ConcurrentModificationException}.</p>
*
* <p>This method is optional; it may throw
* {@link UnsupportedOperationException}.</p>
*
* <h3>Notes to Implementers</h3>
*
* <p>All calls to Reset must result in the same state for the enumerator.
* The preferred implementation is to move the enumerator to the beginning
* of the collection, before the first element. This invalidates the
* enumerator if the collection has been modified since the enumerator was
* created, which is consistent with {@link #moveNext()} and
* {@link #current()}.</p>
*/
void reset();
/**
* Closes this enumerable and releases resources.
*
* <p>This method is idempotent. Calling it multiple times has the same effect
* as calling it once.</p>
*/
void close();
}
// End Enumerator.java