Simpatico  v1.10
TextFileOArchive.h
1 #ifndef UTIL_TEXT_FILE_O_ARCHIVE_H
2 #define UTIL_TEXT_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 <string>
19 #include <vector>
20 #include <fstream>
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  TextFileOArchive(std::string filename);
52 
58  TextFileOArchive(std::ofstream& file);
59 
63  virtual ~TextFileOArchive();
64 
68  std::ofstream& file();
69 
73  template <typename T>
74  TextFileOArchive& operator & (T& data);
75 
79  template <typename T>
81 
87  template <typename T>
88  void pack(const T& data);
89 
96  template <typename T>
97  void pack(const T* array, int n);
98 
107  template <typename T>
108  void pack(const T* array, int m, int n, int np);
109 
110  private:
111 
113  std::ofstream* filePtr_;
114 
116  unsigned int version_;
117 
119  bool createdFile_;
120 
121  };
122 
123  // Inline methods
124 
126  { return true; }
127 
129  { return false; }
130 
131  // Inline non-static method templates.
132 
133  /*
134  * Save one object.
135  */
136  template <typename T>
138  {
139  serialize(*this, data, version_);
140  return *this;
141  }
142 
143  /*
144  * Save one object to this archive.
145  */
146  template <typename T>
148  {
149  serialize(*this, data, version_);
150  return *this;
151  }
152 
153  // Method templates
154 
155  /*
156  * Save a single object of type T.
157  */
158  template <typename T>
159  inline void TextFileOArchive::pack(const T& data)
160  { *filePtr_ << data << std::endl; }
161 
162  /*
163  * Save a single object of type double.
164  */
165  template <>
166  inline void TextFileOArchive::pack(const double& data)
167  {
168  filePtr_->setf(std::ios::scientific);
169  filePtr_->width(25);
170  filePtr_->precision(17);
171  *filePtr_ << data << std::endl;
172  }
173 
174  /*
175  * Save a C-array of objects of type T.
176  */
177  template <typename T>
178  inline void TextFileOArchive::pack(const T* array, int n)
179  {
180  for (int i=0; i < n; ++i) {
181  *filePtr_ << array[i] << " ";
182  }
183  *filePtr_ << std::endl;
184  }
185 
186  /*
187  * Pack a 2D C-array of objects of type T, from array type T array[][np].
188  */
189  template <typename T>
190  inline void TextFileOArchive::pack(const T* array, int m, int n, int np)
191  {
192  int i, j;
193  for (i=0; i < m; ++i) {
194  for (j=0; j < n; ++j) {
195  *filePtr_ << array[i*np + j] << " ";
196  }
197  *filePtr_ << std::endl;
198  }
199  }
200 
201  /*
202  * Pack a C-array of double values.
203  */
204  template <>
205  inline void TextFileOArchive::pack(const double* array, int n)
206  {
207  filePtr_->setf(std::ios::scientific);
208  filePtr_->precision(16);
209  for (int i=0; i < n; ++i) {
210  filePtr_->width(25);
211  *filePtr_ << array[i] << " ";
212  }
213  *filePtr_ << std::endl;
214  }
215 
216  // Explicit serialize functions for primitive types
217 
218  /*
219  * Save a bool to a TextFileOArchive.
220  */
221  template <>
222  inline void serialize(TextFileOArchive& ar, bool& data,
223  const unsigned int version)
224  { ar.pack(data); }
225 
226  /*
227  * Save a char to a TextFileOArchive.
228  */
229  template <>
230  inline void serialize(TextFileOArchive& ar, char& data,
231  const unsigned int version)
232  { ar.pack(data); }
233 
234  /*
235  * Save an unsigned int to a TextFileOArchive.
236  */
237  template <>
238  inline void serialize(TextFileOArchive& ar, unsigned int& data,
239  const unsigned int version)
240  { ar.pack(data); }
241 
242  /*
243  * Save an int to a TextFileOArchive.
244  */
245  template <>
246  inline void serialize(TextFileOArchive& ar, int& data,
247  const unsigned int version)
248  { ar.pack(data); }
249 
250  /*
251  * Save an unsigned long int to a TextFileOArchive.
252  */
253  template <>
254  inline void serialize(TextFileOArchive& ar, unsigned long& data,
255  const unsigned int version)
256  { ar.pack(data); }
257 
258  /*
259  * Save a long int to a TextFileOArchive.
260  */
261  template <>
262  inline void serialize(TextFileOArchive& ar, long& data,
263  const unsigned int version)
264  { ar.pack(data); }
265 
266  /*
267  * Save a float to a TextFileOArchive.
268  */
269  template <>
270  inline void serialize(TextFileOArchive& ar, float& data,
271  const unsigned int version)
272  { ar.pack(data); }
273 
274  /*
275  * Save an double to a TextFileOArchive.
276  */
277  template <>
278  inline void serialize(TextFileOArchive& ar, double& data,
279  const unsigned int version)
280  { ar.pack(data); }
281 
282  /*
283  * Save a std::vector to a TextFileOArchive.
284  */
285  template <typename T>
286  void serialize(TextFileOArchive& ar, std::vector<T>& data,
287  const unsigned int version)
288  {
289  size_t size = data.size();
290  ar.pack(size);
291  for (size_t i = 0; i < size; ++i) {
292  ar & data[i];
293  }
294  }
295 
296  // Explicit serialize functions for standard library types
297 
298  /*
299  * Save a std::complex<float> to a TextFileOArchive.
300  */
301  template <>
302  inline
303  void serialize(TextFileOArchive& ar, std::complex<float>& data,
304  const unsigned int version)
305  { ar.pack(data); }
306 
307  /*
308  * Save a std::complex<double> to a TextFileOArchive.
309  */
310  template <>
311  inline
312  void serialize(TextFileOArchive& ar, std::complex<double>& data,
313  const unsigned int version)
314  { ar.pack(data); }
315 
316  /*
317  * Save a std::string to a TextFileOArchive.
318  */
319  template <>
320  inline void serialize(TextFileOArchive& ar, std::string& data,
321  const unsigned int version)
322  {
323  int size = data.size();
324  ar.pack(size);
325  if (size > 0) {
326  ar.pack(data);
327  }
328  }
329 
330  // Explicit serialize functions for namespace Util
331 
332  /*
333  * Save a Util::Vector to a TextFileOArchive.
334  */
335  template <>
336  inline void serialize(TextFileOArchive& ar, Vector& data,
337  const unsigned int version)
338  { ar.pack(data); }
339 
340  /*
341  * Save a Util::IntVector to a TextFileOArchive.
342  */
343  template <>
344  inline void serialize(TextFileOArchive& ar, IntVector& data,
345  const unsigned int version)
346  { ar.pack(data); }
347 
348 }
349 #endif
A Vector is a Cartesian vector.
Definition: Vector.h:75
static bool is_saving()
Returns true;.
void pack(const T &data)
Save one T object to this archive.
std::ofstream & file()
Get the underlying ifstream by reference.
virtual ~TextFileOArchive()
Destructor.
Utility classes for scientific computation.
Definition: accumulators.mod:1
TextFileOArchive & operator&(T &data)
Save one T object to this archive.
static bool is_loading()
Returns false;.
An IntVector is an integer Cartesian vector.
Definition: IntVector.h:73
TextFileOArchive()
Constructor.
TextFileOArchive & operator<<(T &data)
Save one T object to this archive.
Saving archive for character based ostream.