Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / db / IOobject / IOobject.H
blob9b795884f5df04999dd713353394e933d8e015ad
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::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     @param READ_IF_PRESENT
43         Read object from Istream if Istream exists, otherwise don't. \n
44         Error only if Istream exists but can't be read.
45     @param NO_READ
46           Don't read
48     @par Write options
50     Define what is done on object destruction and explicit writes:
51     @param AUTO_WRITE
52         Object is written automatically when requested to by the
53         objectRegistry.
54     @param NO_WRITE
55         No automatic write on destruction but can be written explicitly
57 SourceFiles
58     IOobject.C
59     IOobjectReadHeader.C
60     IOobjectWriteHeader.C
61     IOobjectPrint.C
63 \*---------------------------------------------------------------------------*/
65 #ifndef IOobject_H
66 #define IOobject_H
68 #include "fileName.H"
69 #include "typeInfo.H"
70 #include "autoPtr.H"
71 #include "InfoProxy.H"
73 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
75 namespace Foam
78 class Time;
79 class objectRegistry;
81 /*---------------------------------------------------------------------------*\
82                            Class IOobject Declaration
83 \*---------------------------------------------------------------------------*/
85 class IOobject
88 public:
90     // Public data types
92         //- Enumeration defining the valid states of an IOobject
93         enum objectState
94         {
95             GOOD,
96             BAD
97         };
99         //- Enumeration defining the read options
100         enum readOption
101         {
102             MUST_READ,
103             READ_IF_PRESENT,
104             NO_READ
105         };
107         //- Enumeration defining the write options
108         enum writeOption
109         {
110             AUTO_WRITE = 0,
111             NO_WRITE = 1
112         };
115 private:
117     // Private data
119         //- Name
120         word name_;
122         //- Class name read from header
123         word headerClassName_;
125         //- Optional note
126         string note_;
128         //- Instance path component
129         fileName instance_;
131         //- Local path component
132         fileName local_;
134         //- objectRegistry reference
135         const objectRegistry& db_;
137         //- Read option
138         readOption rOpt_;
140         //- Write option
141         writeOption wOpt_;
143         //- Register object created from this IOobject with registry if true
144         bool registerObject_;
146         //- IOobject state
147         objectState objState_;
150 protected:
152     // Protected member functions
154         //- Construct and return an IFstream for the object.
155         //  The results is NULL if the stream construction failed
156         Istream* objectStream();
158         //- Set the object state to bad
159         void setBad(const string&);
162 public:
164     //- Runtime type information
165     TypeName("IOobject");
168     // Static Member Functions
170         //- Split path into instance, local, name components
171         static bool fileNameComponents
172         (
173             const fileName& path,
174             fileName& instance,
175             fileName& local,
176             word& name
177         );
180     // Constructors
182         //- Construct from name, instance, registry, io options
183         IOobject
184         (
185             const word& name,
186             const Time& registry,
187             readOption r = NO_READ,
188             writeOption w = NO_WRITE
189         );
191         //- Construct from name, instance, registry, io options
192         IOobject
193         (
194             const word& name,
195             const fileName& instance,
196             const objectRegistry& registry,
197             readOption r = NO_READ,
198             writeOption w = NO_WRITE,
199             bool registerObject = true
200         );
202         //- Construct from name, instance, local, registry, io options
203         IOobject
204         (
205             const word& name,
206             const fileName& instance,
207             const fileName& local,
208             const objectRegistry& registry,
209             readOption r = NO_READ,
210             writeOption w = NO_WRITE,
211             bool registerObject = true
212         );
214         //- Construct from path, registry, io options
215         //  Uses fileNameComponents() to split path into components.
216         IOobject
217         (
218             const fileName& path,
219             const objectRegistry& registry,
220             readOption r = NO_READ,
221             writeOption w = NO_WRITE,
222             bool registerObject = true
223         );
225         //- Clone
226         Foam::autoPtr<IOobject> clone() const
227         {
228             return autoPtr<IOobject>(new IOobject(*this));
229         }
232     // Destructor
234         virtual ~IOobject();
237     // Member Functions
239         // General access
241             //- Return time
242             const Time& time() const;
244             //- Return the local objectRegistry
245             const objectRegistry& db() const;
247             //- Return name
248             const word& name() const
249             {
250                 return name_;
251             }
253             //- Return name of the class name read from header
254             const word& headerClassName() const
255             {
256                 return headerClassName_;
257             }
259             //- Return non-constant access to the optional note
260             string& note()
261             {
262                 return note_;
263             }
265             //- Return the optional note
266             const string& note() const
267             {
268                 return note_;
269             }
271             //- Rename
272             virtual void rename(const word& newName)
273             {
274                 name_ = newName;
275             }
277             //- Register object created from this IOobject with registry
278             //  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 FOAM 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 // ************************************************************************* //