diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C index c5465e71414748b678312d1e1140b102a10bd424..8c6ace6e486a47ebeddd3c247e2807d91317b1c1 100644 --- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C +++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C @@ -44,8 +44,12 @@ Foam::label Foam::HashTable<T, Key, Hash>::eraseMultiple const label nTotal = this->size(); label changed = 0; - // Terminates early if possible - for (InputIter iter = begIter; changed < nTotal && iter != endIter; ++iter) + for + ( + InputIter iter = begIter; + changed < nTotal && iter != endIter; // terminate early + ++iter + ) { if (this->erase(*iter)) { @@ -444,23 +448,49 @@ template<class T, class Key, class Hash> template<class AnyType, class AnyHash> Foam::label Foam::HashTable<T, Key, Hash>::erase ( - const HashTable<AnyType, Key, AnyHash>& rhs + const HashTable<AnyType, Key, AnyHash>& other ) { + // Remove other keys from this table const label nTotal = this->size(); label changed = 0; - // Remove rhs keys from this table - terminates early if possible - // Could optimize depending on which hash is smaller ... + if (other.size() < nTotal) + { + // other is smaller, use its keys for removal + using other_iter = + typename HashTable<AnyType, Key, AnyHash>::const_iterator; - // Terminates early if possible - for (iterator iter = begin(); changed < nTotal && iter != end(); ++iter) + for + ( + other_iter iter = other.begin(); + changed < nTotal && iter != other.end(); // terminate early + ++iter + ) + { + if (erase(iter.key())) + { + ++changed; + } + } + } + else { - if (rhs.found(iter.key()) && erase(iter)) + // other is same/larger: iterate ourselves and check for key in other + for + ( + iterator iter = begin(); + changed < nTotal && iter != end(); // terminate early + ++iter + ) { - ++changed; + if (other.found(iter.key()) && erase(iter)) + { + ++changed; + } } } + return changed; } diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H index d7f5f1c60444204ce5b05cfa6bd178a3e1a3d169..6e05951d37bd6e15a8136e9466558a45e64e7a20 100644 --- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H +++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H @@ -301,7 +301,7 @@ public: // The parameter HashTable needs the same type of key, but the // type of values held and the hashing function are arbitrary. template<class AnyType, class AnyHash> - label erase(const HashTable<AnyType, Key, AnyHash>& rhs); + label erase(const HashTable<AnyType, Key, AnyHash>& other); //- Resize the hash table for efficiency void resize(const label sz);