00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __xdr_cxx_h__
00023 #define __xdr_cxx_h__
00024
00025
00026 #include "mesh_common.h"
00027
00028
00029 #ifdef HAVE_RPC_RPC_H
00030 # include <rpc/rpc.h>
00031 #endif
00032
00033 #include <fstream>
00034 #include <iomanip>
00035 #include <vector>
00036 #include <string>
00037 #ifdef USE_COMPLEX_NUMBERS
00038 # include <complex>
00039 #endif
00040
00041 #define xdr_MAX_STRING_LENGTH 256
00042
00043 #ifndef SINGLE_PRECISION
00044 #define xdr_REAL xdr_double
00045 #else
00046 #define xdr_REAL xdr_float
00047 #endif
00048
00049
00050
00051
00052
00053
00062 class Xdr
00063 {
00064
00065 public:
00066
00070 enum XdrMODE {UNKNOWN = -1, ENCODE=0, DECODE, WRITE, READ};
00071
00076 Xdr (const std::string& name="", const XdrMODE m=UNKNOWN);
00077
00081 ~Xdr ();
00082
00086 void open (const std::string& name);
00087
00091 void close();
00092
00097 bool is_open() const;
00098
00103 bool reading() const { return ((mode == DECODE) || (mode == READ)); };
00104
00109 bool writing() const { return ((mode == ENCODE) || (mode == WRITE)); };
00110
00115 XdrMODE access_mode() const { return mode; };
00116
00117
00118
00122 void data(int& a, const char* comment="");
00123
00127 Xdr& operator << (int& a) { assert (writing()); data(a); return *this; };
00128
00132 Xdr& operator >> (int& a) { assert (reading()); data(a); return *this; };
00133
00137 void data(unsigned int& a, const char* comment="");
00138
00142 Xdr& operator << (unsigned int& a) { assert (writing()); data(a); return *this; };
00143
00147 Xdr& operator >> (unsigned int& a) { assert (reading()); data(a); return *this; };
00148
00152 void data(short int& a, const char* comment="");
00153
00157 Xdr& operator << (short int& a) { assert (writing()); data(a); return *this; };
00158
00162 Xdr& operator >> (short int& a) { assert (reading()); data(a); return *this; };
00163
00167 void data(unsigned short int& a, const char* comment="");
00168
00172 Xdr& operator << (unsigned short int& a) { assert (writing()); data(a); return *this; };
00173
00177 Xdr& operator >> (unsigned short int& a) { assert (reading()); data(a); return *this; };
00178
00182 void data(float& a, const char* comment="");
00183
00187 Xdr& operator << (float& a) { assert (writing()); data(a); return *this; };
00188
00192 Xdr& operator >> (float& a) { assert (reading()); data(a); return *this; };
00193
00197 void data(double& a, const char* comment="");
00198
00202 Xdr& operator << (double& a) { assert (writing()); data(a); return *this; };
00203
00207 Xdr& operator >> (double& a) { assert (reading()); data(a); return *this; };
00208
00209
00210 #ifdef USE_COMPLEX_NUMBERS
00211
00215 void data(std::complex<float>& a, const char* comment="");
00216
00220 Xdr& operator << (std::complex<float>& a) { assert (writing()); data(a); return *this; };
00221
00225 Xdr& operator >> (std::complex<float>& a) { assert (reading()); data(a); return *this; };
00226
00230 void data(std::complex<double>& a, const char* comment="");
00231
00235 Xdr& operator << (std::complex<double>& a) { assert (writing()); data(a); return *this; };
00236
00240 Xdr& operator >> (std::complex<double>& a) { assert (reading()); data(a); return *this; };
00241
00242
00243 #endif
00244
00248 void data(std::vector<int>& v, const char* comment="");
00249
00253 Xdr& operator << (std::vector<int>& v) { assert (writing()); data(v); return *this; };
00254
00258 Xdr& operator >> (std::vector<int>& v) { assert (reading()); data(v); return *this; };
00259
00263 void data(std::vector<unsigned int>& v, const char* comment="");
00264
00268 Xdr& operator << (std::vector<unsigned int>& v) { assert (writing()); data(v); return *this; };
00269
00273 Xdr& operator >> (std::vector<unsigned int>& v) { assert (reading()); data(v); return *this; };
00274
00278 void data(std::vector<short int>& v, const char* comment="");
00279
00283 Xdr& operator << (std::vector<short int>& v) { assert (writing()); data(v); return *this; };
00284
00288 Xdr& operator >> (std::vector<short int>& v) { assert (reading()); data(v); return *this; };
00289
00293 void data(std::vector<unsigned short int>& v, const char* comment="");
00294
00298 Xdr& operator << (std::vector<unsigned short int>& v) { assert (writing()); data(v); return *this; };
00299
00303 Xdr& operator >> (std::vector<unsigned short int>& v) { assert (reading()); data(v); return *this; };
00304
00308 void data(std::vector<float>& v, const char* comment="");
00309
00313 Xdr& operator << (std::vector<float>& v) { assert (writing()); data(v); return *this; };
00314
00318 Xdr& operator >> (std::vector<float>& v) { assert (reading()); data(v); return *this; };
00319
00323 void data(std::vector<double>& v, const char* comment="");
00324
00328 Xdr& operator << (std::vector<double>& v) { assert (writing()); data(v); return *this; };
00329
00333 Xdr& operator >> (std::vector<double>& v) { assert (reading()); data(v); return *this; };
00334
00335
00336 #ifdef USE_COMPLEX_NUMBERS
00337
00341 void data(std::vector< std::complex<float> >& v, const char* comment="");
00342
00346 Xdr& operator << (std::vector< std::complex<float> >& v) { assert (writing()); data(v); return *this; };
00347
00351 Xdr& operator >> (std::vector< std::complex<float> >& v) { assert (reading()); data(v); return *this; };
00352
00356 void data(std::vector< std::complex<double> >& v, const char* comment="");
00357
00361 Xdr& operator << (std::vector< std::complex<double> >& v) { assert (writing()); data(v); return *this; };
00362
00366 Xdr& operator >> (std::vector< std::complex<double> >& v) { assert (reading()); data(v); return *this; };
00367
00368 #endif
00369
00370
00374 void data(std::string& s, const char* comment="");
00375
00379 Xdr& operator << (std::string& v) { assert (writing()); data(v); return *this; };
00380
00384 Xdr& operator >> (std::string& v) { assert (reading()); data(v); return *this; };
00385
00386
00387 private:
00388
00392 const XdrMODE mode;
00393
00394 #ifdef HAVE_RPC_RPC_H
00395
00402 XDR* xdrs;
00403
00404 #endif
00405
00409 FILE* fp;
00410
00414 std::ofstream out;
00415
00419 std::ifstream in;
00420
00424 const int comm_len;
00425 char comm[xdr_MAX_STRING_LENGTH];
00426 };
00427
00428
00429
00430 #endif