hashmap.vala \
hashset.vala \
iterable.vala \
+ mapiterator.vala \
iterator.vala \
list.vala \
map.vala \
return new ValueCollection<K,V> (this);
}
+ public override Vala.MapIterator<K,V> map_iterator () {
+ return new MapIterator<K,V> (this);
+ }
+
private Node<K,V>** lookup_node (K key) {
uint hash_value = _key_hash_func (key);
Node<K,V>** node = &_nodes[hash_value % _array_size];
}
}
+ private class MapIterator<K,V> : Vala.MapIterator<K, V> {
+ public HashMap<K,V> map {
+ set {
+ _map = value;
+ _stamp = _map._stamp;
+ }
+ }
+
+ private HashMap<K,V> _map;
+ private int _index = -1;
+ private weak Node<K,V> _node;
+
+ // concurrent modification protection
+ private int _stamp;
+
+ public MapIterator (HashMap map) {
+ this.map = map;
+ }
+
+ public override bool next () {
+ if (_node != null) {
+ _node = _node.next;
+ }
+ while (_node == null && _index + 1 < _map._array_size) {
+ _index++;
+ _node = _map._nodes[_index];
+ }
+ return (_node != null);
+ }
+
+ public override K? get_key () {
+ assert (_stamp == _map._stamp);
+ assert (_node != null);
+ return _node.key;
+ }
+
+ public override V? get_value () {
+ assert (_stamp == _map._stamp);
+ assert (_node != null);
+ return _node.value;
+ }
+ }
+
private class KeyIterator<K,V> : Iterator<K> {
public HashMap<K,V> map {
set {
* read-only collections.
*/
public abstract void clear ();
+
+ /**
+ * Returns a Iterator that can be used for simple iteration over a
+ * map.
+ *
+ * @return a Iterator that can be used for simple iteration over a
+ * map
+ */
+ public abstract MapIterator<K,V> map_iterator ();
}
--- /dev/null
+/* mapiterator.vala
+ *
+ * Copyright (C) 2011 Florian Brosch
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Florian Brosch <flo.brosch@gmail.com>
+ */
+
+
+
+/**
+ * An iterator over a map.
+ */
+public abstract class Vala.MapIterator<K,V> {
+ /**
+ * Advances to the next element in the iteration.
+ *
+ * @return true if the iterator has a next element
+ */
+ public abstract bool next ();
+
+ /**
+ * Returns the current key in the iteration.
+ *
+ * @return the current key in the iteration
+ */
+ public abstract K get_key ();
+
+ /**
+ * Returns the current value in the iteration.
+ *
+ * @return the current value in the iteration
+ */
+ public abstract V get_value ();
+}
+
+
+