BUG: UListIO: byteSize overflowing on really big faceLists
[OpenFOAM-2.0.x.git] / src / OpenFOAM / db / IOstreams / token / tokenI.H
blobdfa6cdf93e453162c30fe7cb7546921dab6ee618
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
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 \*---------------------------------------------------------------------------*/
26 #include <iostream>
28 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
30 namespace Foam
33 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
35 // Clear any allocated storage (word or string)
36 inline void token::clear()
38     if (type_ == WORD)
39     {
40         delete wordTokenPtr_;
41     }
42     else if (type_ == STRING || type_ == VERBATIMSTRING)
43     {
44         delete stringTokenPtr_;
45     }
46     else if (type_ == COMPOUND)
47     {
48         if (compoundTokenPtr_->okToDelete())
49         {
50             delete compoundTokenPtr_;
51         }
52         else
53         {
54             compoundTokenPtr_->refCount::operator--();
55         }
56     }
58     type_ = UNDEFINED;
62 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
64 // Construct null
65 inline token::token()
67     type_(UNDEFINED),
68     lineNumber_(0)
71 // Construct as copy
72 inline token::token(const token& t)
74     type_(t.type_),
75     lineNumber_(t.lineNumber_)
77     switch (type_)
78     {
79         case token::UNDEFINED:
80         break;
82         case PUNCTUATION:
83             punctuationToken_ = t.punctuationToken_;
84         break;
86         case WORD:
87             wordTokenPtr_ = new word(*t.wordTokenPtr_);
88         break;
90         case STRING:
91         case VERBATIMSTRING:
92             stringTokenPtr_ = new string(*t.stringTokenPtr_);
93         break;
95         case LABEL:
96             labelToken_ = t.labelToken_;
97         break;
99         case FLOAT_SCALAR:
100             floatScalarToken_ = t.floatScalarToken_;
101         break;
103         case DOUBLE_SCALAR:
104             doubleScalarToken_ = t.doubleScalarToken_;
105         break;
107         case COMPOUND:
108             compoundTokenPtr_ = t.compoundTokenPtr_;
109             compoundTokenPtr_->refCount::operator++();
110         break;
112         case token::ERROR:
113         break;
114     }
117 // Construct punctuation character token
118 inline token::token(punctuationToken p, label lineNumber)
120     type_(PUNCTUATION),
121     punctuationToken_(p),
122     lineNumber_(lineNumber)
125 // Construct word token
126 inline token::token(const word& w, label lineNumber)
128     type_(WORD),
129     wordTokenPtr_(new word(w)),
130     lineNumber_(lineNumber)
133 // Construct string token
134 inline token::token(const string& s, label lineNumber)
136     type_(STRING),
137     stringTokenPtr_(new string(s)),
138     lineNumber_(lineNumber)
141 // Construct label token
142 inline token::token(const label l, label lineNumber)
144     type_(LABEL),
145     labelToken_(l),
146     lineNumber_(lineNumber)
149 // Construct floatScalar token
150 inline token::token(const floatScalar s, label lineNumber)
152     type_(FLOAT_SCALAR),
153     floatScalarToken_(s),
154     lineNumber_(lineNumber)
157 // Construct doubleScalar token
158 inline token::token(const doubleScalar s, label lineNumber)
160     type_(DOUBLE_SCALAR),
161     doubleScalarToken_(s),
162     lineNumber_(lineNumber)
166 // * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
168 // Delete token clearing the storage used by word or string
169 inline token::~token()
171     clear();
175 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
177 inline token::tokenType token::type() const
179     return type_;
182 inline token::tokenType& token::type()
184     return type_;
187 inline bool token::good() const
189     return (type_ != ERROR && type_ != UNDEFINED);
192 inline bool token::undefined() const
194     return (type_ == UNDEFINED);
197 inline bool token::error() const
199     return (type_ == ERROR);
202 inline bool token::isPunctuation() const
204     return (type_ == PUNCTUATION);
207 inline token::punctuationToken token::pToken() const
209     if (type_ == PUNCTUATION)
210     {
211         return punctuationToken_;
212     }
213     else
214     {
215         parseError("punctuation character");
216         return NULL_TOKEN;
217     }
220 inline bool token::isWord() const
222     return (type_ == WORD);
225 inline const word& token::wordToken() const
227     if (type_ == WORD)
228     {
229         return *wordTokenPtr_;
230     }
231     else
232     {
233         parseError("word");
234         return word::null;
235     }
238 inline bool token::isString() const
240     return (type_ == STRING || type_ == VERBATIMSTRING);
243 inline const string& token::stringToken() const
245     if (type_ == STRING || type_ == VERBATIMSTRING)
246     {
247         return *stringTokenPtr_;
248     }
249     else
250     {
251         parseError("string");
252         return string::null;
253     }
256 inline bool token::isLabel() const
258     return (type_ == LABEL);
261 inline label token::labelToken() const
263     if (type_ == LABEL)
264     {
265         return labelToken_;
266     }
267     else
268     {
269         parseError("label");
270         return 0;
271     }
274 inline bool token::isFloatScalar() const
276     return (type_ == FLOAT_SCALAR);
279 inline floatScalar token::floatScalarToken() const
281     if (type_ == FLOAT_SCALAR)
282     {
283         return floatScalarToken_;
284     }
285     else
286     {
287         parseError("floatScalar");
288         return 0.0;
289     }
293 inline bool token::isDoubleScalar() const
295     return (type_ == DOUBLE_SCALAR);
298 inline doubleScalar token::doubleScalarToken() const
300     if (type_ == DOUBLE_SCALAR)
301     {
302         return doubleScalarToken_;
303     }
304     else
305     {
306         parseError("doubleScalar");
307         return 0.0;
308     }
312 inline bool token::isScalar() const
314     return (type_ == FLOAT_SCALAR || type_ == DOUBLE_SCALAR);
317 inline scalar token::scalarToken() const
319     if (type_ == FLOAT_SCALAR)
320     {
321         return floatScalarToken_;
322     }
323     else if (type_ == DOUBLE_SCALAR)
324     {
325         return doubleScalarToken_;
326     }
327     else
328     {
329         parseError("scalar");
330         return 0.0;
331     }
334 inline bool token::isNumber() const
336     return (type_ == LABEL || isScalar());
339 inline scalar token::number() const
341     if (type_ == LABEL)
342     {
343         return labelToken_;
344     }
345     else if (isScalar())
346     {
347         return scalarToken();
348     }
349     else
350     {
351         parseError("number (label or scalar)");
352         return 0.0;
353     }
356 inline bool token::isCompound() const
358     return (type_ == COMPOUND);
361 inline const token::compound& token::compoundToken() const
363     if (type_ == COMPOUND)
364     {
365         return *compoundTokenPtr_;
366     }
367     else
368     {
369         parseError("compound");
370         return *compoundTokenPtr_;
371     }
375 inline label token::lineNumber() const
377     return lineNumber_;
380 inline label& token::lineNumber()
382     return lineNumber_;
386 inline void token::setBad()
388     clear();
389     type_ = ERROR;
393 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
395 inline void token::operator=(const token& t)
397     clear();
398     type_ = t.type_;
400     switch (type_)
401     {
402         case token::UNDEFINED:
403         break;
405         case PUNCTUATION:
406             punctuationToken_ = t.punctuationToken_;
407         break;
409         case WORD:
410             wordTokenPtr_ = new word(*t.wordTokenPtr_);
411         break;
413         case STRING:
414         case VERBATIMSTRING:
415             stringTokenPtr_ = new string(*t.stringTokenPtr_);
416         break;
418         case LABEL:
419             labelToken_ = t.labelToken_;
420         break;
422         case FLOAT_SCALAR:
423             floatScalarToken_ = t.floatScalarToken_;
424         break;
426         case DOUBLE_SCALAR:
427             doubleScalarToken_ = t.doubleScalarToken_;
428         break;
430         case COMPOUND:
431             compoundTokenPtr_ = t.compoundTokenPtr_;
432             compoundTokenPtr_->refCount::operator++();
433         break;
435         case token::ERROR:
436         break;
437     }
439     lineNumber_ = t.lineNumber_;
442 inline void token::operator=(const punctuationToken p)
444     clear();
445     type_ = PUNCTUATION;
446     punctuationToken_ = p;
449 inline void token::operator=(word* wPtr)
451     clear();
452     type_ = WORD;
453     wordTokenPtr_ = wPtr;
456 inline void token::operator=(const word& w)
458     operator=(new word(w));
461 inline void token::operator=(string* sPtr)
463     clear();
464     type_ = STRING;
465     stringTokenPtr_ = sPtr;
468 inline void token::operator=(const string& s)
470     operator=(new string(s));
473 inline void token::operator=(const label l)
475     clear();
476     type_ = LABEL;
477     labelToken_ = l;
480 inline void token::operator=(const floatScalar s)
482     clear();
483     type_ = FLOAT_SCALAR;
484     floatScalarToken_ = s;
487 inline void token::operator=(const doubleScalar s)
489     clear();
490     type_ = DOUBLE_SCALAR;
491     doubleScalarToken_ = s;
494 inline void token::operator=(token::compound* cPtr)
496     clear();
497     type_ = COMPOUND;
498     compoundTokenPtr_ = cPtr;
502 inline bool token::operator==(const token& t) const
504     if (type_ != t.type_)
505     {
506         return false;
507     }
509     switch (type_)
510     {
511         case token::UNDEFINED:
512             return true;
514         case PUNCTUATION:
515             return punctuationToken_ == t.punctuationToken_;
517         case WORD:
518             return *wordTokenPtr_ == *t.wordTokenPtr_;
520         case STRING:
521         case VERBATIMSTRING:
522             return *stringTokenPtr_ == *t.stringTokenPtr_;
524         case LABEL:
525             return labelToken_ == t.labelToken_;
527         case FLOAT_SCALAR:
528             return equal(floatScalarToken_, t.floatScalarToken_);
530         case DOUBLE_SCALAR:
531             return equal(doubleScalarToken_, t.doubleScalarToken_);
533         case COMPOUND:
534             return compoundTokenPtr_ == t.compoundTokenPtr_;
536         case token::ERROR:
537             return true;
538     }
540     return false;
543 inline bool token::operator==(const punctuationToken p) const
545     return (type_ == PUNCTUATION && punctuationToken_ == p);
548 inline bool token::operator==(const word& w) const
550     return (type_ == WORD && wordToken() == w);
553 inline bool token::operator==(const string& s) const
555     return ((type_ == STRING || type_ == VERBATIMSTRING) && stringToken() == s);
558 inline bool token::operator==(const label l) const
560     return (type_ == LABEL && labelToken_ == l);
563 inline bool token::operator==(const floatScalar s) const
565     return (type_ == FLOAT_SCALAR && equal(floatScalarToken_, s));
568 inline bool token::operator==(const doubleScalar s) const
570     return (type_ == DOUBLE_SCALAR && equal(doubleScalarToken_, s));
573 inline bool token::operator!=(const token& t) const
575     return !operator==(t);
578 inline bool token::operator!=(const punctuationToken p) const
580     return !operator==(p);
583 inline bool token::operator!=(const word& w) const
585     return !operator==(w);
588 inline bool token::operator!=(const string& s) const
590     return !operator==(s);
593 inline bool token::operator!=(const floatScalar s) const
595     return !operator==(s);
598 inline bool token::operator!=(const doubleScalar s) const
600     return !operator==(s);
603 inline bool token::operator!=(const label l) const
605     return !operator==(l);
609 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
611 } // End namespace Foam
613 // ************************************************************************* //