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