Simpatico  v1.10
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 
23 namespace 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>
83  XdrFileOArchive& operator & (T& data);
84 
88  template <typename T>
89  XdrFileOArchive& operator << (T& data);
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  */
142  inline FILE* XdrFileOArchive::file()
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
A Vector is a Cartesian vector.
Definition: Vector.h:75
static bool is_saving()
Returns true;.
FILE * file()
Get the underlying ifstream by reference.
virtual ~XdrFileOArchive()
Destructor.
Saving / output archive for binary XDR file.
XdrFileOArchive & operator&(T &data)
Save one object.
Utility classes for scientific computation.
Definition: accumulators.mod:1
static bool is_loading()
Returns false;.
void init(FILE *file)
Associate with an open file and initialize.
XDR * xdrPtr()
Get a pointer to the enclosed XDR object.
An IntVector is an integer Cartesian vector.
Definition: IntVector.h:73
XdrFileOArchive & operator<<(T &data)
Save one object.
XdrFileOArchive()
Constructor.