HashTableIterI.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) 2017-2022 OpenCFD Ltd.
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 // * * * * * * * * * * * * * * * iterator base * * * * * * * * * * * * * * * //
29 
30 template<class T, class Key, class Hash>
31 template<bool Const>
32 inline constexpr
34 :
35  entry_(nullptr),
36  container_(nullptr),
37  index_(0)
38 {}
39 
40 
41 template<class T, class Key, class Hash>
42 template<bool Const>
44 (
45  table_type* tbl
46 )
47 :
48  entry_(nullptr),
49  container_(tbl),
50  index_(0)
51 {
52  if (container_ && container_->size_)
53  {
54  // Locate the first non-nullptr table entry
55  while
56  (
57  !(entry_ = container_->table_[index_])
58  && ++index_ < container_->capacity_
59  )
60  {}
61 
62  if (index_ >= container_->capacity_)
63  {
64  // Nothing found - make it an end iterator
65  entry_ = nullptr;
66  index_ = 0;
67  }
68  }
69 }
70 
71 
72 //
73 // Any changes here may need changes in iterator_erase() method too
74 //
75 template<class T, class Key, class Hash>
76 template<bool Const>
77 inline void
79 {
80  if (index_ < 0)
81  {
82  // Negative index is a special value from erase
83  //
84  // Saved as (-index-1), retrieved as (-(index-1)) but to with an
85  // extra (-1) to compensate for the ++ in the following while loop
86  index_ = -(index_+1) - 1;
87  }
88  else if (index_ < container_->capacity_ && entry_ && entry_->next_)
89  {
90  // Move to next element on the linked-list
91  entry_ = entry_->next_;
92  return;
93  }
94 
95  // Move to the next non-nullptr table entry
96  while
97  (
98  ++index_ < container_->capacity_
99  && !(entry_ = container_->table_[index_])
100  )
101  {}
102 
103  if (index_ >= container_->capacity_)
104  {
105  // Nothing found - make it an end iterator
106  entry_ = nullptr;
107  index_ = 0;
108  }
109 }
110 
111 
112 template<class T, class Key, class Hash>
113 template<bool Const>
115 (
116  Ostream& os
117 ) const
118 {
119  if (entry_)
120  {
121  entry_->print(os);
122  }
123  return os;
124 }
125 
126 
127 // * * * * * * * * * * * * * * * * STL iterator * * * * * * * * * * * * * * //
128 
129 template<class T, class Key, class Hash>
132 {
133  this->increment();
134  return *this;
135 }
136 
137 
138 template<class T, class Key, class Hash>
141 {
142  iterator iter(*this);
143  this->increment();
144  return iter;
145 }
146 
147 
148 // * * * * * * * * * * * * * * * STL const_iterator * * * * * * * * * * * * //
149 
150 template<class T, class Key, class Hash>
153 {
154  this->increment();
155  return *this;
156 }
157 
158 
159 template<class T, class Key, class Hash>
162 {
163  const_iterator iter(*this);
164  this->increment();
165  return iter;
166 }
167 
168 
169 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
170 
171 template<class T, class Key, class Hash>
174 {
175  return iterator(Iterator<false>(this));
176 }
177 
178 
179 template<class T, class Key, class Hash>
182 {
183  return const_iterator(Iterator<true>(this));
184 }
185 
186 
187 template<class T, class Key, class Hash>
190 {
191  return const_iterator(Iterator<true>(this));
192 }
193 
194 
195 template<class T, class Key, class Hash>
198 {
199  return iterator();
200 }
201 
202 
203 template<class T, class Key, class Hash>
206 {
207  return const_iterator();
208 }
209 
210 
211 template<class T, class Key, class Hash>
212 inline constexpr typename Foam::HashTable<T, Key, Hash>::const_iterator
214 {
215  return const_iterator();
216 }
217 
218 
219 // ************************************************************************* //
void increment()
Increment to the next position.
Forward iterator with const access.
Definition: HashTable.H:1070
Ostream & print(Ostream &os, UIntType value, char off='0', char on='1')
Print 0/1 bits in the (unsigned) integral type.
Definition: BitOps.H:289
iterator end() noexcept
iterator to signal the end (for any HashTable)
Forward iterator with non-const access.
Definition: HashTable.H:978
friend class Iterator< true >
An iterator with const access to HashTable internals.
Definition: HashTable.H:263
iterator begin()
iterator set to the beginning of the HashTable
A HashTable similar to std::unordered_map.
Definition: HashTable.H:102
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Definition: Ostream.H:55
const direction noexcept
Definition: Scalar.H:258
OBJstream os(runTime.globalPath()/outputName)
virtual void print(Ostream &os) const
Print stream description to Ostream.
Definition: IOstream.C:67
friend class Iterator< false >
An iterator with non-const access to HashTable internals.
Definition: HashTable.H:273
const_iterator cbegin() const
const_iterator set to the beginning of the HashTable
constexpr const_iterator cend() const noexcept
const_iterator to signal the end (for any HashTable)