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