HashSet.H
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2016-2021 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 Class
28  Foam::HashSet
29 
30 Description
31  A HashTable with keys but without contents that is similar to
32  \c std::unordered_set.
33 
34  The entries are considered \a unordered since their placement
35  depends on the method used to generate the hash key index, the
36  table capacity, insertion order etc. When the key order is
37  important, use the sortedToc() method to obtain a list of sorted
38  keys and use that for further access.
39 
40 Note
41  The HashSet iterator dereferences to the key, so the following
42  range-for works as expected:
43  \code
44  labelHashSet someLabels{10, 20, 30, 40, ...};
45  for (const label i : someLabels)
46  {
47  Info<< "val:" << i << nl;
48  }
49  \endcode
50 
51 Typedef
52  Foam::wordHashSet
53 
54 Description
55  A HashSet with word keys and string hasher.
56 
57 Typedef
58  Foam::labelHashSet
59 
60 Description
61  A HashSet with label keys and label hasher.
62 
63 \*---------------------------------------------------------------------------*/
64 
65 #ifndef HashSet_H
66 #define HashSet_H
67 
68 #include "HashTable.H"
69 #include "IndirectList.H"
70 
71 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
72 
73 namespace Foam
74 {
75 
76 // Forward Declarations
77 template<class T> class MinMax;
78 template<class Key, class Hash> class HashSet;
79 
80 // Common hash-set types
81 
82 //- A HashSet of words, uses string hasher.
84 
85 //- A HashSet of labels, uses label hasher.
87 
88 
89 /*---------------------------------------------------------------------------*\
90  Class HashSet Declaration
91 \*---------------------------------------------------------------------------*/
92 
93 template<class Key, class Hash=Foam::Hash<Key>>
94 class HashSet
95 :
96  public HashTable<zero::null, Key, Hash>
97 {
98  // Private Member Functions
99 
100  //- Assign from the input iterator range
101  template<class InputIter>
102  inline label assignMany
103  (
104  const label nItems,
105  InputIter first,
106  InputIter last
107  );
108 
109 
110 public:
111 
112  //- The template instance used for this HashSet
114 
115  //- The template instance used for the parent HashTable
117 
118  //- An iterator, returning reference to the key
119  using iterator = typename parent_type::key_iterator;
120 
121  //- A const_iterator, returning reference to the key
123 
124 
125  // Constructors
126 
127  //- Default construct with default (128) table capacity
128  HashSet()
129  :
130  parent_type()
131  {}
132 
133  //- Copy construct
134  HashSet(const this_type& rhs)
135  :
136  parent_type(rhs)
137  {}
138 
139  //- Move construct
140  HashSet(this_type&& rhs)
141  :
142  parent_type(std::move(rhs))
143  {}
144 
145  //- Construct given initial table capacity
146  explicit HashSet(const label size)
147  :
148  parent_type(size)
149  {}
150 
151  //- Construct from Istream with default table capacity
152  explicit HashSet(Istream& is)
153  :
154  parent_type(is)
155  {}
156 
157  //- Construct from FixedList of Key
158  template<unsigned N>
159  explicit HashSet(const FixedList<Key, N>& list);
160 
161  //- Construct from UList of Key
162  explicit HashSet(const UList<Key>& list);
163 
164  //- Construct from an indirect list
165  template<class Addr>
166  explicit HashSet(const IndirectListBase<Key, Addr>& list);
167 
168  //- Construct from an initializer list of Key
169  HashSet(std::initializer_list<Key> list);
170 
171  //- Construct from the keys of another HashTable,
172  //- the type of values held is arbitrary.
173  template<class AnyType, class AnyHash>
174  explicit HashSet(const HashTable<AnyType, Key, AnyHash>& tbl);
175 
176 
177  // Member Functions
178 
179  //- Same as found() - return true if key exists in the set.
180  // Method name compatibility with bitSet and boolList.
181  bool test(const Key& key) const noexcept
182  {
183  return found(key);
184  }
185 
186 
187  // Edit
188 
189  //- Insert a new entry, not overwriting existing entries.
190  // \return True if the entry inserted, which means that it did
191  // not previously exist in the set.
192  bool insert(const Key& key)
193  {
194  return this->parent_type::emplace(key);
195  }
196 
197  //- Same as insert (no value to overwrite)
198  bool set(const Key& key)
199  {
200  return insert(key);
201  }
202 
203  //- Unset the specified key - same as erase
204  // \return True if the entry existed and was removed
205  bool unset(const Key& key)
206  {
207  return this->parent_type::erase(key);
208  }
209 
210 
211  // Convenience
212 
213  //- Insert keys from the input iterator range
214  // \return The number of new elements inserted
215  template<class InputIter>
216  inline label insert(InputIter first, InputIter last);
217 
218  //- Insert keys from a initializer list of Key
219  // \return The number of new elements inserted
220  inline label insert(std::initializer_list<Key> list);
221 
222  //- Insert keys from the list of Key
223  // \return The number of new elements inserted
224  template<unsigned N>
225  inline label insert(const FixedList<Key, N>& list);
226 
227  //- Insert keys from the list of Key
228  // \return The number of new elements inserted
229  inline label insert(const UList<Key>& list);
230 
231  //- Insert keys from the list of Key
232  // \return The number of new elements inserted
233  template<class Addr>
234  inline label insert(const IndirectListBase<Key, Addr>& list);
235 
236  //- Same as insert (no value to overwrite)
237  template<class InputIter>
238  inline label set(InputIter first, InputIter last)
239  {
240  return insert(first, last);
241  }
242 
243  //- Same as insert (no value to overwrite)
244  inline label set(std::initializer_list<Key> list)
245  {
246  return insert(list);
247  }
248 
249  //- Same as insert (no value to overwrite)
250  template<unsigned N>
251  inline label set(const FixedList<Key, N>& list)
252  {
253  return insert(list);
254  }
255 
256  //- Same as insert (no value to overwrite)
257  inline label set(const UList<Key>& list)
258  {
259  return insert(list);
260  }
261 
262  //- Same as insert (no value to overwrite)
263  template<class Addr>
264  inline label set(const IndirectListBase<Key, Addr>& list)
265  {
266  return insert(list);
267  }
268 
269  //- Same as insert (no value to overwrite)
270  // \note Method name compatibility with bitSet
271  template<class InputIter>
272  inline label setMany(InputIter first, InputIter last)
273  {
274  return insert(first, last);
275  }
276 
277  //- Unset the keys listed in the input iterator range
278  // \return The number of items removed
279  template<class InputIter>
280  inline label unset(InputIter first, InputIter last);
281 
282  //- Unset the listed keys - same as erase
283  // \return The number of items removed
284  inline label unset(std::initializer_list<Key> list);
285 
286  //- Unset the listed keys - same as erase
287  // \return The number of items removed
288  template<unsigned N>
289  inline label unset(const FixedList<Key, N>& list);
290 
291  //- Unset the listed keys - same as erase
292  // \return The number of items removed
293  inline label unset(const UList<Key>& list);
294 
295  //- Unset the listed keys - same as erase
296  // \return The number of items removed
297  template<class Addr>
298  inline label unset(const IndirectListBase<Key, Addr>& list);
299 
300 
301  // STL iterators
302 
303  inline iterator begin();
304  inline const_iterator begin() const;
305  inline const_iterator cbegin() const;
306 
307  inline iterator end() noexcept;
308  inline const_iterator end() const noexcept;
309  inline constexpr const_iterator cend() const noexcept;
310 
311 
312  // Writing
313 
314  //- Write unordered keys (list), with line-breaks
315  //- when length exceeds shortLen.
316  // Using '0' suppresses line-breaks entirely.
317  Ostream& writeList(Ostream& os, const label shortLen=0) const
318  {
319  return this->writeKeys(os, shortLen);
320  }
321 
322 
323  // Member Operators
324 
325  //- Return true if the entry exists, same as found()
326  // \note this allows use of HashSet as a predicate test
327  inline bool operator()(const Key& key) const noexcept;
328 
329  //- Return true if the entry exists, same as found().
330  inline bool operator[](const Key& key) const noexcept;
331 
332  //- Copy assign
333  void operator=(const this_type& rhs)
334  {
336  }
337 
338  //- Move assign
339  void operator=(this_type&& rhs)
340  {
341  parent_type::operator=(std::move(rhs));
342  }
343 
344 
345  // Comparison
346 
347  //- Sets are equal if all keys are equal,
348  //- independent of order or underlying storage size.
349  bool operator==(const this_type& rhs) const;
350 
351  //- The opposite of the equality operation.
352  bool operator!=(const this_type& rhs) const;
353 
354 
355  // Assignment
356 
357  //- Assignment from a UList of keys
358  void operator=(const UList<Key>& rhs);
359 
360  //- Assignment from a FixedList of keys
361  template<unsigned N>
362  void operator=(const FixedList<Key, N>& rhs);
363 
364  //- Assignment from an initializer list of keys
365  void operator=(std::initializer_list<Key> rhs);
366 
367 
368  // Logical and set operations
369 
370  //- Add entries to this HashSet
371  this_type& operator|=(const this_type& rhs);
372 
373  //- Only retain entries found in both HashSets
374  inline this_type& operator&=(const this_type& rhs);
375 
376  //- Only retain unique entries (xor)
377  this_type& operator^=(const this_type& rhs);
378 
379  //- Add entries to this HashSet. Same as the '|=' operator
380  inline this_type& operator+=(const this_type& rhs);
381 
382  //- Remove entries from this HashSet. Uses erase()
383  inline this_type& operator-=(const this_type& rhs);
384 
385 
386  // Housekeeping
387 
388  //- Not applicable for HashSet
389  template<class UnaryPredicate>
390  List<Key> tocValues(const UnaryPredicate&, const bool) = delete;
391 
392  //- Not applicable for HashSet
393  template<class BinaryPredicate>
394  List<Key> tocEntries(const BinaryPredicate&, const bool) = delete;
395 
396  //- Not applicable for HashSet
397  template<class UnaryPredicate>
398  label countValues(const UnaryPredicate&, const bool) = delete;
399 
400  //- Not applicable for HashSet
401  template<class BinaryPredicate>
402  label countEntries(const BinaryPredicate&, const bool) = delete;
403 
404  //- Not applicable for HashSet
405  template<class UnaryPredicate>
406  label filterValues(const UnaryPredicate&, const bool) = delete;
407 
408  //- Not applicable for HashSet
409  template<class BinaryPredicate>
410  label filterEntries(const BinaryPredicate&, const bool) = delete;
411 };
412 
413 
414 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
415 
416 // Global Functions
417 
418 //- Find the min value in labelHashSet, optionally limited by second argument.
419 // For an empty set, returns the second argument (eg, labelMax).
420 label min(const labelHashSet& set, label minValue = labelMax);
421 
422 //- Find the max value in labelHashSet, optionally limited by second argument.
423 // For an empty set, returns the second argument (eg, labelMin).
424 label max(const labelHashSet& set, label maxValue = labelMin);
425 
426 //- Find the min/max values of labelHashSet
427 MinMax<label> minMax(const labelHashSet& set);
428 
429 
430 // Global Operators
431 
432 //- Write the list of HashSet keys
433 template<class Key, class Hash>
434 Ostream& operator<<(Ostream& os, const HashSet<Key, Hash>& rhs);
435 
436 
437 //- Combine entries (OR) for two HashSets
438 // See HashSet::operator|= for more details.
439 template<class Key, class Hash>
440 HashSet<Key, Hash> operator|
441 (
442  const HashSet<Key, Hash>& a,
443  const HashSet<Key, Hash>& b
444 );
445 
446 //- Subset (AND) intersection of two HashSet
447 // See HashSet::operator&= for more details.
448 template<class Key, class Hash>
449 HashSet<Key, Hash> operator&
450 (
451  const HashSet<Key, Hash>& a,
452  const HashSet<Key, Hash>& b
453 );
454 
455 //- Create a HashSet that only contains unique entries (XOR)
456 // See HashSet::operator^= for more details.
457 template<class Key, class Hash>
458 HashSet<Key, Hash> operator^
459 (
460  const HashSet<Key, Hash>& a,
461  const HashSet<Key, Hash>& b
462 );
463 
464 //- Subset difference of two HashSets
465 // See HashSet::operator-= for more details.
466 template<class Key, class Hash>
467 HashSet<Key, Hash> operator-
468 (
469  const HashSet<Key, Hash>& a,
470  const HashSet<Key, Hash>& b
471 );
472 
473 
474 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
475 
476 } // End namespace Foam
477 
478 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
479 
480 #ifdef NoRepository
481  #include "HashSet.C"
482 #endif
483 
484 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
485 
486 #endif
487 
488 // ************************************************************************* //
Foam::HashSet::set
label set(const IndirectListBase< Key, Addr > &list)
Same as insert (no value to overwrite)
Definition: HashSet.H:263
Foam::HashSet::operator=
void operator=(this_type &&rhs)
Move assign.
Definition: HashSet.H:338
Foam::HashSet::HashSet
HashSet()
Default construct with default (128) table capacity.
Definition: HashSet.H:127
Foam::HashSet::parent_type
HashTable< zero::null, Key, Hash > parent_type
The template instance used for the parent HashTable.
Definition: HashSet.H:115
Foam::BitOps::set
void set(List< bool > &bools, const labelRange &range)
Set the specified range 'on' in a boolList.
Definition: BitOps.C:37
Foam::labelMax
constexpr label labelMax
Definition: label.H:61
Foam::HashSet::writeList
Ostream & writeList(Ostream &os, const label shortLen=0) const
Definition: HashSet.H:316
HashTable.H
Foam::HashSet::set
label set(const UList< Key > &list)
Same as insert (no value to overwrite)
Definition: HashSet.H:256
Foam::HashSet::operator[]
bool operator[](const Key &key) const noexcept
Return true if the entry exists, same as found().
Definition: HashSet.C:245
Foam::HashSet::operator=
void operator=(const this_type &rhs)
Copy assign.
Definition: HashSet.H:332
Foam::HashTable::key_iterator
key_iterator_base< iterator > key_iterator
Forward iterator returning the key.
Definition: HashTable.H:874
Foam::HashSet::end
iterator end() noexcept
Definition: HashSet.C:479
Foam::glTF::key
auto key(const Type &t) -> typename std::enable_if< std::is_enum< Type >::value, typename std::underlying_type< Type >::type >::type
Definition: foamGltfBase.H:108
Foam::HashTable::emplace
bool emplace(const Key &key, Args &&... args)
Emplace insert a new entry, not overwriting existing entries.
Definition: HashTableI.H:157
Foam::HashSet::test
bool test(const Key &key) const noexcept
Same as found() - return true if key exists in the set.
Definition: HashSet.H:180
Foam::HashSet::tocValues
List< Key > tocValues(const UnaryPredicate &, const bool)=delete
Not applicable for HashSet.
Foam::HashSet::set
label set(const FixedList< Key, N > &list)
Same as insert (no value to overwrite)
Definition: HashSet.H:250
Foam::HashSet::operator==
bool operator==(const this_type &rhs) const
Definition: HashSet.C:274
Foam::HashSet
A HashTable with keys but without contents that is similar to std::unordered_set.
Definition: HashSet.H:77
Foam::HashTable::operator=
void operator=(const this_type &rhs)
Copy assign.
Foam::min
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:33
Foam::HashSet::setMany
label setMany(InputIter first, InputIter last)
Same as insert (no value to overwrite)
Definition: HashSet.H:271
Foam::HashSet::operator+=
this_type & operator+=(const this_type &rhs)
Add entries to this HashSet. Same as the '|=' operator.
Definition: HashSet.C:347
Foam::HashSet::operator|=
this_type & operator|=(const this_type &rhs)
Add entries to this HashSet.
Definition: HashSet.C:303
Foam::HashSet< word, Hash< word > >::const_iterator
typename parent_type::const_key_iterator const_iterator
A const_iterator, returning reference to the key.
Definition: HashSet.H:121
Foam::operator<<
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces)
Definition: boundaryPatch.C:83
Foam::HashSet::operator!=
bool operator!=(const this_type &rhs) const
The opposite of the equality operation.
Definition: HashSet.C:295
Foam::constant::physicoChemical::b
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
Definition: createFields.H:27
Foam::HashSet::filterValues
label filterValues(const UnaryPredicate &, const bool)=delete
Not applicable for HashSet.
Foam::Istream
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition: Istream.H:61
Foam::HashTable::erase
bool erase(const iterator &iter)
Erase an entry specified by given iterator.
Definition: HashTable.C:392
Foam::HashTable::const_key_iterator
key_iterator_base< const_iterator > const_key_iterator
Forward const iterator returning the key.
Definition: HashTable.H:877
Foam::HashSet::countEntries
label countEntries(const BinaryPredicate &, const bool)=delete
Not applicable for HashSet.
HashSet.C
IndirectList.H
Foam::HashSet::this_type
HashSet< Key, Hash > this_type
The template instance used for this HashSet.
Definition: HashSet.H:112
Foam::HashSet::operator&=
this_type & operator&=(const this_type &rhs)
Only retain entries found in both HashSets.
Definition: HashSet.C:317
Foam::HashSet::set
label set(InputIter first, InputIter last)
Same as insert (no value to overwrite)
Definition: HashSet.H:237
Foam::HashSet::tocEntries
List< Key > tocEntries(const BinaryPredicate &, const bool)=delete
Not applicable for HashSet.
Foam::HashSet::HashSet
HashSet(this_type &&rhs)
Move construct.
Definition: HashSet.H:139
Foam::max
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:47
Foam::HashSet::unset
bool unset(const Key &key)
Unset the specified key - same as erase.
Definition: HashSet.H:204
Foam::HashSet::countValues
label countValues(const UnaryPredicate &, const bool)=delete
Not applicable for HashSet.
Foam::HashSet::HashSet
HashSet(const this_type &rhs)
Copy construct.
Definition: HashSet.H:133
Foam::HashSet::HashSet
HashSet(const label size)
Construct given initial table capacity.
Definition: HashSet.H:145
Foam::HashSet::cend
constexpr const_iterator cend() const noexcept
Definition: HashSet.C:495
Foam::HashSet::operator-=
this_type & operator-=(const this_type &rhs)
Remove entries from this HashSet. Uses erase()
Definition: HashSet.C:355
os
OBJstream os(runTime.globalPath()/outputName)
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::HashSet::set
label set(std::initializer_list< Key > list)
Same as insert (no value to overwrite)
Definition: HashSet.H:243
Foam::HashSet::begin
iterator begin()
Definition: HashSet.C:446
Foam::HashSet::operator()
bool operator()(const Key &key) const noexcept
Return true if the entry exists, same as found()
Definition: HashSet.C:238
Foam::HashSet::HashSet
HashSet(Istream &is)
Construct from Istream with default table capacity.
Definition: HashSet.H:151
Foam::HashSet::filterEntries
label filterEntries(const BinaryPredicate &, const bool)=delete
Not applicable for HashSet.
Foam::HashTable
A HashTable similar to std::unordered_map.
Definition: HashTable.H:105
found
bool found
Definition: TABSMDCalcMethod2.H:32
Foam::HashSet::operator^=
this_type & operator^=(const this_type &rhs)
Only retain unique entries (xor)
Definition: HashSet.C:326
Foam::HashSet::cbegin
const_iterator cbegin() const
Definition: HashSet.C:468
Foam::List
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: BitOps.H:63
Foam::FixedList
A 1D vector of objects of type <T> with a fixed length <N>.
Definition: HashTable.H:104
Foam::UList
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
Definition: HashTable.H:103
Foam::HashSet::insert
bool insert(const Key &key)
Insert a new entry, not overwriting existing entries.
Definition: HashSet.H:191
Foam::HashSet< word, Hash< word > >::iterator
typename parent_type::key_iterator iterator
An iterator, returning reference to the key.
Definition: HashSet.H:118
Foam::labelMin
constexpr label labelMin
Definition: label.H:60
minValue
scalar minValue
Definition: LISASMDCalcMethod2.H:12
Foam::wordHashSet
HashSet< word, Hash< word > > wordHashSet
A HashSet of words, uses string hasher.
Definition: HashSet.H:77
Foam::IndirectListBase
Base for lists with indirect addressing, templated on the list contents type and the addressing type....
Definition: IndirectListBase.H:56
Foam::minMax
MinMax< label > minMax(const labelHashSet &set)
Find the min/max values of labelHashSet.
Definition: hashSets.C:61
Foam::Ostream
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:56
Foam::labelHashSet
HashSet< label, Hash< label > > labelHashSet
A HashSet of labels, uses label hasher.
Definition: HashSet.H:85
Foam::MinMax
A min/max value pair with additional methods. In addition to conveniently storing values,...
Definition: HashSet.H:76
Foam::HashSet::set
bool set(const Key &key)
Same as insert (no value to overwrite)
Definition: HashSet.H:197
maxValue
scalar maxValue
Definition: LISASMDCalcMethod1.H:5