Commit 3d02f685 authored by Florian Brosch's avatar Florian Brosch Committed by Jürg Billeter

gee: Add MapIterator

parent 1c75deb3
......@@ -17,6 +17,7 @@ libgee_la_VALASOURCES = \
hashmap.vala \
hashset.vala \
iterable.vala \
mapiterator.vala \
iterator.vala \
list.vala \
map.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 {
......
......@@ -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 ();
}
/* 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 ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment