diff options
author | Max Horn | 2009-09-06 12:59:07 +0000 |
---|---|---|
committer | Max Horn | 2009-09-06 12:59:07 +0000 |
commit | ae16d496b9f2b245167a8af3fdab3e124364047d (patch) | |
tree | 821b9ae1da031348b65aa430018f58e83e640262 | |
parent | b51e9988e61733b5675623a598afc9ff436caf38 (diff) | |
download | scummvm-rg350-ae16d496b9f2b245167a8af3fdab3e124364047d.tar.gz scummvm-rg350-ae16d496b9f2b245167a8af3fdab3e124364047d.tar.bz2 scummvm-rg350-ae16d496b9f2b245167a8af3fdab3e124364047d.zip |
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
-rw-r--r-- | common/hashmap.h | 8 | ||||
-rw-r--r-- | test/common/hashmap.h | 18 |
2 files changed, 25 insertions, 1 deletions
diff --git a/common/hashmap.h b/common/hashmap.h index 2a50bff07a..25381b92a7 100644 --- a/common/hashmap.h +++ b/common/hashmap.h @@ -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> diff --git a/test/common/hashmap.h b/test/common/hashmap.h index 6476005eaf..03db5518c0 100644 --- a/test/common/hashmap.h +++ b/test/common/hashmap.h @@ -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; |