PSCF v1.1
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
22namespace 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>
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
Saving archive for character based ostream.
TextFileOArchive & operator<<(T &data)
Save one T object to this archive.
TextFileOArchive()
Constructor.
static bool is_loading()
Returns false;.
static bool is_saving()
Returns true;.
virtual ~TextFileOArchive()
Destructor.
TextFileOArchive & operator&(T &data)
Save one T object to this archive.
std::ofstream & file()
Get the underlying ifstream by reference.
void pack(const T &data)
Save one T object to this archive.
Utility classes for scientific computation.
Definition: accumulators.mod:1