diff --git a/src/OpenFOAM/db/IOstreams/token/token.H b/src/OpenFOAM/db/IOstreams/token/token.H index 48d5cde872721f0a562c7630af04a758465d0111..eb2b19a1d0c488d61758c418dce5cf22cc642f00 100644 --- a/src/OpenFOAM/db/IOstreams/token/token.H +++ b/src/OpenFOAM/db/IOstreams/token/token.H @@ -79,6 +79,7 @@ public: UNDEFINED = 0, //!< An undefined token-type // Fundamental types + BOOL, //!< boolean type FLAG, //!< stream flag (1-byte bitmask) PUNCTUATION, //!< single character punctuation LABEL, //!< label (integer) type @@ -92,7 +93,7 @@ public: //!< dictionary \c $variable expansion VERBATIMSTRING, //!< Contents are a Foam::string representing verbatim //!< content - COMPOUND, //!< Compound type such as List\<label\> etc. + COMPOUND, //!< Compound type such as \c List\<label\> etc. ERROR //!< A token error encountered }; @@ -115,20 +116,22 @@ public: TAB = '\t', NL = '\n', - END_STATEMENT = ';', //!< End entry [#isseparator] - BEGIN_LIST = '(', //!< Begin list [#isseparator] - END_LIST = ')', //!< End list [#isseparator] - BEGIN_SQR = '[', //!< Begin dimensions [#isseparator] - END_SQR = ']', //!< End dimensions [#isseparator] - BEGIN_BLOCK = '{', //!< Begin block [#isseparator] - END_BLOCK = '}', //!< End block [#isseparator] - COLON = ':', //!< Colon [#isseparator] - COMMA = ',', //!< Comma [#isseparator] + END_STATEMENT = ';', //!< End entry [#isseparator] + BEGIN_LIST = '(', //!< Begin list [#isseparator] + END_LIST = ')', //!< End list [#isseparator] + BEGIN_SQR = '[', //!< Begin dimensions [#isseparator] + END_SQR = ']', //!< End dimensions [#isseparator] + BEGIN_BLOCK = '{', //!< Begin block [#isseparator] + END_BLOCK = '}', //!< End block [#isseparator] + COLON = ':', //!< Colon [#isseparator] + COMMA = ',', //!< Comma [#isseparator] HASH = '#', ATSYM = '@', + SQUOTE = '\'', //!< Single quote + DQUOTE = '"', //!< Double quote - BEGIN_STRING = '"', - END_STRING = BEGIN_STRING, + BEGIN_STRING = DQUOTE, //!< Double quote for begin string + END_STRING = DQUOTE, //!< Double quote for end string ASSIGN = '=', //!< Assignment/equals [#isseparator] ADD = '+', //!< Addition [#isseparator] @@ -358,6 +361,9 @@ public: // Static Member Functions + //- Create a bool token. + inline static token boolean(bool on); + //- Create a token with stream flags, no sanity check // // \param bitmask the flags to set @@ -406,6 +412,9 @@ public: //- True if token is ERROR inline bool error() const; + //- True if token is BOOL + inline bool isBool() const; + //- True if token is FLAG inline bool isFlag() const; @@ -445,7 +454,11 @@ public: // Access - //- Return flag bitmask + //- Return boolean token value. + // Report FatalIOError and return false if token is not BOOL + inline bool boolToken() const; + + //- Return flag bitmask value. // Report FatalIOError and return NO_FLAG if token is not FLAG inline int flagToken() const; diff --git a/src/OpenFOAM/db/IOstreams/token/tokenI.H b/src/OpenFOAM/db/IOstreams/token/tokenI.H index da3f0abcdf7d85eaf7efa6df013b631e56bc392c..6c37a3c7b1d78dfb40cc5686b9198e3909a33538 100644 --- a/src/OpenFOAM/db/IOstreams/token/tokenI.H +++ b/src/OpenFOAM/db/IOstreams/token/tokenI.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -27,6 +27,16 @@ License // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // +inline Foam::token Foam::token::boolean(bool on) +{ + token tok; + tok.type_ = tokenType::BOOL; + tok.data_.labelVal = on; + + return tok; +} + + inline Foam::token Foam::token::flag(int bitmask) { token tok; @@ -306,6 +316,23 @@ inline bool Foam::token::setType(token::tokenType variant) switch (variant) { + case tokenType::BOOL: + case tokenType::LABEL: + { + switch (type_) + { + case tokenType::BOOL: + case tokenType::LABEL: + type_ = variant; + return true; + break; + + default: + break; + } + } + break; + case tokenType::STRING: case tokenType::VARIABLE: case tokenType::VERBATIMSTRING: @@ -321,10 +348,10 @@ inline bool Foam::token::setType(token::tokenType variant) break; default: - return false; break; } } + break; default: break; @@ -364,6 +391,24 @@ inline bool Foam::token::error() const } +inline bool Foam::token::isBool() const +{ + return (type_ == tokenType::BOOL); +} + + +inline bool Foam::token::boolToken() const +{ + if (type_ == tokenType::BOOL) + { + return data_.labelVal; + } + + parseError("bool"); + return false; +} + + inline bool Foam::token::isFlag() const { return (type_ == tokenType::FLAG); @@ -423,7 +468,7 @@ inline Foam::label Foam::token::labelToken() const return data_.labelVal; } - parseError(pTraits<label>::typeName); + parseError("label"); return 0; } @@ -441,8 +486,8 @@ inline Foam::floatScalar Foam::token::floatScalarToken() const return data_.floatVal; } - parseError("floatScalar"); - return 0.0; + parseError("float"); + return 0; } @@ -459,8 +504,8 @@ inline Foam::doubleScalar Foam::token::doubleScalarToken() const return data_.doubleVal; } - parseError("doubleScalar"); - return 0.0; + parseError("double"); + return 0; } @@ -485,8 +530,8 @@ inline Foam::scalar Foam::token::scalarToken() const return data_.doubleVal; } - parseError(pTraits<scalar>::typeName); - return 0.0; + parseError("scalar"); + return 0; } @@ -508,7 +553,7 @@ inline Foam::scalar Foam::token::number() const } parseError("number (label or scalar)"); - return 0.0; + return 0; } @@ -525,7 +570,7 @@ inline const Foam::word& Foam::token::wordToken() const return *data_.wordPtr; } - parseError(word::typeName); + parseError("word"); return word::null; } @@ -559,7 +604,7 @@ inline const Foam::string& Foam::token::stringToken() const return *data_.stringPtr; } - parseError(string::typeName); + parseError("string"); return string::null; } @@ -742,6 +787,9 @@ inline bool Foam::token::operator==(const token& tok) const case tokenType::UNDEFINED: return true; + case tokenType::BOOL: + return data_.labelVal == tok.data_.labelVal; + case tokenType::FLAG: return data_.flagVal == tok.data_.flagVal; diff --git a/src/OpenFOAM/db/IOstreams/token/tokenIO.C b/src/OpenFOAM/db/IOstreams/token/tokenIO.C index cbd4af1ac17276302883d0fbace4e8149ff3d497..4a1c28668fe91447c49fc9948f5b8ffbca75ed34 100644 --- a/src/OpenFOAM/db/IOstreams/token/tokenIO.C +++ b/src/OpenFOAM/db/IOstreams/token/tokenIO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -43,6 +43,10 @@ static OS& printTokenInfo(OS& os, const token& tok) os << "undefined token"; break; + case token::tokenType::BOOL: + os << "bool '" << (tok.boolToken() ? "true" : "false") << '\''; + break; + case token::tokenType::FLAG: os << "flag '" << int(tok.flagToken()) << '\''; break; @@ -121,6 +125,7 @@ Foam::word Foam::token::name() const switch (type_) { case token::tokenType::UNDEFINED: return "undefined"; + case token::tokenType::BOOL: return "bool"; case token::tokenType::FLAG: return "flag"; case token::tokenType::PUNCTUATION: return "punctuation"; case token::tokenType::LABEL: return "label"; @@ -160,6 +165,10 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const token& tok) << "Undefined token" << endl; break; + case token::tokenType::BOOL: + os << tok.data_.labelVal; + break; + case token::tokenType::FLAG: // Swallow the flag break; @@ -207,8 +216,7 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const token& tok) default: os << "UNKNOWN"; SeriousErrorInFunction - << "Unknown token" - << endl; + << "Unknown token" << endl; } os.check(FUNCTION_NAME);