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-2020 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];
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 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
113 
114 template<class T, class Addr>
115 inline Foam::List<T>
117 {
118  const label len = addr_.size();
119 
120  List<T> result(len);
121 
122  // Or std::copy(this->cbegin(), this->cend(), result.begin());
123  for (label i = 0; i < len; ++i)
124  {
125  result[i] = values_[addr_[i]];
126  }
127 
128  return result;
129 }
130 
131 
132 template<class T, class Addr>
134 {
135  return values_[addr_[i]];
136 }
137 
138 
139 template<class T, class Addr>
140 inline const T&
142 {
143  return values_[addr_[i]];
144 }
145 
146 
147 template<class T, class Addr>
149 {
150  // Or std::fill(this->begin(), this->end(), val);
151  for (const label idx : addr_)
152  {
153  values_[idx] = val;
154  }
155 }
156 
157 
158 template<class T, class Addr>
160 {
161  // Or std::fill(this->begin(), this->end(), Zero);
162  for (const label idx : addr_)
163  {
164  values_[idx] = Zero;
165  }
166 }
167 
168 
169 template<class T, class Addr>
171 (
172  const UList<T>& rhs
173 )
174 {
175  this->copyList(rhs);
176 }
177 
178 
179 template<class T, class Addr>
181 (
182  const IndirectListBase<T, Addr>& rhs
183 )
184 {
185  this->copyList(rhs);
186 }
187 
188 
189 template<class T, class Addr>
190 template<class AnyAddr>
192 (
194 )
195 {
196  this->copyList(rhs);
197 }
198 
199 
200 // ************************************************************************* //
Foam::IndirectListBase::operator()
List< T > operator()() const
Return the addressed elements as a List.
Definition: IndirectListBaseI.H:116
Foam::IndirectListBase::copyList
void copyList(const ListType &rhs)
Deep copy values from the list.
Definition: IndirectListBaseI.H:32
Foam::Zero
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:131
Foam::HashTableOps::values
List< T > values(const HashTable< T, Key, Hash > &tbl, const bool doSort=false)
List of values from HashTable, optionally sorted.
Definition: HashOps.H:149
Foam::IndirectListBase::operator[]
T & operator[](const label i)
Non-const access to an element in the list.
Definition: IndirectListBaseI.H:133
Foam::IndirectListBase::IndirectListBase
IndirectListBase()=delete
No default construct.
Foam::FatalError
error FatalError
Foam::ListOps::find
label find(const ListType &input, const UnaryPredicate &pred, const label start=0)
Find index of the first occurrence that satisfies the predicate.
Foam::abort
errorManip< error > abort(error &err)
Definition: errorManip.H:144
T
const volScalarField & T
Definition: createFieldRefs.H:2
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:381
Foam::IndirectListBase::uniform
bool uniform() const
True if all entries have identical values, and list is non-empty.
Definition: IndirectListBaseI.H:78
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::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::IndirectListBase::operator=
void operator=(const T &val)
Assign all addressed elements to the given value.
Definition: IndirectListBaseI.H:148
Foam::IndirectListBase
Base for lists with indirect addressing, templated on the list contents type and the addressing type....
Definition: IndirectListBase.H:56
Foam::IndirectListBase::found
bool found(const T &val, label pos=0) const
True if the value if found in the list.
Definition: IndirectListBaseI.H:103
Foam::zero
A class representing the concept of 0 (zero) that can be used to avoid manipulating objects known to ...
Definition: zero.H:62
Foam::pos
dimensionedScalar pos(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:177