diff options
author | Florian Brosch <flo.brosch@gmail.com> | 2011-11-29 01:56:46 +0100 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2012-01-26 20:31:14 +0100 |
commit | 3d02f685bb8f602c4f63f150f27ad8672b712df1 (patch) | |
tree | 9d6800965cbfbe88a3025161683dbb7cbf5033a2 /gee | |
parent | 1c75deb3e89aad84820dcc801a6388003eb1dd23 (diff) | |
download | vala-3d02f685bb8f602c4f63f150f27ad8672b712df1.tar.gz |
gee: Add MapIterator
Diffstat (limited to 'gee')
-rw-r--r-- | gee/Makefile.am | 1 | ||||
-rw-r--r-- | gee/hashmap.vala | 47 | ||||
-rw-r--r-- | gee/map.vala | 9 | ||||
-rw-r--r-- | gee/mapiterator.vala | 52 |
4 files changed, 109 insertions, 0 deletions
diff --git a/gee/Makefile.am b/gee/Makefile.am index ab315657d..f9ac2fcdd 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 5159fe3ff..1fb2ed310 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 e78f794d4..2c96a3d04 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 000000000..78243c2d6 --- /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 (); +} + + + |