typename Foam::StaticHashTable<T, Key, Hash>::const_iterator Foam::StaticHashTable<T, Key, Hash>::find ( const Key& key ) const { if (nElmts_) { const label hashIdx = hashKeyIndex(key); const List<Key>& localKeys = keys_[hashIdx]; forAll(localKeys, elemIdx) { if (key == localKeys[elemIdx]) { return const_iterator(*this, hashIdx, elemIdx); } } } # ifdef FULLDEBUG if (debug) { Info<< "StaticHashTable<T, Key, Hash>::find(const Key&) const : " << "Entry " << key << " not found in hash table\n"; } # endif return cend(); }
bool Foam::StaticHashTable<T, Key, Hash>::found(const Key& key) const { if (nElmts_) { const label hashIdx = hashKeyIndex(key); const List<Key>& localKeys = keys_[hashIdx]; forAll(localKeys, elemIdx) { if (key == localKeys[elemIdx]) { return true; } } } # ifdef FULLDEBUG if (debug) { Info<< "StaticHashTable<T, Key, Hash>::found(const Key&) : " << "Entry " << key << " not found in hash table\n"; } # endif return false; }
typename Foam::HashTable<T, Key, Hash>::const_iterator Foam::HashTable<T, Key, Hash>::find ( const Key& key ) const { if (nElmts_) { const label hashIdx = hashKeyIndex(key); for (hashedEntry* ep = table_[hashIdx]; ep; ep = ep->next_) { if (key == ep->key_) { return const_iterator(this, ep, hashIdx); } } } #ifdef FULLDEBUG if (debug) { InfoInFunction << "Entry " << key << " not found in hash table\n"; } #endif return const_iterator(); }
bool Foam::HashTable<T, Key, Hash>::found(const Key& key) const { if (nElmts_) { const label hashIdx = hashKeyIndex(key); for (hashedEntry* ep = table_[hashIdx]; ep; ep = ep->next_) { if (key == ep->key_) { return true; } } } # ifdef FULLDEBUG if (debug) { Info<< "HashTable<T, Key, Hash>::found(const Key& key) : " << "Entry " << key << " not found in hash table\n"; } # endif return false; }
bool Foam::StaticHashTable<T, Key, Hash>::set ( const Key& key, const T& newEntry, const bool protect ) { const label hashIdx = hashKeyIndex(key); List<Key>& localKeys = keys_[hashIdx]; label existing = localKeys.size(); forAll(localKeys, elemIdx) { if (key == localKeys[elemIdx]) { existing = elemIdx; break; } } if (existing == localKeys.size()) { // not found, append List<T>& localObjects = objects_[hashIdx]; localKeys.setSize(existing+1); localObjects.setSize(existing+1); localKeys[existing] = key; localObjects[existing] = newEntry; nElmts_++; } else if (protect) { // found - but protected from overwriting // this corresponds to the STL 'insert' convention # ifdef FULLDEBUG if (debug) { Info<< "StaticHashTable<T, Key, Hash>::set" "(const Key& key, T newEntry, true) : " "Cannot insert " << key << " already in hash table\n"; } # endif return false; } else { // found - overwrite existing entry // this corresponds to the Perl convention objects_[hashIdx][existing] = newEntry; } return true; }
bool Foam::HashTable<T, Key, Hash>::set ( const Key& key, const T& newEntry, const bool protect ) { if (!tableSize_) { resize(2); } const label hashIdx = hashKeyIndex(key); hashedEntry* existing = 0; hashedEntry* prev = 0; for (hashedEntry* ep = table_[hashIdx]; ep; ep = ep->next_) { if (key == ep->key_) { existing = ep; break; } prev = ep; } // Not found, insert it at the head if (!existing) { table_[hashIdx] = new hashedEntry(key, table_[hashIdx], newEntry); nElmts_++; if (double(nElmts_)/tableSize_ > 0.8 && tableSize_ < maxTableSize) { #ifdef FULLDEBUG if (debug) { InfoInFunction << "Doubling table size\n"; } #endif resize(2*tableSize_); } } else if (protect) { // Found - but protected from overwriting // this corresponds to the STL 'insert' convention #ifdef FULLDEBUG if (debug) { InfoInFunction << "Cannot insert " << key << " already in hash table\n"; } #endif return false; } else { // Found - overwrite existing entry // this corresponds to the Perl convention hashedEntry* ep = new hashedEntry(key, existing->next_, newEntry); // Replace existing element - within list or insert at the head if (prev) { prev->next_ = ep; } else { table_[hashIdx] = ep; } delete existing; } return true; }