/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Class Foam::HashSet Description A HashTable with keys but without contents. Typedef Foam::wordHashSet Description A HashSet with (the default) word keys. Typedef Foam::labelHashSet Description A HashSet with label keys. \*---------------------------------------------------------------------------*/ #ifndef HashSet_H #define HashSet_H #include "HashTable.H" #include "nil.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class HashSet Declaration \*---------------------------------------------------------------------------*/ template class HashSet : public HashTable { public: typedef typename HashTable::iterator iterator; typedef typename HashTable::const_iterator const_iterator; // Constructors //- Construct given initial size HashSet(const label size = 128) : HashTable(size) {} //- Construct from Istream HashSet(Istream& is) : HashTable(is) {} //- Construct from UList of Key HashSet(const UList& lst) : HashTable(2*lst.size()) { forAll(lst, i) { insert(lst[i]); } } //- Construct as copy HashSet(const HashSet& hs) : HashTable(hs) {} //- Construct by transferring the parameter contents HashSet(const Xfer >& hs) : HashTable(hs) {} //- Construct by transferring the parameter contents HashSet(const Xfer >& hs) : HashTable(hs) {} //- Construct from the keys of another HashTable, // the type of values held is arbitrary. template HashSet(const HashTable&); // Member Functions // Edit //- Insert a new entry bool insert(const Key& key) { return HashTable::insert(key, nil()); } //- Same as insert (cannot overwrite nil content) bool set(const Key& key) { return HashTable::insert(key, nil()); } // Member Operators //- Return true if the entry exists, same as found() inline bool operator[](const Key&) const; //- Equality. Two hashtables are equal when their contents are equal. // Independent of table size or order. bool operator==(const HashSet&) const; //- The opposite of the equality operation. bool operator!=(const HashSet&) const; //- Combine entries from HashSets void operator|=(const HashSet&); //- Only retain entries found in both HashSets void operator&=(const HashSet&); //- Only retain unique entries (xor) void operator^=(const HashSet&); //- Add entries listed in the given HashSet to this HashSet inline void operator+=(const HashSet& rhs) { this->operator|=(rhs); } //- Remove entries listed in the given HashSet from this HashSet void operator-=(const HashSet&); }; // Global Operators //- Combine entries from HashSets template HashSet operator| ( const HashSet& hash1, const HashSet& hash2 ); //- Create a HashSet that only contains entries found in both HashSets template HashSet operator& ( const HashSet& hash1, const HashSet& hash2 ); //- Create a HashSet that only contains unique entries (xor) template HashSet operator^ ( const HashSet& hash1, const HashSet& hash2 ); //- A HashSet with word keys. typedef HashSet<> wordHashSet; //- A HashSet with label keys. typedef HashSet > labelHashSet; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository # include "HashSet.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //