Simpatico  v1.10
BinaryFileIArchive.h
1 #ifndef UTIL_BINARY_FILE_I_ARCHIVE_H
2 #define UTIL_BINARY_FILE_I_ARCHIVE_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 "Byte.h"
12 #include "serialize.h"
13 
14 #include <util/space/Vector.h>
15 #include <util/space/IntVector.h>
16 
17 #include <complex>
18 #include <string>
19 #include <vector>
20 #include <iostream>
21 
22 namespace Util
23 {
24 
31  {
32 
33  public:
34 
36  static bool is_saving();
37 
39  static bool is_loading();
40 
45 
51  BinaryFileIArchive(std::string filename);
52 
58  BinaryFileIArchive(std::ifstream& file);
59 
63  virtual ~BinaryFileIArchive();
64 
68  std::ifstream& file();
69 
73  template <typename T>
75 
79  template <typename T>
81 
85  template <typename T>
86  void unpack(T& data);
87 
94  template <typename T>
95  void unpack(T* array, int n);
96 
110  template <typename T>
111  void unpack(T* array, int m, int n, int np);
112 
113  private:
114 
116  std::ifstream* filePtr_;
117 
119  unsigned int version_;
120 
122  bool createdFile_;
123 
124  };
125 
126  // Inline methods
127 
129  { return false; }
130 
132  { return true; }
133 
134  // Inline non-static method templates
135 
136  /*
137  * Read one object.
138  */
139  template <typename T>
141  {
142  serialize(*this, data, version_);
143  return *this;
144  }
145 
146  /*
147  * Read one object.
148  */
149  template <typename T>
151  {
152  serialize(*this, data, version_);
153  return *this;
154  }
155 
156  // Method templates
157 
158  /*
159  * Load a single object of type T.
160  */
161  template <typename T>
162  inline void BinaryFileIArchive::unpack(T& data)
163  { filePtr_->read( (char*)(&data), sizeof(T) ); }
164 
165  /*
166  * Load a C-array of objects of type T.
167  */
168  template <typename T>
169  inline void BinaryFileIArchive::unpack(T* array, int n)
170  {
171  for (int i=0; i < n; ++i) {
172  filePtr_->read( (char*)(&array[i]), sizeof(T));
173  }
174  }
175 
176  /*
177  * Unpack a 2D C-array of objects of type T.
178  */
179  template <typename T>
180  inline void BinaryFileIArchive::unpack(T* array, int m, int n, int np)
181  {
182  int i, j;
183  for (i = 0; i < m; ++i) {
184  for (j = 0; j < n; ++j) {
185  filePtr_->read( (char*)(&array[i*np + j]), sizeof(T));
186  }
187  }
188  }
189 
190  // Explicit serialize functions for primitive types
191 
192  /*
193  * Load a bool from a BinaryFileIArchive.
194  */
195  template <>
196  inline void serialize(BinaryFileIArchive& ar, bool& data,
197  const unsigned int version)
198  { ar.unpack(data); }
199 
200  /*
201  * Load a char from a BinaryFileIArchive.
202  */
203  template <>
204  inline void serialize(BinaryFileIArchive& ar, char& data,
205  const unsigned int version)
206  { ar.unpack(data); }
207 
208  /*
209  * Load an unsigned int from a BinaryFileIArchive.
210  */
211  template <>
212  inline void serialize(BinaryFileIArchive& ar, unsigned int& data,
213  const unsigned int version)
214  { ar.unpack(data); }
215 
216  /*
217  * Load an int from a BinaryFileIArchive.
218  */
219  template <>
220  inline void serialize(BinaryFileIArchive& ar, int& data,
221  const unsigned int version)
222  { ar.unpack(data); }
223 
224  /*
225  * Load an unsigned long int from a BinaryFileIArchive.
226  */
227  template <>
228  inline void serialize(BinaryFileIArchive& ar, unsigned long& data,
229  const unsigned int version)
230  { ar.unpack(data); }
231 
232  /*
233  * Load a long int from a BinaryFileIArchive.
234  */
235  template <>
236  inline void serialize(BinaryFileIArchive& ar, long& data,
237  const unsigned int version)
238  { ar.unpack(data); }
239 
240  /*
241  * Load a float from a BinaryFileIArchive.
242  */
243  template <>
244  inline void serialize(BinaryFileIArchive& ar, float& data,
245  const unsigned int version)
246  { ar.unpack(data); }
247 
248  /*
249  * Load a double from a BinaryFileIArchive.
250  */
251  template <>
252  inline void serialize(BinaryFileIArchive& ar, double& data,
253  const unsigned int version)
254  { ar.unpack(data); }
255 
256  /*
257  * Load a std::vector from a BinaryFileIArchive.
258  */
259  template <typename T>
260  void serialize(BinaryFileIArchive& ar, std::vector<T>& data,
261  const unsigned int version)
262  {
263  T element;
264  std::size_t size;
265  ar.unpack(size);
266  data.reserve(size);
267  data.clear();
268  for (size_t i = 0; i < size; ++i) {
269  ar & element;
270  data.push_back(element);
271  }
272  }
273 
274  // Explicit serialize functions for std library types
275 
276  /*
277  * Load a std::complex<float> from a BinaryFileIArchive.
278  */
279  template <>
280  inline
281  void serialize(BinaryFileIArchive& ar, std::complex<float>& data,
282  const unsigned int version)
283  { ar.unpack(data); }
284 
285  /*
286  * Load a std::complex<double> from a BinaryFileIArchive.
287  */
288  template <>
289  inline
290  void serialize(BinaryFileIArchive& ar, std::complex<double>& data,
291  const unsigned int version)
292  { ar.unpack(data); }
293 
294  /*
295  * Load a std::string from a BinaryFileIArchive.
296  */
297  template <>
298  void serialize(BinaryFileIArchive& ar, std::string& data,
299  const unsigned int version);
300 
301  // Explicit serialize functions for namespace Util types
302 
303  /*
304  * Load a Util::Vector from a BinaryFileIArchive.
305  */
306  template <>
307  inline void serialize(BinaryFileIArchive& ar, Vector& data,
308  const unsigned int version)
309  { ar.unpack(data); }
310 
311  /*
312  * Load a Util::IntVector from a BinaryFileIArchive.
313  */
314  template <>
315  inline void serialize(BinaryFileIArchive& ar, IntVector& data,
316  const unsigned int version)
317  { ar.unpack(data); }
318 
319 }
320 #endif
A Vector is a Cartesian vector.
Definition: Vector.h:75
virtual ~BinaryFileIArchive()
Destructor.
static bool is_saving()
Returns true;.
BinaryFileIArchive & operator>>(T &data)
Read one object.
Utility classes for scientific computation.
Definition: accumulators.mod:1
BinaryFileIArchive & operator&(T &data)
Read one object.
static bool is_loading()
Returns false;.
void unpack(T &data)
Unpack a single T object.
Saving archive for binary istream.
std::ifstream & file()
Get the underlying ifstream by reference.
An IntVector is an integer Cartesian vector.
Definition: IntVector.h:73