Simpatico  v1.10
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 
20 namespace Util
21 {
22 
45  template <typename Data, int Capacity>
46  class FArray
47  {
48 
49  public:
50 
54  FArray();
55 
61  FArray(const FArray<Data, Capacity>& other);
62 
71 
72  // Default destructor is okay.
73 
77  int size() const;
78 
82  int capacity() const;
83 
89  void begin(ArrayIterator<Data> &iterator);
90 
96  void begin(ConstArrayIterator<Data> &iterator) const;
97 
104  Data& operator[] (int i);
105 
112  const Data& operator[] (int i) const;
113 
117  Data* cArray();
118 
122  const Data* cArray() const;
123 
130  template <class Archive>
131  void serialize(Archive& ar, const unsigned int version);
132 
136  int packedSize();
137 
138  #ifdef UTIL_MPI
139 
142  static void commitMpiType();
143  #endif
144 
145  private:
146 
148  Data data_[Capacity];
149 
150  };
151 
152  /*
153  * Constructor.
154  */
155  template <typename Data, int Capacity>
157  {}
158 
159  /*
160  * Copy constructor.
161  *
162  *\param other the FArray to be copied.
163  */
164  template <typename Data, int Capacity>
166  {
167  for (int i = 0; i < Capacity; ++i) {
168  data_[i] = other.data_[i];
169  }
170  }
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  // Default constructor is okay.
195 
196  /*
197  * Return number of elements in this FArray.
198  */
199  template <typename Data, int Capacity>
200  inline int FArray<Data, Capacity>::size() const
201  { return Capacity; }
202 
203  /*
204  * Return number of elements in this FArray.
205  */
206  template <typename Data, int Capacity>
208  { return Capacity; }
209 
210  /*
211  * Set an ArrayIterator to the beginning of this Array.
212  */
213  template <typename Data, int Capacity>
215  {
216  iterator.setCurrent(data_);
217  iterator.setEnd(data_ + Capacity);
218  }
219 
220  /*
221  * Set a ConstArrayIterator to the beginning of this Array.
222  */
223  template <typename Data, int Capacity>
224  inline void
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 const Data& 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>
264  const Data* FArray<Data, Capacity>::cArray() const
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 
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;
296  FArray<Data, Capacity> object;
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
void addMember(void *memberAddress, MPI::Datatype type, int count=1)
Add a new member variable to the type map.
FArray()
Constructor.
Definition: FArray.h:156
void setCurrent(Data *ptr)
Set the current pointer value.
Definition: ArrayIterator.h:59
File containing preprocessor macros for error handling.
void setBase(void *objectAddress)
Set address of an class instance.
void commit(MPI::Datatype &newType)
Build and commit a user-defined MPI Struct datatype.
Forward const iterator for an Array or a C array.
void serialize(Archive &ar, const unsigned int version)
Serialize a FArray to/from an Archive.
Definition: FArray.h:272
void setEnd(Data *ptr)
Set the value of the end pointer.
Utility classes for scientific computation.
Definition: accumulators.mod:1
static void commitMpiType()
Commit associated MPI DataType.
Definition: FArray.h:292
Default MpiTraits class.
Definition: MpiTraits.h:39
int size() const
Return number of elements in this FArray.
Definition: FArray.h:200
Forward iterator for an Array or a C array.
Definition: ArrayIterator.h:39
A fixed size (static) contiguous array template.
Definition: FArray.h:46
int capacity() const
Return number of elements in this FArray.
Definition: FArray.h:207
A MpiStructBuilder objects is used to create an MPI Struct datatype.
Data & operator[](int i)
Mimic C array subscripting.
Definition: FArray.h:235
void setEnd(Data *ptr)
Set the value of the end pointer.
Definition: ArrayIterator.h:67
int packedSize()
Return packed size in a MemoryArchive, in bytes.
Definition: FArray.h:284
void setCurrent(Data *ptr)
Set the current pointer value.
Data * cArray()
Return pointer to underlying C array.
Definition: FArray.h:257
void begin(ArrayIterator< Data > &iterator)
Set an ArrayIterator to the beginning of this Array.
Definition: FArray.h:214
FArray< Data, Capacity > & operator=(const FArray< Data, Capacity > &other)
Assignment, element by element.
Definition: FArray.h:181