PSCF v1.1
FArray.h
1#ifndef UTIL_F_ARRAY_H
2#define UTIL_F_ARRAY_H
3
4/*
5* Util Package - C++ Utilities for Scientific Computation
6*
7* Copyright 2010 - 2017, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <util/containers/ArrayIterator.h>
12#include <util/containers/ConstArrayIterator.h>
13#include <util/global.h>
14
15#ifdef UTIL_MPI
16#include <util/mpi/MpiTraits.h>
17#include <util/mpi/MpiStructBuilder.h>
18#endif
19
20namespace Util
21{
22
45 template <typename Data, int Capacity>
46 class FArray
47 {
48
49 public:
50
55
62
63 // Default destructor is okay.
64
71
75 int size() const;
76
80 int capacity() const;
81
87 void begin(ArrayIterator<Data> &iterator);
88
94 void begin(ConstArrayIterator<Data> &iterator) const;
95
102 Data& operator[] (int i);
103
110 Data const & operator[] (int i) const;
111
115 Data* cArray();
116
120 Data const * cArray() const;
121
128 template <class Archive>
129 void serialize(Archive& ar, const unsigned int version);
130
135
136 #ifdef UTIL_MPI
140 static void commitMpiType();
141 #endif
142
143 private:
144
146 Data data_[Capacity];
147
148 };
149
150 /*
151 * Constructor.
152 */
153 template <typename Data, int Capacity>
155 {}
156
157 /*
158 * Copy constructor.
159 *
160 *\param other the FArray to be copied.
161 */
162 template <typename Data, int Capacity>
164 {
165 for (int i = 0; i < Capacity; ++i) {
166 data_[i] = other.data_[i];
167 }
168 }
169
170 // Default destructor is okay.
171
172 /*
173 * Assignment, element by element.
174 *
175 * Capacity of LHS FArray must be >= size of RHS FArray.
176 *
177 * \param other the RHS FArray
178 */
179 template <typename Data, int Capacity>
182 {
183
184 // Check for self assignment
185 if (this == &other) return *this;
186
187 // Copy elements
188 for (int i = 0; i < Capacity; ++i) {
189 data_[i] = other[i];
190 }
191 return *this;
192 }
193
194 /*
195 * Return number of elements in this FArray.
196 */
197 template <typename Data, int Capacity>
199 { return Capacity; }
200
201 /*
202 * Return number of elements in this FArray.
203 */
204 template <typename Data, int Capacity>
206 { return Capacity; }
207
208 /*
209 * Set an ArrayIterator to the beginning of this Array.
210 */
211 template <typename Data, int Capacity>
212 inline
214 {
215 iterator.setCurrent(data_);
216 iterator.setEnd(data_ + Capacity);
217 }
218
219 /*
220 * Set a ConstArrayIterator to the beginning of this Array.
221 */
222 template <typename Data, int Capacity>
223 inline
225 const
226 {
227 iterator.setCurrent(data_);
228 iterator.setEnd(data_ + Capacity);
229 }
230
231 /*
232 * Mimic C array subscripting.
233 */
234 template <typename Data, int Capacity>
236 {
237 assert(i < Capacity);
238 assert(i >= 0);
239 return data_[i];
240 }
241
242 /*
243 * Mimic C array subscripting.
244 */
245 template <typename Data, int Capacity>
246 inline Data const & FArray<Data, Capacity>::operator[] (int i) const
247 {
248 assert(i < Capacity);
249 assert(i >= 0 );
250 return data_[i];
251 }
252
253 /*
254 * Return pointer to underlying C array.
255 */
256 template <typename Data, int Capacity>
258 { return data_; }
259
260 /*
261 * Return pointer to const to underlying C array.
262 */
263 template <typename Data, int Capacity>
265 { return data_; }
266
267 /*
268 * Serialize a FArray to/from an Archive.
269 */
270 template <class Data, int Capacity>
271 template <class Archive>
273 const unsigned int version)
274 {
275 for (int i = 0; i < Capacity; ++i) {
276 ar & data_[i];
277 }
278 }
279
280 /*
281 * Packed size of FArray in a MemoryArchive, in bytes.
282 */
283 template <typename Data, int Capacity>
285 { return Capacity*sizeof(Data); }
286
287 #ifdef UTIL_MPI
288 /*
289 * Commit associated MPI Datatype.
290 */
291 template <typename Data, int Capacity>
293 {
294 if (!MpiTraits< FArray<Data, Capacity > >::hasType) {
295 MpiStructBuilder builder;
297
298 builder.setBase(&object);
299 for (int i = 0; i < Capacity; ++i) {
300 builder.addMember(&(object.data_[i]), MpiTraits<Data>::type);
301 }
302 builder.commit(MpiTraits< FArray<Data, Capacity> >::type);
303 MpiTraits< FArray<Data, Capacity> >::hasType = true;
304 }
305 }
306 #endif
307}
308#endif
Forward iterator for an Array or a C array.
Definition: ArrayIterator.h:37
void setEnd(Data *ptr)
Set the value of the end pointer.
Definition: ArrayIterator.h:64
void setCurrent(Data *ptr)
Set the current pointer value.
Definition: ArrayIterator.h:56
Forward const iterator for an Array or a C array.
void setEnd(Data *ptr)
Set the value of the end pointer.
void setCurrent(Data *ptr)
Set the current pointer value.
A fixed size (static) contiguous array template.
Definition: FArray.h:47
FArray< Data, Capacity > & operator=(FArray< Data, Capacity > const &other)
Assignment, element by element.
Definition: FArray.h:181
void begin(ConstArrayIterator< Data > &iterator) const
Set a ConstArrayIterator to the beginning of this Array.
Definition: FArray.h:224
int packedSize()
Return packed size in a MemoryArchive, in bytes.
Definition: FArray.h:284
int capacity() const
Return number of elements in this FArray.
Definition: FArray.h:205
void serialize(Archive &ar, const unsigned int version)
Serialize a FArray to/from an Archive.
Definition: FArray.h:272
Data & operator[](int i)
Mimic C array subscripting.
Definition: FArray.h:235
Data * cArray()
Return pointer to underlying C array.
Definition: FArray.h:257
FArray(FArray< Data, Capacity > const &other)
Copy constructor.
Definition: FArray.h:163
int size() const
Return number of elements in this FArray.
Definition: FArray.h:198
FArray()
Constructor.
Definition: FArray.h:154
Data const * cArray() const
Return pointer to const to underlying C array.
Definition: FArray.h:264
static void commitMpiType()
Commit associated MPI DataType.
Definition: FArray.h:292
void begin(ArrayIterator< Data > &iterator)
Set an ArrayIterator to the beginning of this Array.
Definition: FArray.h:213
A MpiStructBuilder objects is used to create an MPI Struct datatype.
void addMember(void *memberAddress, MPI::Datatype type, int count=1)
Add a new member variable to the type map.
void setBase(void *objectAddress)
Set address of an class instance.
void commit(MPI::Datatype &newType)
Build and commit a user-defined MPI Struct datatype.
Default MpiTraits class.
Definition: MpiTraits.h:40
File containing preprocessor macros for error handling.
Utility classes for scientific computation.
Definition: accumulators.mod:1