PSCF v1.1
XdrFileOArchive.h
1#ifndef UTIL_XDR_FILE_O_ARCHIVE_H
2#define UTIL_XDR_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 "serialize.h"
12#include <util/space/Vector.h>
13#include <util/space/IntVector.h>
14
15#include <complex>
16#include <vector>
17#include <string>
18
19#include <rpc/rpc.h>
20#include <rpc/xdr.h>
21#include <stdio.h>
22
23namespace Util
24{
25
40 {
41
42 public:
43
45 static bool is_saving();
46
48 static bool is_loading();
49
54
60 XdrFileOArchive(std::string filename);
61
65 virtual ~XdrFileOArchive();
66
72 void init(FILE* file);
73
77 FILE* file();
78
82 template <typename T>
84
88 template <typename T>
90
94 XDR* xdrPtr();
95
96 private:
97
99 XDR xdr_;
100
102 FILE* filePtr_;
103
105 unsigned int version_;
106
107 };
108
109 // Inline methods
110
112 { return true; }
113
115 { return false; }
116
117 // Inline non-static methods
118
119 /*
120 * Write one object.
121 */
122 template <typename T>
124 {
125 serialize(*this, data, version_);
126 return *this;
127 }
128
129 /*
130 * Write one object.
131 */
132 template <typename T>
134 {
135 serialize(*this, data, version_);
136 return *this;
137 }
138
139 /*
140 * Get a C file handle.
141 */
143 { return filePtr_; }
144
145 /*
146 * Get a pointer to XDR object.
147 */
149 { return &xdr_; }
150
151 // Explicit serialize functions for primitive types
152
153 /*
154 * Save a bool to a XdrFileOArchive.
155 */
156 template <>
157 inline void serialize(XdrFileOArchive& ar, bool& data,
158 const unsigned int version)
159 {
160 bool_t temp = data;
161 xdr_bool(ar.xdrPtr(), &temp);
162 }
163
164 /*
165 * Save a char to a XdrFileOArchive.
166 */
167 template <>
168 inline void serialize(XdrFileOArchive& ar, char& data,
169 const unsigned int version)
170 { xdr_char(ar.xdrPtr(), &data); }
171
172 /*
173 * Save an unsigned int to a XdrFileOArchive.
174 */
175 template <>
176 inline void serialize(XdrFileOArchive& ar, unsigned int& data,
177 const unsigned int version)
178 { xdr_u_int(ar.xdrPtr(), &data); }
179
180 /*
181 * Save an int to a XdrFileOArchive.
182 */
183 template <>
184 inline void serialize(XdrFileOArchive& ar, int& data,
185 const unsigned int version)
186 { xdr_int(ar.xdrPtr(), &data); }
187
188 #if 0
189 /*
190 * Save an unsigned long int to a XdrFileOArchive.
191 */
192 template <>
193 inline void serialize(XdrFileOArchive& ar, unsigned long& data,
194 const unsigned int version)
195 { xdr_u_long(ar.xdrPtr(), &data); }
196
197 /*
198 * Save a long int to a XdrFileOArchive.
199 */
200 template <>
201 inline void serialize(XdrFileOArchive& ar, long& data,
202 const unsigned int version)
203 { xdr_long(ar.xdrPtr(), &data); }
204 #endif
205
206 /*
207 * Save a float to a XdrFileOArchive.
208 */
209 template <>
210 inline void serialize(XdrFileOArchive& ar, float& data,
211 const unsigned int version)
212 { xdr_float(ar.xdrPtr(), &data); }
213
214 /*
215 * Save a double to a XdrFileOArchive.
216 */
217 template <>
218 inline void serialize(XdrFileOArchive& ar, double& data,
219 const unsigned int version)
220 { xdr_double(ar.xdrPtr(), &data); }
221
222 /*
223 * Save a std::vector to a XdrFileOArchive.
224 */
225 template <typename T>
226 void serialize(XdrFileOArchive& ar, std::vector<T>& data,
227 const unsigned int version)
228 {
229 unsigned int size = data.size();
230 xdr_u_int(ar.xdrPtr(), &size);
231 for (size_t i = 0; i < size; ++i) {
232 ar & data[i];
233 }
234 }
235
236 // Explicit serialize functions for std library types
237
238 /*
239 * Save a std::complex<float> to a XdrFileOArchive.
240 */
241 template <>
242 inline
243 void serialize(XdrFileOArchive& ar, std::complex<float>& data,
244 const unsigned int version)
245 {
246 float a = data.real();
247 float b = data.imag();
248 xdr_float(ar.xdrPtr(), &a);
249 xdr_float(ar.xdrPtr(), &b);
250 }
251
252 /*
253 * Save a std::complex<double> to a XdrFileOArchive.
254 */
255 template <>
256 inline
257 void serialize(XdrFileOArchive& ar, std::complex<double>& data,
258 const unsigned int version)
259 {
260 double a = data.real();
261 double b = data.imag();
262 xdr_double(ar.xdrPtr(), &a);
263 xdr_double(ar.xdrPtr(), &b);
264 }
265
266 /*
267 * Save a std::string to a XdrFileOArchive.
268 */
269 template <>
270 void serialize(XdrFileOArchive& ar, std::string& data,
271 const unsigned int version);
272
273 // Explicit serialize functions for namespace Util
274
275 /*
276 * Save a Util::Vector to a XdrFileOArchive.
277 */
278 template <>
279 inline void serialize(XdrFileOArchive& ar, Vector& data,
280 const unsigned int version)
281 {
282 ar & data[0];
283 ar & data[1];
284 ar & data[2];
285 }
286
287 /*
288 * Save a Util::IntVector to a XdrFileOArchive.
289 */
290 template <>
291 inline void serialize(XdrFileOArchive& ar, IntVector& data,
292 const unsigned int version)
293 {
294 ar & data[0];
295 ar & data[1];
296 ar & data[2];
297 }
298
299}
300#endif
Saving / output archive for binary XDR file.
XDR * xdrPtr()
Get a pointer to the enclosed XDR object.
XdrFileOArchive()
Constructor.
static bool is_loading()
Returns false;.
FILE * file()
Get the underlying ifstream by reference.
static bool is_saving()
Returns true;.
virtual ~XdrFileOArchive()
Destructor.
void init(FILE *file)
Associate with an open file and initialize.
XdrFileOArchive & operator&(T &data)
Save one object.
XdrFileOArchive & operator<<(T &data)
Save one object.
Utility classes for scientific computation.
Definition: accumulators.mod:1