PSCF v1.1
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
22namespace 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
Saving archive for binary istream.
BinaryFileIArchive & operator>>(T &data)
Read one object.
static bool is_loading()
Returns false;.
void unpack(T &data)
Unpack a single T object.
std::ifstream & file()
Get the underlying ifstream by reference.
virtual ~BinaryFileIArchive()
Destructor.
BinaryFileIArchive & operator&(T &data)
Read one object.
static bool is_saving()
Returns true;.
Utility classes for scientific computation.
Definition: accumulators.mod:1