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