Merge branch 'develop' of develop.openfoam.com:Development/OpenFOAM-plus into develop

This commit is contained in:
sergio
2018-10-08 15:42:19 -07:00
14 changed files with 173 additions and 82 deletions

View File

@ -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:" << 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<< "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;
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;
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<< "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) << 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;
}

View File

@ -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());

View File

@ -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 =

View File

@ -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

View File

@ -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);

View File

@ -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_;

View File

@ -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);

View File

@ -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();

View File

@ -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
//- 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
//- Perform smart match on text, as per match()
// Allows use as a predicate.
// Member Operators
//- Identical to match(), for use as a predicate.
inline bool operator()(const std::string& text) const;
};

View File

@ -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

View File

@ -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;

View File

@ -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))
{

View File

@ -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))
{

View File

@ -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;