IndirectListBaseI.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) 2018-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 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
29 
30 template<class T, class Addr>
31 template<class ListType>
32 inline void Foam::IndirectListBase<T, Addr>::copyList(const ListType& rhs)
33 {
34  if
35  (
36  this
37  == reinterpret_cast<IndirectListBase<T,Addr>*>(const_cast<ListType*>(&rhs))
38  )
39  {
40  return; // Self-assignment is a no-op
41  }
42 
43  const label len = addr_.size();
44 
45  if (len != rhs.size())
46  {
48  << "Addressing and list of addressed elements "
49  "have different sizes: " << len << " " << rhs.size()
50  << abort(FatalError);
51  }
52 
53  // Or std::copy(rhs.cbegin(), rhs.cend(), this->begin());
54  for (label i = 0; i < len; ++i)
55  {
56  values_[addr_[i]] = rhs[i];
57  }
58 }
59 
60 
61 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
62 
63 template<class T, class Addr>
65 (
66  const UList<T>& values,
67  const Addr& addr
68 )
69 :
70  values_(const_cast<UList<T>&>(values)),
71  addr_(addr)
72 {}
73 
74 
75 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
76 
77 template<class T, class Addr>
79 {
80  const label len = this->size();
81 
82  if (!len)
83  {
84  return false;
85  }
86 
87  const T& val = (*this)[0]; // first
88 
89  for (label i = 1; i < len; ++i)
90  {
91  if (val != (*this)[i])
92  {
93  return false;
94  }
95  }
96 
97  return true;
98 }
99 
100 
101 template<class T, class Addr>
103 (
104  const T& val,
105  label pos
106 ) const
107 {
108  return (this->find(val, pos) >= 0);
109 }
110 
111 
112 template<class T, class Addr>
113 inline Foam::label Foam::IndirectListBase<T, Addr>::fcIndex(const label i) const
114 {
115  return (i == addr_.size()-1 ? 0 : i+1);
116 }
117 
118 
119 template<class T, class Addr>
120 inline Foam::label Foam::IndirectListBase<T, Addr>::rcIndex(const label i) const
121 {
122  return (i ? i-1 : addr_.size()-1);
123 }
124 
125 
126 template<class T, class Addr>
127 inline const T& Foam::IndirectListBase<T, Addr>::front() const
128 {
129  return values_[addr_.front()];
130 }
131 
132 template<class T, class Addr>
134 {
135  return values_[addr_.front()];
136 }
137 
138 
139 template<class T, class Addr>
140 inline const T& Foam::IndirectListBase<T, Addr>::back() const
141 {
142  return values_[addr_.back()];
143 }
144 
145 template<class T, class Addr>
147 {
148  return values_[addr_.back()];
149 }
150 
151 
152 template<class T, class Addr>
153 inline const T& Foam::IndirectListBase<T, Addr>::fcValue(const label i) const
154 {
155  return values_[this->fcIndex(i)];
156 }
157 
158 
159 template<class T, class Addr>
161 {
162  return values_[this->fcIndex(i)];
163 }
164 
165 
166 template<class T, class Addr>
167 inline const T& Foam::IndirectListBase<T, Addr>::rcValue(const label i) const
168 {
169  return values_[this->rcIndex(i)];
170 }
171 
172 
173 template<class T, class Addr>
174 inline T& Foam::IndirectListBase<T, Addr>::rcValue(const label i)
175 {
176  return values_[this->rcIndex(i)];
177 }
178 
179 template<class T, class Addr>
181 {
182  const label len = addr_.size();
183 
184  List<T> result(len);
185 
186  // Or std::copy(this->cbegin(), this->cend(), result.begin());
187  for (label i = 0; i < len; ++i)
188  {
189  result[i] = values_[addr_[i]];
190  }
191 
192  return result;
193 }
194 
195 
196 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
197 
198 template<class T, class Addr>
199 inline T& Foam::IndirectListBase<T, Addr>::operator[](const label i)
200 {
201  return values_[addr_[i]];
202 }
203 
204 
205 template<class T, class Addr>
206 inline const T&
208 {
209  return values_[addr_[i]];
210 }
211 
212 
213 template<class T, class Addr>
214 inline void Foam::IndirectListBase<T, Addr>::operator=(const T& val)
215 {
216  // Or std::fill(this->begin(), this->end(), val);
217  for (const label idx : addr_)
218  {
219  values_[idx] = val;
220  }
221 }
222 
223 
224 template<class T, class Addr>
226 {
227  // Or std::fill(this->begin(), this->end(), Zero);
228  for (const label idx : addr_)
229  {
230  values_[idx] = Zero;
231  }
232 }
233 
234 
235 template<class T, class Addr>
237 (
238  const UList<T>& rhs
239 )
240 {
241  this->copyList(rhs);
242 }
243 
244 
245 template<class T, class Addr>
247 (
248  const IndirectListBase<T, Addr>& rhs
249 )
250 {
251  this->copyList(rhs);
252 }
253 
254 
255 template<class T, class Addr>
256 template<class AnyAddr>
258 (
260 )
261 {
262  this->copyList(rhs);
263 }
264 
265 
266 // ************************************************************************* //
bool found(const T &val, label pos=0) const
True if the value if found in the list.
label find(const ListType &input, const UnaryPredicate &pred, const label start=0)
Same as ListOps::find_if.
Definition: ListOps.H:790
error FatalError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL ERROR&#39; header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:578
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: BitOps.H:56
const T & back() const
The last element of the list.
void operator=(const T &val)
Assign all addressed elements to the given value.
Base for lists with indirect addressing, templated on the list contents type and the addressing type...
IndirectListBase()=delete
No default construct.
bool uniform() const
True if all entries have identical values, and list is non-empty.
T & operator[](const label i)
Non-const access to an element in the list.
List< T > values(const HashTable< T, Key, Hash > &tbl, const bool doSort=false)
List of values from HashTable, optionally sorted.
Definition: HashOps.H:164
dimensionedScalar pos(const dimensionedScalar &ds)
errorManip< error > abort(error &err)
Definition: errorManip.H:139
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:99
const T & front() const
The first element of the list.
const volScalarField & T
label rcIndex(const label i) const
The reverse circular index. The previous index in the list which returns to the last at the beginning...
label fcIndex(const label i) const
The forward circular index. The next index in the list which returns to the first at the end of the l...
A class representing the concept of 0 (zero) that can be used to avoid manipulating objects known to ...
Definition: zero.H:58
void copyList(const ListType &rhs)
Deep copy values from the list.
const T & fcValue(const label i) const
Return forward circular value (ie, next value in the list)
List< T > list() const
Return the addressed elements as a List.
const T & rcValue(const label i) const
Return reverse circular value (ie, previous value in the list)
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:157