[vala] gee: Add MapIterator
- From: JÃrg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] gee: Add MapIterator
- Date: Thu, 26 Jan 2012 20:26:36 +0000 (UTC)
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]