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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Fri Mar 24 06:33:45 CET 2006


Revision: 21428
Author:   fingolfin
Date:     2006-03-24 06:30:33 -0800 (Fri, 24 Mar 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21428&view=rev

Log Message:
-----------
Cleanup for the AssocArray template: int->book, put common code into a new lookup() method, and some other tweaks

Modified Paths:
--------------
    scummvm/trunk/common/assocarray.h
Modified: scummvm/trunk/common/assocarray.h
===================================================================
--- scummvm/trunk/common/assocarray.h	2006-03-24 14:17:47 UTC (rev 21427)
+++ scummvm/trunk/common/assocarray.h	2006-03-24 14:30:33 UTC (rev 21428)
@@ -100,33 +100,33 @@
 template <class Key, class Val>
 class AssocArray {
 private:
-	aa_ref_t <Key, Val> **_arr;	// hashtable of size arrsize.
+	aa_ref_t<Key, Val> **_arr;	// hashtable of size arrsize.
 	Val _default_value;
 	int _arrsize, _nele;
 
-	inline void expand_array(void);
-	inline Val &subscript_helper(Key &index);	// like [], but never expands array
+	int lookup(const Key &index) const;
+	void expand_array(void);
 
-	inline int nele_val(void) const { return _nele; }
+	int nele_val(void) const { return _nele; }
 
 public:
 
-	inline Val &operator [](const Key &index);
-//	inline AssocArray(Val default_value = Val());
-	inline AssocArray(Val default_value);
-	inline ~AssocArray();
-	inline int contains(const Key &index) const;
-	inline Key *new_all_keys(void) const;
-	inline Val *new_all_values(void) const;
-	inline Val queryVal(const Key &index) const;
-	inline void clear(int shrinkArray = 0);
+	Val &operator [](const Key &index);
+//	AssocArray(Val default_value = Val());
+	AssocArray(Val default_value);
+	~AssocArray();
+	bool contains(const Key &index) const;
+	Key *new_all_keys(void) const;
+	Val *new_all_values(void) const;
+	Val queryVal(const Key &index) const;
+	void clear(bool shrinkArray = 0);
 };
 
 //-------------------------------------------------------
 // AssocArray functions
 
 template <class Key, class Val>
-inline int AssocArray <Key, Val>::contains(const Key &index) const {
+int AssocArray<Key, Val>::lookup(const Key &index) const {
 	int ctr;
 
 	ctr = hashit(index, _arrsize);
@@ -138,14 +138,18 @@
 			ctr = 0;
 	}
 
-	if (_arr[ctr] == NULL)
-		return 0;
-	else
-		return 1;
+	return ctr;
 }
 
 template <class Key, class Val>
-inline Key *AssocArray <Key, Val>::new_all_keys(void) const {
+bool AssocArray<Key, Val>::contains(const Key &index) const {
+	int ctr = lookup(index);
+
+	return (_arr[ctr] != NULL);
+}
+
+template <class Key, class Val>
+Key *AssocArray<Key, Val>::new_all_keys(void) const {
 	Key *all_keys;
 	int ctr, dex;
 
@@ -171,7 +175,7 @@
 }
 
 template <class Key, class Val>
-inline Val *AssocArray <Key, Val>::new_all_values(void) const {
+Val *AssocArray<Key, Val>::new_all_values(void) const {
 	Val *all_values;
 	int ctr, dex;
 
@@ -198,7 +202,7 @@
 }
 
 template <class Key, class Val>
-inline AssocArray <Key, Val>::AssocArray(Val default_value) : _default_value(default_value) {
+AssocArray<Key, Val>::AssocArray(Val default_value) : _default_value(default_value) {
 	int ctr;
 
 	_arr = new aa_ref_t <Key, Val> *[INIT_SIZE];
@@ -213,7 +217,7 @@
 }
 
 template <class Key, class Val>
-inline AssocArray <Key, Val>::~AssocArray() {
+AssocArray<Key, Val>::~AssocArray() {
 	int ctr;
 
 	for (ctr = 0; ctr < _arrsize; ctr++)
@@ -224,7 +228,7 @@
 }
 
 template <class Key, class Val>
-inline void AssocArray <Key, Val>::clear(int shrinkArray) {
+void AssocArray<Key, Val>::clear(bool shrinkArray) {
 	for (int ctr = 0; ctr < _arrsize; ctr++) {
 		if (_arr[ctr] != NULL) {
 			delete _arr[ctr];
@@ -232,7 +236,6 @@
 		}
 	}
 
-	shrinkArray = 0;
 	if (shrinkArray && _arrsize > INIT_SIZE) {
 		delete _arr;
 
@@ -246,11 +249,8 @@
 	_nele = 0;
 }
 
-static int is_odd(int x) {return x&1;}
-static int is_even(int x) {return !is_odd(x);}
-
 template <class Key, class Val>
-inline void AssocArray <Key, Val>::expand_array(void) {
+void AssocArray<Key, Val>::expand_array(void) {
 	aa_ref_t <Key, Val> **old_arr;
 	int old_arrsize, old_nele, ctr, dex;
 
@@ -262,8 +262,8 @@
 	// allocate a new array 
 	_arrsize = 153 * old_arrsize / 100;
 
-	if (is_even(_arrsize))
-		_arrsize++;
+	// Ensure that _arrsize is odd.
+	_arrsize |= 1;
 
 	_arr = new aa_ref_t <Key, Val> *[_arrsize];
 
@@ -297,47 +297,10 @@
 	return;
 }
 
-// like [], but never expands array.
-// Precond: index is a key that is already in the hash table.
 template <class Key, class Val>
-inline Val &AssocArray <Key, Val>::subscript_helper(Key &index) {
-	int ctr;
+Val &AssocArray<Key, Val>::operator [](const Key &index) {
+	int ctr = lookup(index);
 
-	ctr = hashit(index, _arrsize);
-
-	while (_arr[ctr] != NULL && !data_eq(_arr[ctr]->index, index)) {
-		ctr++;
-
-		if (ctr == _arrsize)
-			ctr = 0;
-	}
-
-//  if (_arr[ctr] == NULL)
-//      {
-//      _arr[ctr] = new aa_ref_t<Val,Key>;
-//      _arr[ctr]->index = index;
-//      _arr[ctr]->dat = _default_value;
-//      _nele++;
-//      }
-
-	assert(_arr[ctr] != NULL);
-
-	return _arr[ctr]->dat;
-}
-
-template <class Key, class Val>
-inline Val &AssocArray <Key, Val>::operator [](const Key &index) {
-	int ctr;
-
-	ctr = hashit(index, _arrsize);
-
-	while (_arr[ctr] != NULL && !data_eq(_arr[ctr]->index, index)) {
-		ctr++;
-
-		if (ctr == _arrsize)
-			ctr = 0;
-	}
-
 	if (_arr[ctr] == NULL) {
 		_arr[ctr] = new aa_ref_t <Key, Val>;
 		_arr[ctr]->index = index;
@@ -357,18 +320,9 @@
 }
 
 template <class Key, class Val>
-inline Val AssocArray <Key, Val>::queryVal(const Key &index) const {
-	int ctr;
+Val AssocArray<Key, Val>::queryVal(const Key &index) const {
+	int ctr = lookup(index);
 
-	ctr = hashit(index, _arrsize);
-
-	while (_arr[ctr] != NULL && !data_eq(_arr[ctr]->index, index)) {
-		ctr++;
-
-		if (ctr == _arrsize)
-			ctr = 0;
-	}
-
 	if (_arr[ctr] == NULL)
 		return _default_value;
 	else


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