[Scummvm-cvs-logs] SF.net SVN: scummvm: [31356] scummvm/trunk/common/hashmap.h

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Wed Apr 2 04:01:31 CEST 2008


Revision: 31356
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31356&view=rev
Author:   lordhoto
Date:     2008-04-01 19:01:31 -0700 (Tue, 01 Apr 2008)

Log Message:
-----------
Committed patch #1929274 "HashMap: Iterator rework".

Modified Paths:
--------------
    scummvm/trunk/common/hashmap.h

Modified: scummvm/trunk/common/hashmap.h
===================================================================
--- scummvm/trunk/common/hashmap.h	2008-04-01 18:35:14 UTC (rev 31355)
+++ scummvm/trunk/common/hashmap.h	2008-04-02 02:01:31 UTC (rev 31356)
@@ -150,29 +150,25 @@
 	int lookupAndCreateIfMissing(const Key &key);
 	void expand_array(uint newsize);
 
-	class Iterator;
-	class ConstIterator;
-	friend class Iterator;
-	friend class ConstIterator;
+	template<class T> friend class IteratorImpl;
 
 	/**
 	 * Simple HashMap iterator implementation.
 	 */
-	class Iterator {
+	template<class NodeType>
+	class IteratorImpl {
+		friend class HashMap;
+		template<class T> friend class IteratorImpl;
 	protected:
 		typedef const HashMap hashmap_t;
-		friend class HashMap;
 
-		// Allow ConstIterator to read member vars, so that Iterators can be converted to ConstIterator
-		friend class HashMap::ConstIterator;
-
 		uint _idx;
 		hashmap_t *_hashmap;
 
 	protected:
-		Iterator(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {}
+		IteratorImpl(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {}
 
-		Node *deref() const {
+		NodeType *deref() const {
 			assert(_hashmap != 0);
 			assert(_idx < _hashmap->_arrsize);
 			Node *node = _hashmap->_arr[_idx];
@@ -181,15 +177,17 @@
 		}
 
 	public:
-		Iterator() : _idx(0), _hashmap(0) {}
+		IteratorImpl() : _idx(0), _hashmap(0) {}
+		template<class T>
+		IteratorImpl(const IteratorImpl<T> &c) : _idx(c._idx), _hashmap(c._hashmap) {}
 
-		Node &operator *() const { return *deref(); }
-		Node *operator->() const { return deref(); }
+		NodeType &operator *() const { return *deref(); }
+		NodeType *operator->() const { return deref(); }
 
-		bool operator ==(const Iterator &iter) const { return _idx == iter._idx && _hashmap == iter._hashmap; }
-		bool operator !=(const Iterator &iter) const { return !(*this == iter); }
+		bool operator ==(const IteratorImpl &iter) const { return _idx == iter._idx && _hashmap == iter._hashmap; }
+		bool operator !=(const IteratorImpl &iter) const { return !(*this == iter); }
 
-		Iterator &operator ++() {
+		IteratorImpl &operator ++() {
 			assert(_hashmap);
 			do {
 				_idx++;
@@ -200,76 +198,16 @@
 			return *this;
 		}
 
-		Iterator operator ++(int) {
-			Iterator old = *this;
+		IteratorImpl operator ++(int) {
+			IteratorImpl old = *this;
 			operator ++();
 			return old;
 		}
 	};
 
-	/**
-	 * Simple HashMap const iterator implementation.
-	 * This is almost completely identical to the normal iterator class, only
-	 * with some const keywords added here and there, plus a conversion
-	 * operator which makes it possible to transparently convert iterators to
-	 * const iterators.
-	 * It is sadly not really possible to reduce this code duplication using
-	 * template, unless one is willing to accept various warnings on certain
-	 * compilers. Note that many (most? all?) implementations of the standard
-	 * C++ library use a similar approach for their implementations.
-	 */
-	class ConstIterator {
-	protected:
-		typedef const HashMap hashmap_t;
-		friend class HashMap;
-
-		uint _idx;
-		hashmap_t *_hashmap;
-
-	protected:
-		ConstIterator(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {}
-
-		const Node *deref() const {
-			assert(_hashmap != 0);
-			assert(_idx < _hashmap->_arrsize);
-			const Node *node = _hashmap->_arr[_idx];
-			assert(node != 0);
-			return node;
-		}
-
-	public:
-		ConstIterator() : _idx(0), _hashmap(0) {}
-
-		// Converting a non-const iterator to a const one is allowed
-		ConstIterator(const Iterator &iter) : _idx(iter._idx), _hashmap(iter._hashmap) {}
-
-		const Node &operator *() const { return *deref(); }
-		const Node *operator->() const { return deref(); }
-
-		bool operator ==(const ConstIterator &iter) const { return _idx == iter._idx && _hashmap == iter._hashmap; }
-		bool operator !=(const ConstIterator &iter) const { return !(*this == iter); }
-
-		ConstIterator &operator ++() {
-			assert(_hashmap);
-			do {
-				_idx++;
-			} while (_idx < _hashmap->_arrsize && _hashmap->_arr[_idx] == 0);
-			if (_idx >= _hashmap->_arrsize)
-				_idx = (uint)-1;
-
-			return *this;
-		}
-
-		ConstIterator operator ++(int) {
-			ConstIterator old = *this;
-			operator ++();
-			return old;
-		}
-	};
-
 public:
-	typedef Iterator iterator;
-	typedef ConstIterator const_iterator;
+	typedef IteratorImpl<Node> iterator;
+	typedef IteratorImpl<const Node> const_iterator;
 
 	HashMap();
 	HashMap(const HM_t& map);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list