1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// GenericsNote: Converted.
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/*
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Copyright 2003-2004 The Apache Software Foundation
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Licensed under the Apache License, Version 2.0 (the "License");
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  you may not use this file except in compliance with the License.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  You may obtain a copy of the License at
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *      http://www.apache.org/licenses/LICENSE-2.0
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Unless required by applicable law or agreed to in writing, software
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  distributed under the License is distributed on an "AS IS" BASIS,
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  See the License for the specific language governing permissions and
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  limitations under the License.
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smack.util.collections;
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator;
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Defines an iterator that operates over a <code>Map</code>.
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p/>
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * This iterator is a special version designed for maps. It can be more
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * efficient to use this rather than an entry set iterator where the option
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * is available, and it is certainly more convenient.
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p/>
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A map that provides this interface may not hold the data internally using
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Map Entry objects, thus this interface can avoid lots of object creation.
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p/>
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * In use, this iterator iterates through the keys in the map. After each call
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * to <code>next()</code>, the <code>getValue()</code> method provides direct
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * access to the value. The value can also be set using <code>setValue()</code>.
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <pre>
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * MapIterator it = map.mapIterator();
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * while (it.hasNext()) {
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *   Object key = it.next();
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *   Object value = it.getValue();
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *   it.setValue(newValue);
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * }
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * </pre>
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Matt Hall, John Watkinson, Stephen Colebourne
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @version $Revision: 1.1 $ $Date: 2005/10/11 17:05:19 $
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @since Commons Collections 3.0
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic interface MapIterator <K,V> extends Iterator<K> {
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Checks to see if there are more entries still to be iterated.
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return <code>true</code> if the iterator has more elements
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    boolean hasNext();
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Gets the next <em>key</em> from the <code>Map</code>.
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the next key in the iteration
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws java.util.NoSuchElementException
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *          if the iteration is finished
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    K next();
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    //-----------------------------------------------------------------------
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Gets the current key, which is the key returned by the last call
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * to <code>next()</code>.
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the current key
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws IllegalStateException if <code>next()</code> has not yet been called
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    K getKey();
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Gets the current value, which is the value associated with the last key
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * returned by <code>next()</code>.
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the current value
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws IllegalStateException if <code>next()</code> has not yet been called
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    V getValue();
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    //-----------------------------------------------------------------------
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Removes the last returned key from the underlying <code>Map</code> (optional operation).
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p/>
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * This method can be called once per call to <code>next()</code>.
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws UnsupportedOperationException if remove is not supported by the map
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws IllegalStateException         if <code>next()</code> has not yet been called
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws IllegalStateException         if <code>remove()</code> has already been called
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *                                       since the last call to <code>next()</code>
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    void remove();
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the value associated with the current key (optional operation).
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param value the new value
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the previous value
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws UnsupportedOperationException if setValue is not supported by the map
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws IllegalStateException         if <code>next()</code> has not yet been called
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws IllegalStateException         if <code>remove()</code> has been called since the
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *                                       last call to <code>next()</code>
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    V setValue(V value);
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
110