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:
parent
b51e9988e6
commit
ae16d496b9
2 changed files with 25 additions and 1 deletions
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue