diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H index e6b0ad0c2e..aa201bc130 100644 --- a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H +++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H @@ -64,8 +64,8 @@ class HashSet public: - typedef typename HashTable::iterator iterator; - typedef typename HashTable::const_iterator const_iterator; + using iterator = typename HashTable::iterator; + using const_iterator = typename HashTable::const_iterator; // Constructors @@ -154,6 +154,25 @@ public: return HashTable::erase(key); } + //- Unset the listed keys - same as erase + label unset(const UList& lst) + { + return HashTable::erase(lst); + } + + //- Unset the listed keys - same as erase + template + label unset(const FixedList& lst) + { + return HashTable::erase(lst); + } + + //- Unset the listed keys - same as erase + label unset(std::initializer_list lst) + { + return HashTable::erase(lst); + } + // Member Operators diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C index ea9ca3cab6..c5465e7141 100644 --- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C +++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C @@ -28,8 +28,34 @@ License #include "HashTable.H" #include "List.H" +#include "FixedList.H" #include "Tuple2.H" +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +template +template +Foam::label Foam::HashTable::eraseMultiple +( + const InputIter begIter, + const InputIter endIter +) +{ + const label nTotal = this->size(); + label changed = 0; + + // Terminates early if possible + for (InputIter iter = begIter; changed < nTotal && iter != endIter; ++iter) + { + if (this->erase(*iter)) + { + ++changed; + } + } + return changed; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template @@ -389,19 +415,28 @@ bool Foam::HashTable::erase(const Key& key) template Foam::label Foam::HashTable::erase(const UList& keys) { - const label nTotal = nElmts_; - label count = 0; + return eraseMultiple(keys.begin(), keys.end()); +} - // Remove listed keys from this table - terminates early if possible - for (label keyI = 0; count < nTotal && keyI < keys.size(); ++keyI) - { - if (erase(keys[keyI])) - { - ++count; - } - } - return count; +template +template +Foam::label Foam::HashTable::erase +( + const FixedList& keys +) +{ + return eraseMultiple(keys.begin(), keys.end()); +} + + +template +Foam::label Foam::HashTable::erase +( + std::initializer_list keys +) +{ + return eraseMultiple(keys.begin(), keys.end()); } @@ -412,19 +447,21 @@ Foam::label Foam::HashTable::erase const HashTable& rhs ) { - label count = 0; + 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 ... - for (iterator iter = begin(); iter != end(); ++iter) + + // Terminates early if possible + for (iterator iter = begin(); changed < nTotal && iter != end(); ++iter) { if (rhs.found(iter.key()) && erase(iter)) { - ++count; + ++changed; } } - - return count; + return changed; } diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H index 4afacce573..d7f5f1c604 100644 --- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H +++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H @@ -60,6 +60,7 @@ namespace Foam template class List; template class UList; +template class FixedList; template class HashTable; template class HashPtrTable; @@ -174,6 +175,18 @@ class HashTable bool set(const Key& key, const T& newEntry, const bool protect); +protected: + + // Protected Member Functions + + //- Remove using begin/end iterators of listed keys + template + inline label eraseMultiple + ( + const InputIter begIter, + const InputIter endIter + ); + public: // Forward declaration of iterators @@ -274,6 +287,15 @@ public: // Return the number of elements removed label erase(const UList& keys); + //- Remove entries given by the listed keys from this HashTable + // Return the number of elements removed + template + label erase(const FixedList& keys); + + //- Remove entries given by the listed keys from this HashTable + // Return the number of elements removed + label erase(std::initializer_list keys); + //- Remove entries given by the given keys from this HashTable // Return the number of elements removed. // The parameter HashTable needs the same type of key, but the