diff --git a/applications/test/wordRe/Test-wordRe.C b/applications/test/wordRe/Test-wordRe.C index 98c4b6ebc63f152155afbd81bafbfe2bc55635a7..e420d4bd034cff58577198c52f5f235146986f34 100644 --- a/applications/test/wordRe/Test-wordRe.C +++ b/applications/test/wordRe/Test-wordRe.C @@ -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. @@ -22,6 +22,7 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Description + Test word/regex \*---------------------------------------------------------------------------*/ @@ -36,6 +37,16 @@ Description using namespace Foam; + +word typeOf(wordRe::compOption retval) +{ + if (wordRe::LITERAL == retval) return "(literal)"; + if (wordRe::UNKNOWN == retval) return "(unknown)"; + if (wordRe::REGEX == retval) return "(regex)"; + return ""; +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Main program: @@ -53,28 +64,30 @@ int main(int argc, char *argv[]) {"this", wordRe::LITERAL}, {"x.*", wordRe::REGEX}, {"file[a-b]", wordRe::REGEX}, + {"xvalues", wordRe::LITERAL}, + {"xv.*", wordRe::REGEX}, }; - if (true) + if (false) { - Info<<"keyType: " << keyre << endl; + Info<<"keyType: " << keyre << nl; keyType key2(std::move(keyre)); - Info<<"move construct: <" << keyre << "> <" << key2 << ">" << endl; + Info<<"move construct: <" << keyre << "> <" << key2 << ">" << nl; keyre = std::move(key2); - Info<<"move assign: <" << keyre << "> <" << key2 << ">" << endl; + Info<<"move assign: <" << keyre << "> <" << key2 << ">" << nl; keyType key3; keyre.swap(key3); - Info<<"swap: <" << keyre << "> <" << key3 << ">" << endl; + Info<<"swap: <" << keyre << "> <" << key3 << ">" << nl; keyre = std::move(key3); - Info<<"move assign: <" << keyre << "> <" << key3 << ">" << endl; + Info<<"move assign: <" << keyre << "> <" << key3 << ">" << nl; return 0; } @@ -83,86 +96,92 @@ int main(int argc, char *argv[]) { wordRe keyre("y.*", wordRe::REGEX); - Info<<"wordRe: " << keyre << endl; + Info<<"wordRe: " << keyre << nl; wordRe key2(std::move(keyre)); - Info<<"keyTypes: " << keyre << " " << key2 << endl; + Info<<"keyTypes: " << keyre << " " << key2 << nl; keyre = std::move(key2); - Info<<"keyTypes: " << keyre << " " << key2 << endl; + Info<<"keyTypes: " << keyre << " " << key2 << nl; wordRe key3; keyre.swap(key3); - Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << endl; + Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << nl; keyre = std::move(key3); - Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << endl; + Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << nl; return 0; } - wordRes wrelist(wordrelist); + wordRes wres1(wordrelist); + + Info<< "re-list:" << wres1 << nl; + Info<< "match this: " << wres1("this") << nl; + Info<< "match xyz: " << wres1("xyz") << nl; + Info<< "match zyx: " << wres1("zyx") << nl; + Info<< "match xyz: " << wres1.match("xyz") << nl; + Info<< "match any: " << predicates::always()("any junk") << nl; + + Info<< "match xvalues: " << wres1.match("xvalues") << nl; + Info<< "matched xvalues = " << typeOf(wres1.matched("xvalues")) << nl; + Info<< "matched xval = " << typeOf(wres1.matched("xval")) << nl; + Info<< "matched zyx = " << typeOf(wres1.matched("zyx")) << nl; - Info<< "re-list:" << wrelist << endl; - Info<< "match this: " << wrelist("this") << endl; - Info<< "match xyz: " << wrelist("xyz") << endl; - Info<< "match zyx: " << wrelist("zyx") << endl; - Info<< "match xyz: " << wrelist.match("xyz") << endl; - Info<< "match any: " << predicates::always()("any junk") << endl; - Info<< "keyre match: " << keyre("xyz") << endl; - Info<< "string match: " << string("this").match("xyz") << endl; - Info<< "string match: " << string("x.*")("xyz") << endl; - Info<< "string match: " << string("x.*")(keyre) << endl; + Info<< "keyre match: " << keyre("xyz") << nl; + Info<< "string match: " << string("this").match("xyz") << nl; + Info<< "string match: " << string("x.*")("xyz") << nl; + Info<< "string match: " << string("x.*")(keyre) << nl; - wordRe(s1, wordRe::DETECT).info(Info) << endl; - wordRe(s2).info(Info) << endl; - wordRe(s2, wordRe::DETECT).info(Info) << endl; - wordRe(s3, wordRe::REGEX).info(Info) << endl; + wordRe(s1, wordRe::DETECT).info(Info) << nl; + wordRe(s2).info(Info) << nl; + wordRe(s2, wordRe::DETECT).info(Info) << nl; + wordRe(s3, wordRe::REGEX).info(Info) << nl; wre = "this .* file"; - Info<<"substring: " << wre.substr(4) << endl; + Info<<"substring: " << wre.substr(4) << nl; - wre.info(Info) << endl; + wre.info(Info) << nl; wre = s1; - wre.info(Info) << endl; + wre.info(Info) << nl; wre.uncompile(); - wre.info(Info) << endl; + wre.info(Info) << nl; wre = "something"; - wre.info(Info) << " before" << endl; + wre.info(Info) << " before" << nl; wre.uncompile(); - wre.info(Info) << " uncompiled" << endl; + wre.info(Info) << " uncompiled" << nl; wre.compile(wordRe::DETECT); - wre.info(Info) << " after DETECT" << endl; + wre.info(Info) << " after DETECT" << nl; wre.compile(wordRe::ICASE); - wre.info(Info) << " after ICASE" << endl; + wre.info(Info) << " after ICASE" << nl; wre.compile(wordRe::DETECT_ICASE); - wre.info(Info) << " after DETECT_ICASE" << endl; + wre.info(Info) << " after DETECT_ICASE" << nl; wre = "something .* value"; - wre.info(Info) << " before" << endl; + wre.info(Info) << " before" << nl; wre.uncompile(); - wre.info(Info) << " uncompiled" << endl; + wre.info(Info) << " uncompiled" << nl; wre.compile(wordRe::DETECT); - wre.info(Info) << " after DETECT" << endl; + wre.info(Info) << " after DETECT" << nl; wre.uncompile(); - wre.info(Info) << " uncompiled" << endl; + wre.info(Info) << " uncompiled" << nl; wre.compile(); - wre.info(Info) << " re-compiled" << endl; + wre.info(Info) << " re-compiled" << nl; wre.set("something .* value", wordRe::LITERAL); - wre.info(Info) << " set as LITERAL" << endl; + wre.info(Info) << " set as LITERAL" << nl; IOobject::writeDivider(Info); List<Tuple2<wordRe, string>> rawList(IFstream("testRegexps")()); - Info<< "input list:" << rawList << endl; - IOobject::writeDivider(Info) << endl; + Info<< "input list:" << rawList << nl; + IOobject::writeDivider(Info) << nl; forAll(rawList, elemI) { @@ -174,7 +193,7 @@ int main(int argc, char *argv[]) << "(" << wre.match(str, true) << ")" << " match:" << wre.match(str) << " str=" << str - << endl; + << nl; wordRe wre2; wre2.set(wre, wordRe::ICASE); @@ -182,11 +201,11 @@ int main(int argc, char *argv[]) wre2.info(Info) << " match:" << wre2.match(str) << " str=" << str - << endl; + << nl; } - Info<< endl; + Info<< "\nEnd\n" << endl; return 0; } diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C index 78df05d1927b95807c3ce86d16cafe72e773b688..546b53d74db517e35cae11437f5ff2d3035c5182 100644 --- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C +++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C @@ -440,7 +440,7 @@ int main(int argc, char *argv[]) { const wordRes patchNames(args.getList<wordRe>("patches")); - if (patchNames.size() == 1 && !patchNames.first().isPattern()) + if (patchNames.size() == 1 && patchNames.first().isLiteral()) { exposedPatchIDs.first() = getExposedPatchId(mesh, patchNames.first()); diff --git a/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C index 6a41293989ed74fed11b2e1bfa95491d3021885d..25e452fce368657265be07f744cb6428594ea014 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C @@ -58,7 +58,7 @@ bool Foam::functionEntries::removeEntry::execute for (const keyType& key : patterns) { - if (key.find('/') != string::npos || !key.isPattern()) + if (key.isLiteral() && key.find('/') != string::npos) { // Remove scoped keyword, or keyword in the local scope dictionary::searcher finder = diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C index 53faf5c0469f540206edc32009b1ab6d02093cd3..ee127be2788d4c88ea55f4bac503a1b994800694 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C @@ -53,7 +53,7 @@ readField // patch name since is key of dictionary. forAllConstIter(dictionary, dict, iter) { - if (iter().isDict() && !iter().keyword().isPattern()) + if (iter().isDict() && iter().keyword().isLiteral()) { const label patchi = bmesh_.findPatchID(iter().keyword()); @@ -96,7 +96,7 @@ readField { const entry& e = iter(); - if (e.isDict() && !e.keyword().isPattern()) + if (e.isDict() && e.keyword().isLiteral()) { const labelList patchIds = bmesh_.indices(e.keyword(), true); // use patchGroups diff --git a/src/OpenFOAM/primitives/strings/keyType/keyType.H b/src/OpenFOAM/primitives/strings/keyType/keyType.H index 188c66e738fa7a693a4d23e440b2a95745c32b9d..608468105f96132a545672dc8559990b634987ed 100644 --- a/src/OpenFOAM/primitives/strings/keyType/keyType.H +++ b/src/OpenFOAM/primitives/strings/keyType/keyType.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. @@ -29,8 +29,7 @@ Description A keyType is the keyword of a dictionary. It differs from word in that it also accepts patterns (regular expressions). - It is very similar to wordRe, but doesn't store the regular expression - separately. + It is very similar to wordRe, but doesn't store a regular expression. SourceFiles keyType.C @@ -47,12 +46,10 @@ SourceFiles namespace Foam { -// Forward declaration of classes +// Forward declarations +class keyType; class Istream; class Ostream; - -// Forward declaration of friend functions and operators -class keyType; Istream& operator>>(Istream& is, keyType& kw); Ostream& operator<<(Ostream& os, const keyType& kw); @@ -70,6 +67,7 @@ class keyType //- Is the keyType a pattern (regular expression) bool isPattern_; + // Private Member Functions //- No assignment where we cannot determine string/word type @@ -121,14 +119,17 @@ public: keyType(Istream& is); - // Member functions + // Member Functions //- Is this character valid for a keyType? // This is largely identical with what word accepts, but also // permit brace-brackets, which are valid for some regexs. inline static bool valid(char c); - //- Treat as a pattern rather than a literal string? + //- The keyType is treated as literal, not as pattern. + inline bool isLiteral() const; + + //- The keyType is treated as a pattern, not as literal string. inline bool isPattern() const; //- Swap contents @@ -139,7 +140,7 @@ public: bool match(const std::string& text, bool literal = false) const; - // Member operators + // Member Operators //- Perform smart match on text, as per match() // Allows use as a predicate. @@ -162,7 +163,7 @@ public: inline void operator=(const char* s); - // IOstream operators + // IOstream Operators friend Istream& operator>>(Istream& is, keyType& kw); friend Ostream& operator<<(Ostream& os, const keyType& kw); diff --git a/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H b/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H index 3885e6ecf2ba22dd200ad8cb174101158b8dd7e7..bf84de6a2384888d2ee825e5a1d71b6d7052a510 100644 --- a/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H +++ b/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H @@ -84,7 +84,6 @@ inline Foam::keyType::keyType(const std::string& s, const bool isPattern) {} - inline Foam::keyType::keyType(keyType&& s) : word(std::move(static_cast<word&>(s)), false), @@ -117,6 +116,12 @@ inline Foam::keyType::keyType(std::string&& s, const bool isPattern) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +inline bool Foam::keyType::isLiteral() const +{ + return !isPattern_; +} + + inline bool Foam::keyType::isPattern() const { return isPattern_; diff --git a/src/OpenFOAM/primitives/strings/wordRe/wordRe.H b/src/OpenFOAM/primitives/strings/wordRe/wordRe.H index 4c7294aab98fbe801d5744ff9d42c63a328b8f11..9976ecb6dce27419a551067fe10e4bebef96e077 100644 --- a/src/OpenFOAM/primitives/strings/wordRe/wordRe.H +++ b/src/OpenFOAM/primitives/strings/wordRe/wordRe.H @@ -59,7 +59,7 @@ SourceFiles namespace Foam { -// Forward declaration of friend functions and operators +// Forward declarations class wordRe; class Istream; class Ostream; @@ -81,6 +81,7 @@ class wordRe //- The regular expression mutable regExp re_; + public: // Static data members @@ -97,6 +98,7 @@ public: { LITERAL = 0, //!< Treat as a string literal DETECT = 1, //!< Detect if the string contains meta-characters + UNKNOWN = 1, //!< Unknown content. REGEX = 2, //!< Treat as regular expression ICASE = 4, //!< Ignore case in regular expression NOCASE = 4, //!< \deprecated Alias for ICASE (deprecated APR-2018) @@ -163,11 +165,14 @@ public: wordRe(Istream& is); - // Member functions + // Member Functions // Access - //- Treat as a pattern rather than a literal string? + //- The wordRe is treated as literal, not as pattern. + inline bool isLiteral() const; + + //- The wordRe is treated as a pattern, not as literal string. inline bool isPattern() const; @@ -248,7 +253,7 @@ public: inline void operator=(wordRe&& str); - // IOstream operators + // IOstream Operators friend Istream& operator>>(Istream& is, wordRe& w); friend Ostream& operator<<(Ostream& os, const wordRe& w); diff --git a/src/OpenFOAM/primitives/strings/wordRe/wordReI.H b/src/OpenFOAM/primitives/strings/wordRe/wordReI.H index 5e9532c7b922bf052fa1a1004cb94d84dc4bff39..13579d76c72851dcc95e09874759bf3cdf3cb3ef 100644 --- a/src/OpenFOAM/primitives/strings/wordRe/wordReI.H +++ b/src/OpenFOAM/primitives/strings/wordRe/wordReI.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. @@ -157,6 +157,12 @@ inline Foam::wordRe::wordRe(const word& str, const compOption opt) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +inline bool Foam::wordRe::isLiteral() const +{ + return !re_.exists(); +} + + inline bool Foam::wordRe::isPattern() const { return re_.exists(); diff --git a/src/OpenFOAM/primitives/strings/wordRes/wordRes.H b/src/OpenFOAM/primitives/strings/wordRes/wordRes.H index 28cf35b9727d0ff7f234aaf21017c45725889ab9..197823682c79cfcf69f75cb65cdd48c5bbbb0d5a 100644 --- a/src/OpenFOAM/primitives/strings/wordRes/wordRes.H +++ b/src/OpenFOAM/primitives/strings/wordRes/wordRes.H @@ -53,7 +53,7 @@ class wordRes { // Private Methods - //- Check for any match of text in list of matchers + //- Smart match as literal or regex, stopping on the first match. inline static bool found_match ( const UList<wordRe>& patterns, @@ -61,6 +61,17 @@ class wordRes bool literal=false ); + //- Smart match across entire list, returning the match type. + // Stops on the first literal match, or continues to examine + // if a regex match occurs. + // \return wordRe::LITERAL, wordRe::REGEX on match and + // wordRe::UNKNOWN otherwise. + inline static wordRe::compOption found_matched + ( + const UList<wordRe>& patterns, + const std::string& text + ); + public: @@ -111,16 +122,23 @@ public: // No filtering attempted on regular expressions. void uniq(); - //- Return true if string matches ANY of the regular expressions - // Smart match as regular expression or as a string. - // Optionally force a literal match only - inline bool match(const std::string& text, bool literal=false) const; + //- Smart match as literal or regex, stopping on the first match. + // + // \param literal Force literal match only. + // \return True if text matches ANY of the entries. + inline bool match(const std::string& text, bool literal = false) const; + + //- Smart match in the list of matchers, returning the match type. + // It stops if there is a literal match, or continues to examine + // other regexs. + // \return LITERAL if a lteral match was found, REGEX if a regex + // match was found and UNKNOWN otherwise. + inline wordRe::compOption matched(const std::string& text) const; - // Member operators + // Member Operators - //- Perform smart match on text, as per match() - // Allows use as a predicate. + //- Identical to match(), for use as a predicate. inline bool operator()(const std::string& text) const; }; diff --git a/src/OpenFOAM/primitives/strings/wordRes/wordResI.H b/src/OpenFOAM/primitives/strings/wordRes/wordResI.H index ab602ee1f8e0a7c3aa42193ce3c624ebaa8ad456..65cbe2fe46534c91a3dcdaa88936a8e391f8318e 100644 --- a/src/OpenFOAM/primitives/strings/wordRes/wordResI.H +++ b/src/OpenFOAM/primitives/strings/wordRes/wordResI.H @@ -50,6 +50,36 @@ inline bool Foam::wordRes::found_match } +inline Foam::wordRe::compOption Foam::wordRes::found_matched +( + const UList<wordRe>& patterns, + const std::string& text +) +{ + auto retval(wordRe::compOption::UNKNOWN); + + for (const wordRe& select : patterns) + { + if (select.isLiteral()) + { + if (select.match(text, true)) + { + return wordRe::compOption::LITERAL; + } + } + else if (wordRe::compOption::UNKNOWN == retval) + { + if (select.match(text, false)) + { + retval = wordRe::compOption::REGEX; + } + } + } + + return retval; +} + + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // inline bool Foam::wordRes::match(const std::string& text, bool literal) const @@ -58,6 +88,13 @@ inline bool Foam::wordRes::match(const std::string& text, bool literal) const } +inline Foam::wordRe::compOption +Foam::wordRes::matched(const std::string& text) const +{ + return found_matched(*this, text); +} + + // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // inline bool Foam::wordRes::operator()(const std::string& text) const diff --git a/src/OpenFOAM/primitives/transform/transform.H b/src/OpenFOAM/primitives/transform/transform.H index cb72b2ba18c0b13ba7a6dc132002b123e892a6d3..46c8aaad3291f974560643ce8a95f93c1301ee8f 100644 --- a/src/OpenFOAM/primitives/transform/transform.H +++ b/src/OpenFOAM/primitives/transform/transform.H @@ -170,7 +170,7 @@ inline label invTransform(const tensor&, const label i) } -//- No-op rotational transform of a label +//- No-op rotational transform of a scalar inline scalar transform(const tensor&, const scalar s) { return s; diff --git a/src/functionObjects/field/ddt2/ddt2.C b/src/functionObjects/field/ddt2/ddt2.C index d00fb6d0c6f07e314c5bd2e8fdad6ecee6a7ee5d..73a846f372eb957dcd9f08b4dbbfbbd2b05ec30d 100644 --- a/src/functionObjects/field/ddt2/ddt2.C +++ b/src/functionObjects/field/ddt2/ddt2.C @@ -174,9 +174,9 @@ bool Foam::functionObjects::ddt2::execute() // Check exact matches first for (const wordRe& select : selectFields_) { - if (!select.isPattern()) + if (select.isLiteral()) { - const word& fieldName = static_cast<const word&>(select); + const word& fieldName = select; if (!candidates.erase(fieldName)) { diff --git a/src/functionObjects/field/zeroGradient/zeroGradient.C b/src/functionObjects/field/zeroGradient/zeroGradient.C index 1575a9be39400e8a9939c1e0b468d3c408ba12cb..f5b36b79a7d1f2f89d56a0b6b99fc5ced82ca4c4 100644 --- a/src/functionObjects/field/zeroGradient/zeroGradient.C +++ b/src/functionObjects/field/zeroGradient/zeroGradient.C @@ -133,9 +133,9 @@ bool Foam::functionObjects::zeroGradient::execute() // Check exact matches first for (const wordRe& select : selectFields_) { - if (!select.isPattern()) + if (select.isLiteral()) { - const word& fieldName = static_cast<const word&>(select); + const word& fieldName = select; if (!candidates.erase(fieldName)) { diff --git a/src/functionObjects/utilities/ensightWrite/ensightWrite.C b/src/functionObjects/utilities/ensightWrite/ensightWrite.C index 75e741c2cbd82bac53363cc962f2b4a191005842..710bee74fe98f550f3eeb2d7dc51956e00aec1d2 100644 --- a/src/functionObjects/utilities/ensightWrite/ensightWrite.C +++ b/src/functionObjects/utilities/ensightWrite/ensightWrite.C @@ -284,7 +284,7 @@ bool Foam::functionObjects::ensightWrite::write() // Check exact matches first for (const wordRe& select : selectFields_) { - if (!select.isPattern()) + if (select.isLiteral()) { const word& fieldName = select;