[vala] gee: Add MapIterator



commit 3d02f685bb8f602c4f63f150f27ad8672b712df1
Author: Florian Brosch <flo brosch gmail com>
Date:   Tue Nov 29 01:56:46 2011 +0100

    gee: Add MapIterator

 gee/Makefile.am      |    1 +
 gee/hashmap.vala     |   47 +++++++++++++++++++++++++++++++++++++++++++++
 gee/map.vala         |    9 ++++++++
 gee/mapiterator.vala |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 109 insertions(+), 0 deletions(-)
---
diff --git a/gee/Makefile.am b/gee/Makefile.am
index ab31565..f9ac2fc 100644
--- a/gee/Makefile.am
+++ b/gee/Makefile.am
@@ -17,6 +17,7 @@ libgee_la_VALASOURCES = \
 	hashmap.vala \
 	hashset.vala \
 	iterable.vala \
+	mapiterator.vala \
 	iterator.vala \
 	list.vala \
 	map.vala \
diff --git a/gee/hashmap.vala b/gee/hashmap.vala
index 5159fe3..1fb2ed3 100644
--- a/gee/hashmap.vala
+++ b/gee/hashmap.vala
@@ -74,6 +74,10 @@ public class Vala.HashMap<K,V> : Map<K,V> {
 		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];
@@ -224,6 +228,49 @@ public class Vala.HashMap<K,V> : Map<K,V> {
 		}
 	}
 
+	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 {
diff --git a/gee/map.vala b/gee/map.vala
index e78f794..2c96a3d 100644
--- a/gee/map.vala
+++ b/gee/map.vala
@@ -84,5 +84,14 @@ public abstract class Vala.Map<K,V> {
 	 * 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 ();
 }
 
diff --git a/gee/mapiterator.vala b/gee/mapiterator.vala
new file mode 100644
index 0000000..78243c2
--- /dev/null
+++ b/gee/mapiterator.vala
@@ -0,0 +1,52 @@
+/* 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 ();
+}
+
+
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]