1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
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 the
13 Free Software Foundation; either version 2 of the License, or (at your
14 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
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
29 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
36 // Clear any allocated storage (word or string)
37 inline void token::clear()
43 else if (type_ == STRING)
45 delete stringTokenPtr_;
47 else if (type_ == COMPOUND)
49 if (compoundTokenPtr_->okToDelete())
51 delete compoundTokenPtr_;
55 compoundTokenPtr_->refCount::operator--();
63 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
73 inline token::token(const token& t)
76 lineNumber_(t.lineNumber_)
80 case token::UNDEFINED:
84 punctuationToken_ = t.punctuationToken_;
88 wordTokenPtr_ = new word(*t.wordTokenPtr_);
92 stringTokenPtr_ = new string(*t.stringTokenPtr_);
96 labelToken_ = t.labelToken_;
100 floatScalarToken_ = t.floatScalarToken_;
104 doubleScalarToken_ = t.doubleScalarToken_;
108 compoundTokenPtr_ = t.compoundTokenPtr_;
109 compoundTokenPtr_->refCount::operator++();
117 // Construct punctuation character token
118 inline token::token(punctuationToken p, label lineNumber)
121 punctuationToken_(p),
122 lineNumber_(lineNumber)
125 // Construct word token
126 inline token::token(const word& w, label lineNumber)
129 wordTokenPtr_(new word(w)),
130 lineNumber_(lineNumber)
133 // Construct string token
134 inline token::token(const string& s, label lineNumber)
137 stringTokenPtr_(new string(s)),
138 lineNumber_(lineNumber)
141 // Construct label token
142 inline token::token(const label l, label lineNumber)
146 lineNumber_(lineNumber)
149 // Construct floatScalar token
150 inline token::token(const floatScalar s, label lineNumber)
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()
175 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
177 inline token::tokenType token::type() const
182 inline bool token::good() const
184 return (type_ != ERROR && type_ != UNDEFINED);
187 inline bool token::undefined() const
189 return (type_ == UNDEFINED);
192 inline bool token::error() const
194 return (type_ == ERROR);
197 inline bool token::isPunctuation() const
199 return (type_ == PUNCTUATION);
202 inline token::punctuationToken token::pToken() const
204 if (type_ == PUNCTUATION)
206 return punctuationToken_;
210 parseError("punctuation character");
215 inline bool token::isWord() const
217 return (type_ == WORD);
220 inline const word& token::wordToken() const
224 return *wordTokenPtr_;
233 inline bool token::isString() const
235 return (type_ == STRING);
238 inline const string& token::stringToken() const
242 return *stringTokenPtr_;
246 parseError("string");
251 inline bool token::isLabel() const
253 return (type_ == LABEL);
256 inline label token::labelToken() const
269 inline bool token::isFloatScalar() const
271 return (type_ == FLOAT_SCALAR);
274 inline floatScalar token::floatScalarToken() const
276 if (type_ == FLOAT_SCALAR)
278 return floatScalarToken_;
282 parseError("floatScalar");
288 inline bool token::isDoubleScalar() const
290 return (type_ == DOUBLE_SCALAR);
293 inline doubleScalar token::doubleScalarToken() const
295 if (type_ == DOUBLE_SCALAR)
297 return doubleScalarToken_;
301 parseError("doubleScalar");
307 inline bool token::isScalar() const
309 return (type_ == FLOAT_SCALAR || type_ == DOUBLE_SCALAR);
312 inline scalar token::scalarToken() const
314 if (type_ == FLOAT_SCALAR)
316 return floatScalarToken_;
318 else if (type_ == DOUBLE_SCALAR)
320 return doubleScalarToken_;
324 parseError("scalar");
329 inline bool token::isNumber() const
331 return (type_ == LABEL || isScalar());
334 inline scalar token::number() const
342 return scalarToken();
346 parseError("number (label or scalar)");
351 inline bool token::isCompound() const
353 return (type_ == COMPOUND);
356 inline const token::compound& token::compoundToken() const
358 if (type_ == COMPOUND)
360 return *compoundTokenPtr_;
364 parseError("compound");
365 return *compoundTokenPtr_;
370 inline label token::lineNumber() const
375 inline label& token::lineNumber()
381 inline void token::setBad()
388 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
390 inline void token::operator=(const token& t)
397 case token::UNDEFINED:
401 punctuationToken_ = t.punctuationToken_;
405 wordTokenPtr_ = new word(*t.wordTokenPtr_);
409 stringTokenPtr_ = new string(*t.stringTokenPtr_);
413 labelToken_ = t.labelToken_;
417 floatScalarToken_ = t.floatScalarToken_;
421 doubleScalarToken_ = t.doubleScalarToken_;
425 compoundTokenPtr_ = t.compoundTokenPtr_;
426 compoundTokenPtr_->refCount::operator++();
433 lineNumber_ = t.lineNumber_;
436 inline void token::operator=(const punctuationToken p)
440 punctuationToken_ = p;
443 inline void token::operator=(word* wPtr)
447 wordTokenPtr_ = wPtr;
450 inline void token::operator=(const word& w)
452 operator=(new word(w));
455 inline void token::operator=(string* sPtr)
459 stringTokenPtr_ = sPtr;
462 inline void token::operator=(const string& s)
464 operator=(new string(s));
467 inline void token::operator=(const label l)
474 inline void token::operator=(const floatScalar s)
477 type_ = FLOAT_SCALAR;
478 floatScalarToken_ = s;
481 inline void token::operator=(const doubleScalar s)
484 type_ = DOUBLE_SCALAR;
485 doubleScalarToken_ = s;
488 inline void token::operator=(token::compound* cPtr)
492 compoundTokenPtr_ = cPtr;
496 inline bool token::operator==(const token& t) const
498 if (type_ != t.type_)
505 case token::UNDEFINED:
509 return punctuationToken_ == t.punctuationToken_;
512 return *wordTokenPtr_ == *t.wordTokenPtr_;
515 return *stringTokenPtr_ == *t.stringTokenPtr_;
518 return labelToken_ == t.labelToken_;
521 return equal(floatScalarToken_, t.floatScalarToken_);
524 return equal(doubleScalarToken_, t.doubleScalarToken_);
527 return compoundTokenPtr_ == t.compoundTokenPtr_;
536 inline bool token::operator==(const punctuationToken p) const
538 return (type_ == PUNCTUATION && punctuationToken_ == p);
541 inline bool token::operator==(const word& w) const
543 return (type_ == WORD && wordToken() == w);
546 inline bool token::operator==(const string& s) const
548 return (type_ == STRING && stringToken() == s);
551 inline bool token::operator==(const label l) const
553 return (type_ == LABEL && labelToken_ == l);
556 inline bool token::operator==(const floatScalar s) const
558 return (type_ == FLOAT_SCALAR && equal(floatScalarToken_, s));
561 inline bool token::operator==(const doubleScalar s) const
563 return (type_ == DOUBLE_SCALAR && equal(doubleScalarToken_, s));
566 inline bool token::operator!=(const token& t) const
568 return !operator==(t);
571 inline bool token::operator!=(const punctuationToken p) const
573 return !operator==(p);
576 inline bool token::operator!=(const word& w) const
578 return !operator==(w);
581 inline bool token::operator!=(const string& s) const
583 return !operator==(s);
586 inline bool token::operator!=(const floatScalar s) const
588 return !operator==(s);
591 inline bool token::operator!=(const doubleScalar s) const
593 return !operator==(s);
596 inline bool token::operator!=(const label l) const
598 return !operator==(l);
602 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
604 } // End namespace Foam
606 // ************************************************************************* //