Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / db / IOobject / IOobject.H
blob55c071a5b75240656e521fbe15b64e66c8f8b4c6
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::IOobject
27 Description
28     IOobject defines the attributes of an object for which implicit
29     objectRegistry management is supported, and provides the infrastructure
30     for performing stream I/O.
32     An IOobject is constructed with an object name, a class name, an instance
33     path, a reference to a objectRegistry, and parameters determining its
34     storage status.
36     \par Read options
38     Define what is done on object construction and explicit reads:
39     \param MUST_READ
40         Object must be read from Istream on construction. \n
41         Error if Istream does not exist or can't be read.
42         Does not check timestamp or re-read.
43     \param MUST_READ_IF_MODIFIED
44         Object must be read from Istream on construction. \n
45         Error if Istream does not exist or can't be read. If object is
46         registered its timestamp will be checked every timestep and possibly
47         re-read.
48     \param READ_IF_PRESENT
49         Read object from Istream if Istream exists, otherwise don't. \n
50         Error only if Istream exists but can't be read.
51         Does not check timestamp or re-read.
52     \param NO_READ
53           Don't read
55     \par Write options
57     Define what is done on object destruction and explicit writes:
58     \param AUTO_WRITE
59         Object is written automatically when requested to by the
60         objectRegistry.
61     \param NO_WRITE
62         No automatic write on destruction but can be written explicitly
64 SourceFiles
65     IOobject.C
66     IOobjectReadHeader.C
67     IOobjectWriteHeader.C
68     IOobjectPrint.C
70 \*---------------------------------------------------------------------------*/
72 #ifndef IOobject_H
73 #define IOobject_H
75 #include "fileName.H"
76 #include "typeInfo.H"
77 #include "autoPtr.H"
78 #include "InfoProxy.H"
80 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
82 namespace Foam
85 class Time;
86 class objectRegistry;
88 /*---------------------------------------------------------------------------*\
89                            Class IOobject Declaration
90 \*---------------------------------------------------------------------------*/
92 class IOobject
95 public:
97     // Public data types
99         //- Enumeration defining the valid states of an IOobject
100         enum objectState
101         {
102             GOOD,
103             BAD
104         };
106         //- Enumeration defining the read options
107         enum readOption
108         {
109             MUST_READ,
110             MUST_READ_IF_MODIFIED,
111             READ_IF_PRESENT,
112             NO_READ
113         };
115         //- Enumeration defining the write options
116         enum writeOption
117         {
118             AUTO_WRITE = 0,
119             NO_WRITE = 1
120         };
123 private:
125     // Private data
127         //- Name
128         word name_;
130         //- Class name read from header
131         word headerClassName_;
133         //- Optional note
134         string note_;
136         //- Instance path component
137         fileName instance_;
139         //- Local path component
140         fileName local_;
142         //- objectRegistry reference
143         const objectRegistry& db_;
145         //- Read option
146         readOption rOpt_;
148         //- Write option
149         writeOption wOpt_;
151         //- Register object created from this IOobject with registry if true
152         bool registerObject_;
154         //- IOobject state
155         objectState objState_;
157 protected:
159     // Protected Member Functions
161         //- Construct and return an IFstream for the object.
162         //  The results is NULL if the stream construction failed
163         Istream* objectStream();
165         //- Construct and return an IFstream for the object given the
166         //  exact file. The results is NULL if the stream construction failed
167         Istream* objectStream(const fileName&);
169         //- Set the object state to bad
170         void setBad(const string&);
173 public:
175     //- Runtime type information
176     TypeName("IOobject");
179     // Static Member Functions
181         //- Split path into instance, local, name components
182         static bool fileNameComponents
183         (
184             const fileName& path,
185             fileName& instance,
186             fileName& local,
187             word& name
188         );
191     // Constructors
193         //- Construct from name, instance, registry, io options
194         IOobject
195         (
196             const word& name,
197             const fileName& instance,
198             const objectRegistry& registry,
199             readOption r=NO_READ,
200             writeOption w=NO_WRITE,
201             bool registerObject=true
202         );
204         //- Construct from name, instance, local, registry, io options
205         IOobject
206         (
207             const word& name,
208             const fileName& instance,
209             const fileName& local,
210             const objectRegistry& registry,
211             readOption r=NO_READ,
212             writeOption w=NO_WRITE,
213             bool registerObject=true
214         );
216         //- Construct from path, registry, io options
217         //  Uses fileNameComponents() to split path into components.
218         IOobject
219         (
220             const fileName& path,
221             const objectRegistry& registry,
222             readOption r=NO_READ,
223             writeOption w=NO_WRITE,
224             bool registerObject=true
225         );
227         //- Clone
228         Foam::autoPtr<IOobject> clone() const
229         {
230             return autoPtr<IOobject>(new IOobject(*this));
231         }
234     //- Destructor
235     virtual ~IOobject();
238     // Member Functions
240         // General access
242             //- Return time
243             const Time& time() const;
245             //- Return the local objectRegistry
246             const objectRegistry& db() const;
248             //- Return name
249             const word& name() const
250             {
251                 return name_;
252             }
254             //- Return name of the class name read from header
255             const word& headerClassName() const
256             {
257                 return headerClassName_;
258             }
260             //- Return non-constant access to the optional note
261             string& note()
262             {
263                 return note_;
264             }
266             //- Return the optional note
267             const string& note() const
268             {
269                 return note_;
270             }
272             //- Rename
273             virtual void rename(const word& newName)
274             {
275                 name_ = newName;
276             }
278             //- Register object created from this IOobject with registry if true
279             bool registerObject() const
280             {
281                 return registerObject_;
282             }
285         // Read/write options
287             readOption readOpt() const
288             {
289                 return rOpt_;
290             }
292             readOption& readOpt()
293             {
294                 return rOpt_;
295             }
297             writeOption writeOpt() const
298             {
299                 return wOpt_;
300             }
302             writeOption& writeOpt()
303             {
304                 return wOpt_;
305             }
308         // Path components
310             const fileName& rootPath() const;
312             const fileName& caseName() const;
314             const fileName& instance() const
315             {
316                 return instance_;
317             }
319             fileName& instance()
320             {
321                 return instance_;
322             }
324             const fileName& local() const
325             {
326                 return local_;
327             }
329             //- Return complete path
330             fileName path() const;
332             //- Return complete path with alternative instance and local
333             fileName path
334             (
335                 const word& instance,
336                 const fileName& local = ""
337             ) const;
339             //- Return complete path + object name
340             fileName objectPath() const
341             {
342                 return path()/name();
343             }
345             //- Return complete path + object name if the file exists
346             //  either in the case/processor or case otherwise null
347             fileName filePath() const;
350         // Reading
352             //- Read header
353             bool readHeader(Istream&);
355             //- Read and check header info
356             bool headerOk();
359         // Writing
361             //- Write the standard OpenFOAM file/dictionary banner
362             //  Optionally without -*- C++ -*- editor hint (eg, for logs)
363             template<class Stream>
364             static inline Stream& writeBanner(Stream& os, bool noHint=false);
366             //- Write the standard file section divider
367             template<class Stream>
368             static inline Stream& writeDivider(Stream& os);
370             //- Write the standard end file divider
371             template<class Stream>
372             static inline Stream& writeEndDivider(Stream& os);
374             //- Write header
375             bool writeHeader(Ostream&) const;
378         // Error Handling
380             bool good() const
381             {
382                 return objState_ == GOOD;
383             }
385             bool bad() const
386             {
387                 return objState_ == BAD;
388             }
391         // Info
393             //- Return info proxy.
394             //  Used to print token information to a stream
395             InfoProxy<IOobject> info() const
396             {
397                 return *this;
398             }
401     // Member operators
403         void operator=(const IOobject&);
407 #if defined (__GNUC__)
408 template<>
409 #endif
410 Ostream& operator<<(Ostream& os, const InfoProxy<IOobject>& ip);
413 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
415 } // End namespace Foam
417 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
419 #   include "IOobjectI.H"
421 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
423 #endif
425 // ************************************************************************* //