/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- 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 3 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, see . 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 { // Forward declaration of friend functions and operators template class HashSet; template Ostream& operator<<(Ostream& os, const HashSet& tbl); /*---------------------------------------------------------------------------*\ Class HashSet Declaration \*---------------------------------------------------------------------------*/ template class HashSet : public HashTable { // Private Member Functions //- Insert values, using begin/end iterators. template inline label insertMultiple ( const InputIter begIter, const InputIter endIter ); //- Assign using begin/end iterators. template inline label assignMultiple ( const InputIter begIter, const InputIter endIter, const label sz ); public: //- The template instance used for this HashSet typedef HashSet this_type; //- The template instance used for the parent HashTable typedef HashTable parent_type; //- An iterator, returning reference to the key using iterator = typename parent_type::key_iterator; //- A const_iterator, returning reference to the key using const_iterator = typename parent_type::const_key_iterator; // Constructors //- Construct given initial size HashSet(const label size = 128) : parent_type(size) {} //- Construct from Istream HashSet(Istream& is) : parent_type(is) {} //- Construct from UList of Key explicit HashSet(const UList& lst); //- Construct from FixedList of Key template explicit HashSet(const FixedList& lst); //- Construct from an initializer list of Key HashSet(std::initializer_list lst); //- Construct as copy HashSet(const HashSet& hs) : parent_type(hs) {} //- Construct by transferring the parameter contents HashSet(const Xfer>& hs) : parent_type(hs) {} //- Construct by transferring the parameter contents HashSet(const Xfer>& hs) : parent_type(hs) {} //- Construct from the keys of another HashTable, // the type of values held is arbitrary. template explicit HashSet(const HashTable& tbl); // Member Functions // Edit //- Insert a new entry // \return True if the entry inserted, which means that it did // not previously exist in the set. bool insert(const Key& key) { return this->parent_type::insert(key, nil()); } //- Insert keys from the list of Key // \return The number of new elements inserted label insert(const UList& lst); //- Insert keys from the list of Key // \return The number of new elements inserted template label insert(const FixedList& lst); //- Insert keys from a initializer list of Key // \return The number of new elements inserted label insert(std::initializer_list lst); //- Same as insert (cannot overwrite nil content) bool set(const Key& key) { return insert(key); } //- Same as insert (cannot overwrite nil content) label set(const UList& lst) { return insert(lst); } //- Same as insert (cannot overwrite nil content) template label set(const FixedList& lst) { return insert(lst); } //- Same as insert (cannot overwrite nil content) label set(std::initializer_list lst) { return insert(lst); } //- Unset the specified key - same as erase // \return True if the entry existed and was removed bool unset(const Key& key) { return this->parent_type::erase(key); } //- Unset the listed keys - same as erase // \return The number of items removed label unset(const UList& lst) { return this->parent_type::erase(lst); } //- Unset the listed keys - same as erase // \return The number of items removed template label unset(const FixedList& lst) { return this->parent_type::erase(lst); } //- Unset the listed keys - same as erase // \return The number of items removed label unset(std::initializer_list lst) { return this->parent_type::erase(lst); } //- Not applicable for HashSet template List tocValues(const UnaryPredicate&, const bool) = delete; //- Not applicable for HashSet template List tocEntries(const BinaryPredicate&, const bool) = delete; //- Not applicable for HashSet template label countValues(const UnaryPredicate&, const bool) = delete; //- Not applicable for HashSet template label countEntries(const BinaryPredicate&, const bool) = delete; //- Not applicable for HashSet template label filterValues(const UnaryPredicate&, const bool) = delete; //- Not applicable for HashSet template label filterEntries(const BinaryPredicate&, const bool) = delete; // STL iterators iterator begin(); const_iterator begin() const; const_iterator cbegin() const; const iterator& end(); const const_iterator& end() const; const const_iterator& cend() const; // Writing //- Write the unordered keys as a list, with line-breaks if list length // exceeds shortListLen. Using '0' suppresses line-breaks entirely. Ostream& writeList(Ostream& os, const label shortListLen=0) const { return this->writeKeys(os, shortListLen); } // Member Operators //- Return true if the entry exists, same as found() inline bool operator()(const Key& key) const; //- Return true if the entry exists, same as found(). inline bool operator[](const Key& key) const; // Comparison //- Equality. Two hashset are equal when they have the same keys. // Independent of table size or order. bool operator==(const this_type& rhs) const; //- The opposite of the equality operation. bool operator!=(const this_type& rhs) const; // Assignment //- Assignment from a UList of keys void operator=(const UList& lst); //- Assignment from a FixedList of keys template void operator=(const FixedList& lst); //- Assignment from an initializer list of keys void operator=(std::initializer_list lst); // Logical operations //- Combine entries from HashSets void operator|=(const HashSet& rhs); //- Only retain entries found in both HashSets inline void operator&=(const HashSet& rhs); //- Only retain unique entries (xor) void operator^=(const HashSet& rhs); //- 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 inline void operator-=(const HashSet& rhs); // IOstream Operator friend Ostream& operator<< ( Ostream& os, const HashSet& tbl ); }; // 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 // ************************************************************************* //