From a4f4a904f48690dd29ffa23e92ec9e6d6d8d0316 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@Germany> Date: Tue, 1 Dec 2009 18:26:18 +0100 Subject: [PATCH] HashSet enhancement - allow insert() and set() from a UList of Key This complements the existing erase(const UList<Key>&) method --- applications/test/HashSet/hashSetTest.C | 13 ++++++++ .../containers/HashTables/HashSet/HashSet.C | 30 +++++++++++++++++++ .../containers/HashTables/HashSet/HashSet.H | 22 +++++++------- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/applications/test/HashSet/hashSetTest.C b/applications/test/HashSet/hashSetTest.C index 21e12766045..fd40e349990 100644 --- a/applications/test/HashSet/hashSetTest.C +++ b/applications/test/HashSet/hashSetTest.C @@ -92,6 +92,8 @@ int main(int argc, char *argv[]) labelHashSet setD(1); setD.insert(11); setD.insert(100); + setD.insert(49); + setD.insert(36); setD.insert(2008); Info<< "setD : " << setD << endl; @@ -138,6 +140,17 @@ int main(int argc, char *argv[]) // this doesn't work (yet?) // setD[12] = true; + List<label> someLst(10); + forAll(someLst, elemI) + { + someLst[elemI] = elemI*elemI; + } + + label added = setD.set(someLst); + Info<< "added " << added << " from " << someLst.size() << endl; + Info<< "setD : " << setD << endl; + + return 0; } diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C index 4701c8020de..644e98ccfb2 100644 --- a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C +++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C @@ -31,6 +31,18 @@ License // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +template<class Key, class Hash> +Foam::HashSet<Key, Hash>::HashSet(const UList<Key>& lst) +: + HashTable<nil, Key, Hash>(2*lst.size()) +{ + forAll(lst, elemI) + { + insert(lst[elemI]); + } +} + + template<class Key, class Hash> template<class AnyType> Foam::HashSet<Key, Hash>::HashSet(const HashTable<AnyType, Key, Hash>& h) @@ -49,6 +61,24 @@ Foam::HashSet<Key, Hash>::HashSet(const HashTable<AnyType, Key, Hash>& h) } +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Key, class Hash> +Foam::label Foam::HashSet<Key, Hash>::insert(const UList<Key>& lst) +{ + label count = 0; + forAll(lst, elemI) + { + if (insert(lst[elemI])) + { + ++count; + } + } + + return count; +} + + // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // template<class Key, class Hash> diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H index 6353818d7ef..7fa22c6b967 100644 --- a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H +++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H @@ -84,15 +84,7 @@ public: {} //- Construct from UList of Key - HashSet(const UList<Key>& lst) - : - HashTable<nil, Key, Hash>(2*lst.size()) - { - forAll(lst, i) - { - insert(lst[i]); - } - } + HashSet(const UList<Key>&); //- Construct as copy HashSet(const HashSet<Key, Hash>& hs) @@ -127,10 +119,20 @@ public: return HashTable<nil, Key, Hash>::insert(key, nil()); } + //- Insert keys from a UList of Key + // Return the number of new elements inserted + label insert(const UList<Key>&); + //- Same as insert (cannot overwrite nil content) bool set(const Key& key) { - return HashTable<nil, Key, Hash>::insert(key, nil()); + return insert(key); + } + + //- Same as insert (cannot overwrite nil content) + label set(const UList<Key>& lst) + { + return insert(lst); } // Member Operators -- GitLab