Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / db / IOstreams / IOstreams / IOstream.H
blob134878d4ffc4bed6dbb83533ffc767f5fd516f9a
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::IOstream
27 Description
28     An IOstream is an abstract base class for all input/output systems; be
29     they streams, files, token lists etc.
31     The basic operations are construct, close, read token, read primitive
32     and read binary block.  In addition version control and line number
33     counting is incorporated.  Usually one would use the read primitive
34     member functions, but if one were reading a stream on unknown data
35     sequence one can read token by token, and then analyse.
37 SourceFiles
38     IOstream.C
40 \*---------------------------------------------------------------------------*/
42 #ifndef IOstream_H
43 #define IOstream_H
45 #include "char.H"
46 #include "bool.H"
47 #include "label.H"
48 #include "uLabel.H"
49 #include "scalar.H"
50 #include "fileName.H"
51 #include "InfoProxy.H"
52 #include "infoSwitch.H"
54 #include "debug.H"
56 #include <iostream>
59 #if __GNUC__ < 3
60 #   define ios_base ios
61 #endif
63 using std::ios_base;
64 using std::istream;
65 using std::ostream;
67 using std::cin;
68 using std::cout;
69 using std::cerr;
71 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
73 namespace Foam
76 /*---------------------------------------------------------------------------*\
77                            Class IOstream Declaration
78 \*---------------------------------------------------------------------------*/
80 class IOstream
83 public:
85     // Public data types
87         //- Enumeration for whether the stream open or closed
88         enum streamAccess
89         {
90             OPENED,
91             CLOSED
92         };
94         //- Enumeration for the format of data in the stream
95         enum streamFormat
96         {
97             ASCII,
98             BINARY
99         };
101         //- Ostream operator
102         friend Ostream& operator<<(Ostream& os, const streamFormat& sf);
104         //- Version number type
105         class versionNumber
106         {
107             //- The version number
108             scalar versionNumber_;
110             //- The version number as an integer
111             int index_;
114         public:
116             // Constructors
118                 //- Construct from number
119                 versionNumber(const scalar num)
120                 :
121                     versionNumber_(num),
122                     index_(numberToIndex(num))
123                 {}
125                 //- Construct from Istream
126                 versionNumber(Istream& is)
127                 :
128                     versionNumber_(readScalar(is)),
129                     index_(numberToIndex(versionNumber_))
130                 {}
133             // Member functions
135                 //- Convert a version number into an index
136                 int numberToIndex(const scalar num) const
137                 {
138                     return int(10*num + SMALL);
139                 }
141                 //- Return major version
142                 int majorVersion() const
143                 {
144                     return int(versionNumber_);
145                 }
147                 //- Return minor version
148                 int minorVersion() const
149                 {
150                     return int(10.0*(versionNumber_ - majorVersion()));
151                 }
153                 //- Return the versionNumber as a character string
154                 string str() const;
157             // Member operators
159                 //- Are these versionNumbers the same?
160                 bool operator==(const versionNumber& vn)
161                 {
162                     return index_ == vn.index_;
163                 }
165                 //- Are these versionNumbers different?
166                 bool operator!=(const versionNumber& vn)
167                 {
168                     return index_ != vn.index_;
169                 }
171                 //- Is this version older than the one given
172                 bool operator<(const versionNumber& vn)
173                 {
174                     return index_ < vn.index_;
175                 }
177                 //- Is this version the same as or older than the one given
178                 bool operator<=(const versionNumber& vn)
179                 {
180                     return index_ <= vn.index_;
181                 }
183                 //- Is this version newer than the one given
184                 bool operator>(const versionNumber& vn)
185                 {
186                     return index_ > vn.index_;
187                 }
189                 //- this version the same as or newer than the one given
190                 bool operator>=(const versionNumber& vn)
191                 {
192                     return index_ >= vn.index_;
193                 }
196             //- Ostream operator
197             friend Ostream& operator<<(Ostream& os, const versionNumber& vn);
198         };
201         //- Enumeration for the format of data in the stream
202         enum compressionType
203         {
204             UNCOMPRESSED,
205             COMPRESSED
206         };
209     // Public static data
211         //- Original version number
212         static const versionNumber originalVersion;
214         //- Current version number
215         static const versionNumber currentVersion;
217         //- Default precision
218         static Foam::debug::infoSwitch precision_;
220 private:
222     // Private data
224         //- Name of the stream
225         static fileName name_;
227         streamFormat format_;
228         versionNumber version_;
229         compressionType compression_;
231         streamAccess openClosed_;
232         ios_base::iostate ioState_;
235 protected:
237     // Protected data
239         label lineNumber_;
242     // Protected member functions
244         // Access
246             //- Set stream opened
247             void setOpened()
248             {
249                 openClosed_ = OPENED;
250             }
252             //- Set stream closed
253             void setClosed()
254             {
255                 openClosed_ = CLOSED;
256             }
258             //- Set stream state
259             void setState(ios_base::iostate state)
260             {
261                 ioState_ = state;
262             }
264             //- Set stream to be good
265             void setGood()
266             {
267                 ioState_ = ios_base::iostate(0);
268             }
271 public:
273     // Constructors
275         //- Construct setting format and version
276         IOstream
277         (
278             streamFormat format,
279             versionNumber version,
280             compressionType compression=UNCOMPRESSED
281         )
282         :
283             format_(format),
284             version_(version),
285             compression_(compression),
286             openClosed_(CLOSED),
287             ioState_(ios_base::iostate(0)),
288             lineNumber_(0)
289         {
290             setBad();
291         }
294     // Destructor
296         virtual ~IOstream()
297         {}
300     // Member functions
302         // Access
304             //- Return the name of the stream
305             //  Useful for Fstream to return the filename
306             virtual const fileName& name() const
307             {
308                 return name_;
309             }
311             //- Return non-const access to the name of the stream
312             //  Useful to alter the stream name
313             virtual fileName& name()
314             {
315                 return name_;
316             }
319         // Check
321             //- Check IOstream status for given operation
322             //  print IOstream state if error has occured
323             virtual bool check(const char* operation) const;
325             //- Check IOstream status for given operation
326             //  print IOstream state if error has occured and exit
327             void fatalCheck(const char* operation) const;
329             //- Return true if stream has been opened
330             bool opened() const
331             {
332                 return openClosed_ == OPENED;
333             }
335             //- Return true if stream is closed
336             bool closed() const
337             {
338                 return openClosed_ == CLOSED;
339             }
341             //- Return true if next operation might succeed
342             bool good() const
343             {
344                 return ioState_ == 0;
345             }
347             //- Return true if end of input seen
348             bool eof() const
349             {
350                 return ioState_ & ios_base::eofbit;
351             }
353             //- Return true if next operation will fail
354             bool fail() const
355             {
356                 return ioState_ & (ios_base::badbit | ios_base::failbit);
357             }
359             //- Return true if stream is corrupted
360             bool bad() const
361             {
362                 return ioState_ & ios_base::badbit;
363             }
365             //- Return non-zero if the stream has not failed
366             operator void*() const
367             {
368                 return fail()
369                     ? reinterpret_cast<void*>(0)
370                     : reinterpret_cast<void*>(-1);
371             }
373             //- Return true if the stream has failed
374             bool operator!() const
375             {
376                 return fail();
377             }
380         // Stream state functions
382             //- Return stream format of given format name
383             static streamFormat formatEnum(const word&);
385             //- Return current stream format
386             streamFormat format() const
387             {
388                 return format_;
389             }
391             //- Set the stream format
392             streamFormat format(const streamFormat fmt)
393             {
394                 streamFormat fmt0 = format_;
395                 format_ = fmt;
396                 return fmt0;
397             }
399             //- Set the stream format from word
400             streamFormat format(const word& fmt)
401             {
402                 streamFormat fmt0 = format_;
403                 format_ = formatEnum(fmt);
404                 return fmt0;
405             }
407             //- Return the stream version
408             versionNumber version() const
409             {
410                 return version_;
411             }
413             //- Set the stream version
414             versionNumber version(const versionNumber ver)
415             {
416                 versionNumber ver0 = version_;
417                 version_ = ver;
418                 return ver0;
419             }
421             //- Return compression of given compression name
422             static compressionType compressionEnum(const word&);
424             //- Return the stream compression
425             compressionType compression() const
426             {
427                 return compression_;
428             }
430             //- Set the stream compression
431             compressionType compression(const compressionType cmp)
432             {
433                 compressionType cmp0 = compression_;
434                 compression_ = cmp;
435                 return cmp0;
436             }
438             //- Set the stream compression from word
439             compressionType compression(const word& cmp)
440             {
441                 compressionType cmp0 = compression_;
442                 compression_ = compressionEnum(cmp);
443                 return cmp0;
444             }
446             //- Return current stream line number
447             label lineNumber() const
448             {
449                 return lineNumber_;
450             }
452             //- Return current stream line number
453             label& lineNumber()
454             {
455                 return lineNumber_;
456             }
458             //- Set the stream line number
459             label lineNumber(const label ln)
460             {
461                 label ln0 = lineNumber_;
462                 lineNumber_ = ln;
463                 return ln0;
464             }
466             //- Return flags of stream
467             virtual ios_base::fmtflags flags() const = 0;
469             //- Return the default precision
470             static unsigned int defaultPrecision()
471             {
472                 return precision_();
473             }
475             //- Reset the default precision (and return old precision)
476             static unsigned int defaultPrecision(unsigned int p)
477             {
478                 unsigned int precision0 = precision_();
479                 precision_ = p;
480                 return precision0;
481             }
483             //- Set stream to have reached eof
484             void setEof()
485             {
486                 ioState_ |= ios_base::eofbit;
487             }
489             //- Set stream to have failed
490             void setFail()
491             {
492                 ioState_ |= ios_base::failbit;
493             }
495             //- Set stream to be bad
496             void setBad()
497             {
498                 ioState_ |= ios_base::badbit;
499             }
501             //- Set flags of stream
502             virtual ios_base::fmtflags flags(const ios_base::fmtflags f) = 0;
504             //- Set flags of stream
505             ios_base::fmtflags setf(const ios_base::fmtflags f)
506             {
507                 return flags(flags() | f);
508             }
510             //- Set flags of given field of stream
511             ios_base::fmtflags setf
512             (
513                 const ios_base::fmtflags f,
514                 const ios_base::fmtflags mask
515             )
516             {
517                 return flags((flags() & ~mask) | (f & mask));
518             }
520             //- Unset flags of stream
521             void unsetf(const ios_base::fmtflags uf)
522             {
523                 flags(flags()&~uf);
524             }
527         // Print
529             //- Print description of IOstream to Ostream
530             virtual void print(Ostream&) const;
532             //- Check given stream state bits
533             void print(Ostream&, const int streamState) const;
536         // Info
538             //- Return info proxy.
539             //  Used to print IOstream information to a stream
540             InfoProxy<IOstream> info() const
541             {
542                 return *this;
543             }
547 Ostream& operator<<(Ostream& os, const IOstream::streamFormat& sf);
548 Ostream& operator<<(Ostream& os, const IOstream::versionNumber& vn);
551 // --------------------------------------------------------------------
552 // ------ Manipulators (not taking arguments)
553 // --------------------------------------------------------------------
555 typedef IOstream& (*IOstreamManip)(IOstream&);
557 //- operator<< handling for manipulators without arguments
558 inline IOstream& operator<<(IOstream& io, IOstreamManip f)
560     return f(io);
564 inline IOstream& dec(IOstream& io)
566     io.setf(ios_base::dec, ios_base::dec|ios_base::hex|ios_base::oct);
567     return io;
570 inline IOstream& hex(IOstream& io)
572     io.setf(ios_base::hex, ios_base::dec|ios_base::hex|ios_base::oct);
573     return io;
576 inline IOstream& oct(IOstream& io)
578     io.setf(ios_base::oct, ios_base::dec|ios_base::hex|ios_base::oct);
579     return io;
582 inline IOstream& fixed(IOstream& io)
584     io.setf(ios_base::fixed, ios_base::floatfield);
585     return io;
588 inline IOstream& scientific(IOstream& io)
590     io.setf(ios_base::scientific, ios_base::floatfield);
591     return io;
595 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
597 } // End namespace Foam
599 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
601 #endif
603 // ************************************************************************* //