diff options
| author | Max Horn | 2008-01-13 14:44:29 +0000 | 
|---|---|---|
| committer | Max Horn | 2008-01-13 14:44:29 +0000 | 
| commit | 79e1579cb3119a70677f7c7c158c5e7686b65f6d (patch) | |
| tree | 70928c5923c588cbe3b83249771f0f2b9b411850 | |
| parent | 9e5e73eb9a5deab58ff9f3128372bceaa6aacfbe (diff) | |
| download | scummvm-rg350-79e1579cb3119a70677f7c7c158c5e7686b65f6d.tar.gz scummvm-rg350-79e1579cb3119a70677f7c7c158c5e7686b65f6d.tar.bz2 scummvm-rg350-79e1579cb3119a70677f7c7c158c5e7686b65f6d.zip | |
Fix warnings HashMap causes on some compilers (notably, GCC 3.x used for various cross compilers)
svn-id: r30472
| -rw-r--r-- | common/hashmap.h | 93 | 
1 files changed, 78 insertions, 15 deletions
| diff --git a/common/hashmap.h b/common/hashmap.h index 579f0f9bfb..d5e2cdcaf3 100644 --- a/common/hashmap.h +++ b/common/hashmap.h @@ -116,18 +116,26 @@ public:  	int lookupAndCreateIfMissing(const Key &key);  	void expand_array(uint newsize); -	template <class NodeType> +	/** +	 * Simple HashMap iterator implementation. +	 */  	class Iterator { -		typedef const HashMap<Key, Val, HashFunc, EqualFunc> *hashmap_t; -		friend class HashMap<Key, Val, HashFunc, EqualFunc>; +	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; +		hashmap_t *_hashmap; +  	protected: -		Iterator(uint idx, hashmap_t hashmap) : _idx(idx), _hashmap(hashmap) {} +		Iterator(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {} -		NodeType *deref() const { +		Node *deref() const {  			assert(_hashmap != 0); -			NodeType *node = _hashmap->_arr[_idx]; +			Node *node = _hashmap->_arr[_idx];  			assert(node != 0);  			return node;  		} @@ -135,12 +143,8 @@ public:  	public:  		Iterator() : _idx(0), _hashmap(0) {} -		// HACK: to allow non const/const begin, end and find to work. -		friend class Iterator<const NodeType>; -		Iterator(const Iterator<Node> &iter) : _idx(iter._idx), _hashmap(iter._hashmap) {} - -		NodeType &operator *() const { return *deref(); } -		NodeType *operator->() const { return deref(); } +		Node &operator *() const { return *deref(); } +		Node *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); } @@ -163,9 +167,68 @@ public:  		}  	}; +	/** +	 * 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); +			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<Node> iterator; -	typedef Iterator<const Node> const_iterator; +	typedef Iterator iterator; +	typedef ConstIterator const_iterator;  	HashMap();  	HashMap(const HM_t& map); | 
