diff --git a/applications/test/HashSet/hashSetTest.C b/applications/test/HashSet/hashSetTest.C index 21e1276604518f9b9adf4905305ed091702ac48e..fd40e349990559c6f6d8b98a2b7cc94474d234aa 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 4701c8020de7180bb9907516c290837a7c0260fb..644e98ccfb2fa6f722fcede75031c525aa648bd5 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 6353818d7efea8e8b93e8e499f821feecc9b3c13..7fa22c6b967b14b691870e51efdc120224e17aa6 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