3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
8 * See LICENSING which should be included
9 * along with this file for more details
12 #ifndef __FELIB_SAVE_H__
13 #define __FELIB_SAVE_H__
34 // ////////////////////////////////////////////////////////////////////////// //
35 #define RAW_SAVE_LOAD(type) \
36 inline outputfile &operator << (outputfile &SaveFile, type Value) { \
37 SaveFile.Write(reinterpret_cast<char *>(&Value), sizeof(Value)); \
41 inline inputfile &operator >> (inputfile &SaveFile, type &Value) { \
42 SaveFile.Read(reinterpret_cast<char *>(&Value), sizeof(Value)); \
47 // ////////////////////////////////////////////////////////////////////////// //
52 typedef std::map
<festring
, sLong
> valuemap
;
55 // ////////////////////////////////////////////////////////////////////////// //
58 outputfile (cfestring
&FileName
, truth maxcomp
, truth AbortOnErr
=true);
62 void Write (cchar
*Offset
, sLong Size
);
63 truth
IsOpen () { return (Buffer
!= 0); }
78 // ////////////////////////////////////////////////////////////////////////// //
82 inputfile (cfestring
&aFileName
, truth AbortOnErr
=true);
83 virtual ~inputfile ();
85 bool Open (cfestring
&aFileName
, truth AbortOnErr
=true);
87 int Get (); // returns EOF on eof
88 void Read (char *Offset
, sLong Size
);
89 truth
IsOpen () { return (Buffer
!= 0); }
92 void SeekPosBegin (sLong Offset
);
93 void SeekPosCurrent (sLong Offset
);
94 void SeekPosEnd (sLong Offset
);
96 cfestring
&GetFileName () const { return mRetFName
; }
99 static truth
fileExists (const festring
&fname
);
100 static festring
GetMyDir ();
101 static festring
buildIncludeName (cfestring
&basename
, cfestring incname
);
110 festring mRetFName
; // with `GetMyDir()` stripped
117 // ////////////////////////////////////////////////////////////////////////// //
118 /* Reads a binary form variable of type type and returns it.
119 * An inputfile template member function would be far more elegant,
120 * but VC doesn't seem to understand it. */
121 template <class type
> inline type
_ReadType_ (inputfile
&SaveFile
, const char *tag
) {
124 //fprintf(stderr, "ReadType: [%s]\n", tag);
125 SaveFile
>> Variable
;
129 #define ReadType(typename,fl) _ReadType_<typename>(fl, #typename)
132 // ////////////////////////////////////////////////////////////////////////// //
133 inline outputfile
&operator << (outputfile
&SaveFile
, char Value
) {
139 inline inputfile
&operator >> (inputfile
&SaveFile
, char &Value
) {
140 Value
= SaveFile
.Get();
145 inline outputfile
&operator << (outputfile
&SaveFile
, uChar Value
) {
151 inline inputfile
&operator >> (inputfile
&SaveFile
, uChar
&Value
) {
152 Value
= SaveFile
.Get();
157 inline outputfile
&operator << (outputfile
&SaveFile
, short Value
) {
159 SaveFile
.Put(Value
>> 8);
164 inline inputfile
&operator >> (inputfile
&SaveFile
, short &Value
) {
165 int LowWord
= SaveFile
.Get();
166 Value
= SaveFile
.Get() << 8 | LowWord
;
171 inline outputfile
&operator << (outputfile
&SaveFile
, uShort Value
) {
173 SaveFile
.Put(Value
>> 8);
178 inline inputfile
&operator >> (inputfile
&SaveFile
, uShort
&Value
) {
179 int LowWord
= SaveFile
.Get();
180 Value
= SaveFile
.Get() << 8 | LowWord
;
185 //RAW_SAVE_LOAD(sLong); //k8:64
186 //RAW_SAVE_LOAD(feuLong); //k8:64
189 RAW_SAVE_LOAD(double);
190 RAW_SAVE_LOAD(packv2
);
193 RAW_SAVE_LOAD(time_t);
196 outputfile
&operator << (outputfile
&, cfestring
&);
197 inputfile
&operator >> (inputfile
&, festring
&);
198 outputfile
&operator << (outputfile
&, cchar
*);
199 inputfile
&operator >> (inputfile
&, char *&);
202 template <class type1
, class type2
> inline outputfile
&operator << (outputfile
&SaveFile
, const std::pair
<type1
, type2
> &Pair
) {
203 SaveFile
<< Pair
.first
<< Pair
.second
;
207 template <class type1
, class type2
> inline inputfile
&operator >> (inputfile
&SaveFile
, std::pair
<type1
, type2
> &Pair
) {
208 SaveFile
>> Pair
.first
>> Pair
.second
;
212 template <class type
> inline outputfile
&operator << (outputfile
&SaveFile
, const std::vector
<type
> &Vector
) {
213 SaveFile
<< feuLong(Vector
.size());
214 for (feuLong c
= 0; c
< Vector
.size(); ++c
) SaveFile
<< Vector
[c
];
218 template <class type
> inline inputfile
&operator >> (inputfile
&SaveFile
, std::vector
<type
> &Vector
) {
219 Vector
.resize(ReadType(feuLong
, SaveFile
), type());
220 for (feuLong c
= 0; c
< Vector
.size(); ++c
) SaveFile
>> Vector
[c
];
224 template <class type
> inline outputfile
&operator << (outputfile
&SaveFile
, const std::deque
<type
> &Deque
) {
225 SaveFile
<< feuLong(Deque
.size());
226 for (feuLong c
= 0; c
< Deque
.size(); ++c
) SaveFile
<< Deque
[c
];
230 template <class type
> inline inputfile
&operator >> (inputfile
&SaveFile
, std::deque
<type
> &Deque
) {
231 Deque
.resize(ReadType(feuLong
, SaveFile
), type());
232 for (feuLong c
= 0; c
< Deque
.size(); ++c
) SaveFile
>> Deque
[c
];
236 template <class type
> inline outputfile
&operator << (outputfile
&SaveFile
, const std::list
<type
> &List
) {
237 SaveFile
<< feuLong(List
.size());
238 for (typename
std::list
<type
>::const_iterator i
= List
.begin(); i
!= List
.end(); ++i
) SaveFile
<< *i
;
242 template <class type
> inline inputfile
&operator >> (inputfile
&SaveFile
, std::list
<type
> &List
) {
243 List
.resize(ReadType(feuLong
, SaveFile
), type());
244 for (typename
std::list
<type
>::iterator i
= List
.begin(); i
!= List
.end(); ++i
) SaveFile
>> *i
;
248 template <class type1
, class type2
> inline outputfile
&operator << (outputfile
&SaveFile
, const std::map
<type1
, type2
> &Map
) {
249 SaveFile
<< feuLong(Map
.size());
250 for (typename
std::map
<type1
, type2
>::const_iterator i
= Map
.begin(); i
!= Map
.end(); ++i
) SaveFile
<< i
->first
<< i
->second
;
254 template <class type1
, class type2
> inline inputfile
&operator >> (inputfile
&SaveFile
, std::map
<type1
, type2
> &Map
) {
259 typename
std::map
<type1
, type2
>::iterator i
;
260 for (feuLong c
= 0; c
< Size
; ++c
) {
262 i
= Map
.insert(Map
.end(), std::make_pair(First
, type2()));
263 SaveFile
>> i
->second
;
268 template <class type
> inline outputfile
&operator << (outputfile
&SaveFile
, const std::set
<type
> &Set
) {
269 SaveFile
<< feuLong(Set
.size());
270 for (typename
std::set
<type
>::const_iterator i
= Set
.begin(); i
!= Set
.end(); ++i
) SaveFile
<< *i
;
274 template <class type
> inline inputfile
&operator >> (inputfile
&SaveFile
, std::set
<type
> &Set
) {
278 for (feuLong c
= 0; c
< Size
; ++c
) {
286 template <class type
> inline outputfile
&operator << (outputfile
&SaveFile
, const fearray
<type
> &Array
) {
287 typename fearray
<type
>::sizetype c
, Size
= Array
.Size
;
289 for (c
= 0; c
< Size
; ++c
) SaveFile
<< Array
[c
];
293 template <class type
> inline inputfile
&operator >> (inputfile
&SaveFile
, fearray
<type
> &Array
) {
294 typename fearray
<type
>::sizetype c
, Size
;
296 Array
.Allocate(Size
);
297 for (c
= 0; c
< Size
; ++c
) SaveFile
>> Array
[c
];
301 template <class type
> inline outputfile
&SaveLinkedList (outputfile
&SaveFile
, const type
*Element
) {
302 for (const type
* E
= Element
; E
; E
= E
->Next
) {
310 template <class type
> inline inputfile
&LoadLinkedList(inputfile
&SaveFile
, type
*&Element
) {
311 if (SaveFile
.Get()) {
314 for (E
= Element
; SaveFile
.Get(); E
= E
->Next
) SaveFile
>> E
->Next
;
322 template <class type
> inline outputfile
&SaveArray (outputfile
&SaveFile
, const type
*Array
, int Count
) {
323 for (int c
= 0; c
< Count
; ++c
) SaveFile
<< Array
[c
];
327 template <class type
> inline inputfile
&LoadArray (inputfile
&SaveFile
, type
*Array
, int Count
) {
328 for (int c
= 0; c
< Count
; ++c
) SaveFile
>> Array
[c
];