COMMON: HashMap::getVal now allows specifying a default value.

A new variant of HashMap::getVal with a second 'default value' parameter
has been added. This helps avoid many contains() + getVal() combos
(which incur double lookup penalty), and is much lighter than using
find() (which has to create an iterator).

svn-id: r43983
This commit is contained in:
Max Horn 2009-09-06 12:59:07 +00:00
parent b51e9988e6
commit ae16d496b9
2 changed files with 25 additions and 1 deletions

View file

@ -220,6 +220,7 @@ public:
Val &getVal(const Key &key);
const Val &getVal(const Key &key) const;
const Val &getVal(const Key &key, const Val &defaultVal) const;
void setVal(const Key &key, const Val &val);
void clear(bool shrinkArray = 0);
@ -555,11 +556,16 @@ Val &HashMap<Key, Val, HashFunc, EqualFunc>::getVal(const Key &key) {
template<class Key, class Val, class HashFunc, class EqualFunc>
const Val &HashMap<Key, Val, HashFunc, EqualFunc>::getVal(const Key &key) const {
return getVal(key, _defaultVal);
}
template<class Key, class Val, class HashFunc, class EqualFunc>
const Val &HashMap<Key, Val, HashFunc, EqualFunc>::getVal(const Key &key, const Val &defaultVal) const {
uint ctr = lookup(key);
if (_storage[ctr] != NULL)
return _storage[ctr]->_value;
else
return _defaultVal;
return defaultVal;
}
template<class Key, class Val, class HashFunc, class EqualFunc>

View file

@ -86,6 +86,24 @@ class HashMapTestSuite : public CxxTest::TestSuite
TS_ASSERT_EQUALS(container[4], 96);
}
void test_lookup_with_default() {
Common::HashMap<int, int> container;
container[0] = 17;
container[1] = -1;
container[2] = 45;
container[3] = 12;
container[4] = 96;
// We take a const ref now to ensure that the map
// is not modified by getVal.
const Common::HashMap<int, int> &containerRef = container;
TS_ASSERT_EQUALS(containerRef.getVal(0), 17);
TS_ASSERT_EQUALS(containerRef.getVal(17), 0);
TS_ASSERT_EQUALS(containerRef.getVal(0, -10), 17);
TS_ASSERT_EQUALS(containerRef.getVal(17, -10), -10);
}
void test_iterator_begin_end() {
Common::HashMap<int, int> container;