File: fileArchive.h

package info (click to toggle)
groops 0%2Bgit20240830%2Bds-1
  • links: PTS, VCS
  • area: non-free
  • in suites: trixie
  • size: 11,052 kB
  • sloc: cpp: 134,939; fortran: 1,569; makefile: 20
file content (147 lines) | stat: -rw-r--r-- 3,549 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/***********************************************/
/**
* @file fileArchive.h
*
* read and write archives files.
*
* @author Torsten Mayer-Guerr
* @date 2005-01-01
*
*/
/***********************************************/

#ifndef __GROOPS_FILEARCHIVE__
#define __GROOPS_FILEARCHIVE__

#include "base/exception.h"
#include "inputOutput/archive.h"
#include "inputOutput/file.h"

/** @addtogroup archiveGroup */
/// @{

/***** CONSTANTS ********************************/

const UInt FILE_VERSION = 20200123;    // date of last change (ArcList, InstrumentFile restructured)
// const UInt FILE_VERSION = 20190429; // date of last change (SatelliteModel Surface hasThermalReemission)
// const UInt FILE_VERSION = 20190304; // date of last change (GnssStationInfo)
// const UInt FILE_VERSION = 20170920; // date of last change
// const UInt FILE_VERSION = 20150524; // date of last change

/***** CLASS ***********************************/

class OutFileArchive
{
  OutFile     file;
  OutArchive *archive;

public:
  OutFileArchive() : archive(nullptr)  {}
  OutFileArchive(const FileName &fileName, const std::string &type);
 ~OutFileArchive();

  OutFileArchive(const InFile &) = delete;
  OutFileArchive &operator=(const InFile &) = delete;

  void open(const FileName &fileName, const std::string &type);
  void close();

  FileName fileName() const {return file.fileName();}

  OutArchive &outArchive() {return *archive;}
  void comment(const std::string &text);

  template<typename T> inline OutFileArchive &operator<<(const T &x);
};

/***** CLASS ***********************************/

class InFileArchive
{
  InFile     file;
  InArchive *archive;

public:
  InFileArchive() : archive(nullptr) {}
  InFileArchive(const FileName &fileName, const std::string &type);
 ~InFileArchive();

  InFileArchive(const InFile &) = delete;
  InFileArchive &operator=(const InFile &) = delete;

  void open(const FileName &fileName, const std::string &type);
  void close();

  FileName    fileName() const {return file.fileName();}
  std::string type()     const;
  UInt        version()  const;

  Bool           canSeek() const;
  std::streampos position();
  void           seek(std::streampos pos);

  template<typename T> inline InFileArchive &operator>>(T &x);
  template<typename T> inline InFileArchive &operator>>(const T &x);
};

/// @}

/***********************************************/
/***** INLINES *********************************/
/***********************************************/

template<typename T>
inline OutFileArchive &OutFileArchive::operator<<(const T &x)
{
  try
  {
    if(!archive)
      throw(Exception("no file open"));
    (*archive)<<x;
    return *this;
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW_EXTRA("filename=<"+file.fileName().str()+">", e)
  }
}

/***********************************************/

template<typename T>
inline InFileArchive &InFileArchive::operator>>(T &x)
{
  try
  {
    if(!archive)
      throw(Exception("no file open"));
    (*archive)>>x;
    return *this;
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW_EXTRA("filename=<"+file.fileName().str()+">", e)
  }
}

/***********************************************/

template<typename T>
inline InFileArchive &InFileArchive::operator>>(const T &x)
{
  try
  {
    if(!archive)
      throw(Exception("no file open"));
    (*archive)>>x;
    return *this;
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW_EXTRA("filename=<"+file.fileName().str()+">", e)
  }
}

/***********************************************/

#endif /* __GROOPS__ */