Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / db / dictionary / dictionary.H
blobcb3b03b00fe21baf167226a981874cc849242da0
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::dictionary
27 Description
28     A list of keyword definitions, which are a keyword followed by any number
29     of values (e.g. words and numbers). The keywords can represent patterns
30     which are matched using Posix regular expressions. The general order for
31     searching is as follows:
32     - exact match
33     - pattern match (in reverse order)
34     - optional recursion into the enclosing (parent) dictionaries
36     The dictionary class is the base class for IOdictionary.
37     It also serves as a bootstrap dictionary for the objectRegistry data
38     dictionaries since, unlike the IOdictionary class, it does not use an
39     objectRegistry itself to work.
41     To add - a merge() member function with a non-const dictionary parameter?
42     This would avoid unnecessary cloning in the add(entry*, bool) method.
44 SourceFiles
45     dictionary.C
46     dictionaryIO.C
48 \*---------------------------------------------------------------------------*/
50 #ifndef dictionary_H
51 #define dictionary_H
53 #include "entry.H"
54 #include "IDLList.H"
55 #include "DLList.H"
56 #include "fileName.H"
57 #include "ITstream.H"
58 #include "HashTable.H"
59 #include "wordList.H"
60 #include "className.H"
62 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
64 namespace Foam
67 // Forward declaration of friend functions and operators
68 class regExp;
69 class dictionary;
70 class SHA1Digest;
72 Istream& operator>>(Istream&, dictionary&);
73 Ostream& operator<<(Ostream&, const dictionary&);
75 /*---------------------------------------------------------------------------*\
76                         Class dictionaryName Declaration
77 \*---------------------------------------------------------------------------*/
79 class dictionaryName
81     // Private data
83         fileName name_;
86 public:
88     // Constructors
90         //- Construct dictionaryName null
91         dictionaryName()
92         {}
94         //- Construct dictionaryName as copy of the given fileName
95         dictionaryName(const fileName& name)
96         :
97             name_(name)
98         {}
101     // Member functions
103         //- Return the dictionary name
104         const fileName& name() const
105         {
106             return name_;
107         }
109         //- Return the dictionary name
110         fileName& name()
111         {
112             return name_;
113         }
115         //- Return the local dictionary name (final part of scoped name)
116         const word dictName() const
117         {
118             const word scopedName = name_.name();
120             string::size_type i = scopedName.rfind(':');
122             if (i == scopedName.npos)
123             {
124                 return scopedName;
125             }
126             else
127             {
128                 return scopedName.substr(i + 1, scopedName.npos);
129             }
130         }
134 /*---------------------------------------------------------------------------*\
135                            Class dictionary Declaration
136 \*---------------------------------------------------------------------------*/
138 class dictionary
140     public dictionaryName,
141     public IDLList<entry>
143     // Private data
145         //- HashTable of the entries held on the DL-list for quick lookup
146         HashTable<entry*> hashedEntries_;
148         //- Parent dictionary
149         const dictionary& parent_;
151         //- Entries of matching patterns
152         DLList<entry*> patternEntries_;
154         //- Patterns as precompiled regular expressions
155         DLList<autoPtr<regExp> > patternRegexps_;
158    // Private Member Functions
160         //- Search patterns table for exact match or regular expression match
161         bool findInPatterns
162         (
163             const bool patternMatch,
164             const word& Keyword,
165             DLList<entry*>::const_iterator& wcLink,
166             DLList<autoPtr<regExp> >::const_iterator& reLink
167         ) const;
169         //- Search patterns table for exact match or regular expression match
170         bool findInPatterns
171         (
172             const bool patternMatch,
173             const word& Keyword,
174             DLList<entry*>::iterator& wcLink,
175             DLList<autoPtr<regExp> >::iterator& reLink
176         );
179 public:
181     //- Declare friendship with the entry class for IO
182     friend class entry;
185     // Declare name of the class and its debug switch
186     ClassName("dictionary");
189     //- Null dictionary
190     static const dictionary null;
193     // Constructors
195         //- Construct top-level dictionary null
196         dictionary();
198         //- Construct top-level empty dictionary with given name
199         dictionary(const fileName& name);
201         //- Construct given the entry name, parent dictionary and Istream,
202         //  reading entries until lastEntry or EOF
203         dictionary
204         (
205             const fileName& name,
206             const dictionary& parentDict,
207             Istream&
208         );
210         //- Construct top-level dictionary from Istream,
211         //  reading entries until EOF
212         dictionary(Istream&);
214         //- Construct top-level dictionary from Istream,
215         //  reading entries until EOF, optionally keeping the header
216         dictionary(Istream&, const bool keepHeader);
218         //- Construct as copy given the parent dictionary
219         dictionary(const dictionary& parentDict, const dictionary&);
221         //- Construct top-level dictionary as copy
222         dictionary(const dictionary&);
224         //- Construct top-level dictionary as copy from pointer to dictionary.
225         //  A null pointer is treated like an empty dictionary.
226         dictionary(const dictionary*);
228         //- Construct by transferring parameter contents given parent dictionary
229         dictionary(const dictionary& parentDict, const Xfer<dictionary>&);
231         //- Construct top-level dictionary by transferring parameter contents
232         dictionary(const Xfer<dictionary>&);
234         //- Construct and return clone
235         autoPtr<dictionary> clone() const;
237         //- Construct top-level dictionary on freestore from Istream
238         static autoPtr<dictionary> New(Istream&);
241     //- Destructor
242     virtual ~dictionary();
245     // Member functions
247         //- Return the parent dictionary
248         const dictionary& parent() const
249         {
250             return parent_;
251         }
253         //- Return line number of first token in dictionary
254         label startLineNumber() const;
256         //- Return line number of last token in dictionary
257         label endLineNumber() const;
259         //- Return the SHA1 digest of the dictionary contents
260         SHA1Digest digest() const;
263         // Search and lookup
265             //- Search dictionary for given keyword
266             //  If recursive, search parent dictionaries
267             //  If patternMatch, use regular expressions
268             bool found
269             (
270                 const word&,
271                 bool recursive=false,
272                 bool patternMatch = true
273             ) const;
275             //- Find and return an entry data stream pointer if present
276             //  otherwise return NULL.
277             //  If recursive, search parent dictionaries.
278             //  If patternMatch, use regular expressions
279             const entry* lookupEntryPtr
280             (
281                 const word&,
282                 bool recursive,
283                 bool patternMatch
284             ) const;
286             //- Find and return an entry data stream pointer for manipulation
287             //  if present otherwise return NULL.
288             //  If recursive, search parent dictionaries.
289             //  If patternMatch, use regular expressions.
290             entry* lookupEntryPtr
291             (
292                 const word&,
293                 bool recursive,
294                 bool patternMatch
295             );
297             //- Find and return an entry data stream if present otherwise error.
298             //  If recursive, search parent dictionaries.
299             //  If patternMatch, use regular expressions.
300             const entry& lookupEntry
301             (
302                 const word&,
303                 bool recursive,
304                 bool patternMatch
305             ) const;
307             //- Find and return an entry data stream
308             //  If recursive, search parent dictionaries.
309             //  If patternMatch, use regular expressions.
310             ITstream& lookup
311             (
312                 const word&,
313                 bool recursive=false,
314                 bool patternMatch=true
315             ) const;
317             //- Find and return a T,
318             //  if not found return the given default value
319             //  If recursive, search parent dictionaries.
320             //  If patternMatch, use regular expressions.
321             template<class T>
322             T lookupOrDefault
323             (
324                 const word&,
325                 const T&,
326                 bool recursive=false,
327                 bool patternMatch=true
328             ) const;
330             //- Find and return a T, if not found return the given
331             //  default value, and add to dictionary.
332             //  If recursive, search parent dictionaries.
333             //  If patternMatch, use regular expressions.
334             template<class T>
335             T lookupOrAddDefault
336             (
337                 const word&,
338                 const T&,
339                 bool recursive=false,
340                 bool patternMatch=true
341             );
343             //- Find an entry if present, and assign to T
344             //  Returns true if the entry was found.
345             //  If recursive, search parent dictionaries.
346             //  If patternMatch, use regular expressions.
347             template<class T>
348             bool readIfPresent
349             (
350                 const word&,
351                 T&,
352                 bool recursive=false,
353                 bool patternMatch=true
354             ) const;
356             //- Check if entry is a sub-dictionary
357             bool isDict(const word&) const;
359             //- Find and return a sub-dictionary pointer if present
360             //  otherwise return NULL.
361             const dictionary* subDictPtr(const word&) const;
363             //- Find and return a sub-dictionary
364             const dictionary& subDict(const word&) const;
366             //- Find and return a sub-dictionary for manipulation
367             dictionary& subDict(const word&);
369             //- Find and return a sub-dictionary as a copy, or
370             //  return an empty dictionary if the sub-dictionary does not exist
371             dictionary subOrEmptyDict
372             (
373                 const word&,
374                 const bool mustRead = false
375             ) const;
377             //- Return the table of contents
378             wordList toc() const;
380             //- Return the list of available keys or patterns
381             List<keyType> keys(bool patterns=false) const;
384         // Editing
386             //- Substitute the given keyword prepended by '$' with the
387             //  corresponding sub-dictionary entries
388             bool substituteKeyword(const word& keyword);
390             //- Add a new entry
391             //  With the merge option, dictionaries are interwoven and
392             //  primitive entries are overwritten
393             bool add(entry*, bool mergeEntry=false);
395             //- Add an entry
396             //  With the merge option, dictionaries are interwoven and
397             //  primitive entries are overwritten
398             void add(const entry&, bool mergeEntry=false);
400             //- Add a word entry
401             //  optionally overwrite an existing entry
402             void add(const keyType&, const word&, bool overwrite=false);
404             //- Add a string entry
405             //  optionally overwrite an existing entry
406             void add(const keyType&, const string&, bool overwrite=false);
408             //- Add a label entry
409             //  optionally overwrite an existing entry
410             void add(const keyType&, const label, bool overwrite=false);
412             //- Add a scalar entry
413             //  optionally overwrite an existing entry
414             void add(const keyType&, const scalar, bool overwrite=false);
416             //- Add a dictionary entry
417             //  optionally merge with an existing sub-dictionary
418             void add
419             (
420                 const keyType&,
421                 const dictionary&,
422                 bool mergeEntry=false
423             );
425             //- Add a T entry
426             //  optionally overwrite an existing entry
427             template<class T>
428             void add(const keyType&, const T&, bool overwrite=false);
430             //- Assign a new entry, overwrite any existing entry
431             void set(entry*);
433             //- Assign a new entry, overwrite any existing entry
434             void set(const entry&);
436             //- Assign a dictionary entry, overwrite any existing entry
437             void set(const keyType&, const dictionary&);
439             //- Assign a T entry, overwrite any existing entry
440             template<class T>
441             void set(const keyType&, const T&);
443             //- Remove an entry specified by keyword
444             bool remove(const word&);
446             //- Change the keyword for an entry,
447             //  optionally forcing overwrite of an existing entry
448             bool changeKeyword
449             (
450                 const keyType& oldKeyword,
451                 const keyType& newKeyword,
452                 bool forceOverwrite=false
453             );
455             //- Merge entries from the given dictionary.
456             //  Also merge sub-dictionaries as required.
457             bool merge(const dictionary&);
459             //- Clear the dictionary
460             void clear();
462             //- Transfer the contents of the argument and annul the argument.
463             void transfer(dictionary&);
465             //- Transfer contents to the Xfer container
466             Xfer<dictionary> xfer();
469         // Read
471             //- Read dictionary from Istream
472             bool read(Istream&);
474             //- Read dictionary from Istream, optionally keeping the header
475             bool read(Istream&, const bool keepHeader);
478         // Write
480             //- Write dictionary, normally with sub-dictionary formatting
481             void write(Ostream&, const bool subDict=true) const;
484     // Member Operators
486         //- Find and return entry
487         ITstream& operator[](const word&) const;
489         void operator=(const dictionary&);
491         //- Include entries from the given dictionary.
492         //  Warn, but do not overwrite existing entries.
493         void operator+=(const dictionary&);
495         //- Conditionally include entries from the given dictionary.
496         //  Do not overwrite existing entries.
497         void operator|=(const dictionary&);
499         //- Unconditionally include entries from the given dictionary.
500         //  Overwrite existing entries.
501         void operator<<=(const dictionary&);
504     // IOstream operators
506         //- Read dictionary from Istream
507         friend Istream& operator>>(Istream&, dictionary&);
509         //- Write dictionary to Ostream
510         friend Ostream& operator<<(Ostream&, const dictionary&);
514 // Global Operators
516 //- Combine dictionaries.
517 //  Starting from the entries in dict1 and then including those from dict2.
518 //  Warn, but do not overwrite the entries from dict1.
519 dictionary operator+(const dictionary& dict1, const dictionary& dict2);
521 //- Combine dictionaries.
522 //  Starting from the entries in dict1 and then including those from dict2.
523 //  Do not overwrite the entries from dict1.
524 dictionary operator|(const dictionary& dict1, const dictionary& dict2);
527 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
529 } // End namespace Foam
531 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
533 #ifdef NoRepository
534 #   include "dictionaryTemplates.C"
535 #endif
537 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
539 #endif
541 // ************************************************************************* //