mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: dictionary checking methods with predicates on the input values
- can be used to check the validity of input values.
Example:
dict.getCheck<label>("nIters", greaterOp1<label>(0));
dict.getCheck<scalar>("relax", scalarMinMax::zero_one());
- use 'get' prefix for more regular dictionary methods.
Eg, getOrDefault() as alternative to lookupOrDefault()
- additional ops for convenient construction of predicates
ENH: make dictionary writeOptionalEntries integer
- allow triggering of Fatal if default values are used
ENH: additional scalarRange static methods: ge0, gt0, zero_one
- use GREAT instead of VGREAT for internal placeholders
- additional MinMax static methods: gt, le
This commit is contained in:
committed by
Andrew Heather
parent
b043be3063
commit
32916fa845
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -34,6 +34,8 @@ Description
|
|||||||
#include "IOobject.H"
|
#include "IOobject.H"
|
||||||
#include "IFstream.H"
|
#include "IFstream.H"
|
||||||
#include "dictionary.H"
|
#include "dictionary.H"
|
||||||
|
#include "ops.H"
|
||||||
|
#include "scalarRange.H"
|
||||||
#include "stringOps.H"
|
#include "stringOps.H"
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
@ -108,6 +110,42 @@ scalar try_getScalar(const dictionary& dict, const word& k)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Try with getCheck<scalar>
|
||||||
|
template<class Predicate>
|
||||||
|
scalar try_getCheckScalar
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
const word& k,
|
||||||
|
const Predicate& pred
|
||||||
|
)
|
||||||
|
{
|
||||||
|
scalar val(-GREAT);
|
||||||
|
|
||||||
|
const bool throwingIOError = FatalIOError.throwExceptions();
|
||||||
|
const bool throwingError = FatalError.throwExceptions();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
val = dict.getCheck<scalar>(k, pred);
|
||||||
|
Info<< "getCheck<scalar>(" << k << ") = " << val << nl;
|
||||||
|
}
|
||||||
|
catch (const Foam::IOerror& err)
|
||||||
|
{
|
||||||
|
Info<< "getCheck<scalar>(" << k << ") Caught FatalIOError "
|
||||||
|
<< err << nl << endl;
|
||||||
|
}
|
||||||
|
catch (const Foam::error& err)
|
||||||
|
{
|
||||||
|
Info<< "getCheck<scalar>(" << k << ") Caught FatalError "
|
||||||
|
<< err << nl << endl;
|
||||||
|
}
|
||||||
|
FatalError.throwExceptions(throwingError);
|
||||||
|
FatalIOError.throwExceptions(throwingIOError);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Try with *entry (from findEntry) and get<scalar>
|
// Try with *entry (from findEntry) and get<scalar>
|
||||||
scalar try_getScalar(const entry* eptr, const word& k)
|
scalar try_getScalar(const entry* eptr, const word& k)
|
||||||
{
|
{
|
||||||
@ -311,6 +349,7 @@ int main(int argc, char *argv[])
|
|||||||
IStringStream
|
IStringStream
|
||||||
(
|
(
|
||||||
"good 3.14159;\n"
|
"good 3.14159;\n"
|
||||||
|
"negative -3.14159;\n"
|
||||||
"empty;\n"
|
"empty;\n"
|
||||||
// "bad text;\n" // always fails
|
// "bad text;\n" // always fails
|
||||||
// "bad 3.14159 1234;\n" // fails for readScalar
|
// "bad 3.14159 1234;\n" // fails for readScalar
|
||||||
@ -338,6 +377,26 @@ int main(int argc, char *argv[])
|
|||||||
try_getScalar(dict2, "empty");
|
try_getScalar(dict2, "empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// With getCheck<scalar>
|
||||||
|
{
|
||||||
|
Info<< nl << "Test some input with getCheck<scalar>()" << nl;
|
||||||
|
|
||||||
|
try_getCheckScalar(dict2, "good", scalarRange::gt0());
|
||||||
|
try_getCheckScalar(dict2, "negative", scalarRange::gt0());
|
||||||
|
|
||||||
|
try_getCheckScalar(dict2, "good", greaterOp1<scalar>(0));
|
||||||
|
try_getCheckScalar(dict2, "negative", greaterOp1<scalar>(0));
|
||||||
|
|
||||||
|
Info<< nl << "with lambda" << nl;
|
||||||
|
try_getCheckScalar
|
||||||
|
(
|
||||||
|
dict2,
|
||||||
|
"good",
|
||||||
|
[](const scalar x) { return x > 0; }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// With findEntry and get<scalar>
|
// With findEntry and get<scalar>
|
||||||
{
|
{
|
||||||
Info<< nl
|
Info<< nl
|
||||||
|
|||||||
@ -36,6 +36,8 @@ Description
|
|||||||
#include "FlatOutput.H"
|
#include "FlatOutput.H"
|
||||||
#include "Tuple2.H"
|
#include "Tuple2.H"
|
||||||
#include "StringStream.H"
|
#include "StringStream.H"
|
||||||
|
#include "ops.H"
|
||||||
|
#include "bitSet.H"
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
@ -44,7 +46,7 @@ void doTest(const scalarList& values, const predicates::scalars& accept)
|
|||||||
{
|
{
|
||||||
// Also tests that output is suppressed
|
// Also tests that output is suppressed
|
||||||
Info<<"Have: " << accept.size() << " predicates" << accept << endl;
|
Info<<"Have: " << accept.size() << " predicates" << accept << endl;
|
||||||
Info<<"values: " << flatOutput(values) << endl;
|
Info<<"values: " << flatOutput(values) << endl;
|
||||||
|
|
||||||
for (const scalar& value : values)
|
for (const scalar& value : values)
|
||||||
{
|
{
|
||||||
@ -60,6 +62,30 @@ void doTest(const scalarList& values, const predicates::scalars& accept)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Predicate>
|
||||||
|
void testPredicate(const scalarList& values, const Predicate& pred)
|
||||||
|
{
|
||||||
|
bitSet matches;
|
||||||
|
|
||||||
|
label i=0;
|
||||||
|
|
||||||
|
for (const scalar& value : values)
|
||||||
|
{
|
||||||
|
if (pred(value))
|
||||||
|
{
|
||||||
|
matches.set(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
IndirectList<scalar> matched(values, matches.toc());
|
||||||
|
|
||||||
|
Info<< "matched: " << flatOutput(matched.addressing())
|
||||||
|
<< " = " << flatOutput(matched) << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
// Main program:
|
// Main program:
|
||||||
|
|
||||||
@ -149,6 +175,16 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Info<< nl << "Test with ops" << nl;
|
||||||
|
Info<<"values: " << flatOutput(values) << endl;
|
||||||
|
{
|
||||||
|
testPredicate(values, lessOp1<scalar>(10));
|
||||||
|
testPredicate(values, greaterOp1<scalar>(100));
|
||||||
|
|
||||||
|
// Also with dissimilar type
|
||||||
|
testPredicate(values, lessEqOp1<label>(0));
|
||||||
|
}
|
||||||
|
|
||||||
Info<< "\nEnd\n" << endl;
|
Info<< "\nEnd\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -37,6 +37,8 @@ InfoSwitches
|
|||||||
writePrecision 6;
|
writePrecision 6;
|
||||||
|
|
||||||
writeDictionaries 0;
|
writeDictionaries 0;
|
||||||
|
|
||||||
|
// Report optional dictionary entries. For value > 1, treat as fatal.
|
||||||
writeOptionalEntries 0;
|
writeOptionalEntries 0;
|
||||||
|
|
||||||
// Write lagrangian "positions" file in v1706 format (and earlier)
|
// Write lagrangian "positions" file in v1706 format (and earlier)
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -42,13 +42,12 @@ namespace Foam
|
|||||||
|
|
||||||
const Foam::dictionary Foam::dictionary::null;
|
const Foam::dictionary Foam::dictionary::null;
|
||||||
|
|
||||||
bool Foam::dictionary::writeOptionalEntries
|
int Foam::dictionary::writeOptionalEntries
|
||||||
(
|
(
|
||||||
Foam::debug::infoSwitch("writeOptionalEntries", 0)
|
Foam::debug::infoSwitch("writeOptionalEntries", 0)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::dictionary::dictionary()
|
Foam::dictionary::dictionary()
|
||||||
@ -311,13 +310,30 @@ void Foam::dictionary::checkITstream
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::dictionary::raiseBadInput(const word& keyword) const
|
||||||
|
{
|
||||||
|
// Can use FatalIOError instead of SafeFatalIOError
|
||||||
|
// since predicate checks are not used at the earliest stages
|
||||||
|
FatalIOError
|
||||||
|
(
|
||||||
|
"", // functionName
|
||||||
|
"", // sourceFileName
|
||||||
|
0, // sourceFileLineNumber
|
||||||
|
*this // ios
|
||||||
|
)
|
||||||
|
<< "Entry '" << keyword << "' with invalid input in dictionary "
|
||||||
|
<< name() << nl << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Foam::dictionary::found
|
bool Foam::dictionary::found
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
enum keyType::option matchOpt
|
enum keyType::option matchOpt
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
return csearch(keyword, matchOpt).found();
|
return csearch(keyword, matchOpt).good();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -359,11 +375,11 @@ const Foam::entry& Foam::dictionary::lookupEntry
|
|||||||
{
|
{
|
||||||
const const_searcher finder(csearch(keyword, matchOpt));
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
if (!finder.found())
|
if (!finder.good())
|
||||||
{
|
{
|
||||||
FatalIOErrorInFunction(*this)
|
FatalIOErrorInFunction(*this)
|
||||||
<< "Entry '" << keyword << "' not found in dictionary "
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
<< name()
|
<< name() << nl
|
||||||
<< exit(FatalIOError);
|
<< exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +411,7 @@ bool Foam::dictionary::substituteKeyword(const word& keyword, bool mergeEntry)
|
|||||||
const const_searcher finder(csearch(varName, keyType::REGEX_RECURSIVE));
|
const const_searcher finder(csearch(varName, keyType::REGEX_RECURSIVE));
|
||||||
|
|
||||||
// If defined insert its entries into this dictionary
|
// If defined insert its entries into this dictionary
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
for (const entry& e : finder.dict())
|
for (const entry& e : finder.dict())
|
||||||
{
|
{
|
||||||
@ -427,7 +443,7 @@ bool Foam::dictionary::substituteScopedKeyword
|
|||||||
const auto finder(csearchScoped(varName, keyType::REGEX_RECURSIVE));
|
const auto finder(csearchScoped(varName, keyType::REGEX_RECURSIVE));
|
||||||
|
|
||||||
// If defined insert its entries into this dictionary
|
// If defined insert its entries into this dictionary
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
for (const entry& e : finder.dict())
|
for (const entry& e : finder.dict())
|
||||||
{
|
{
|
||||||
@ -473,11 +489,11 @@ const Foam::dictionary& Foam::dictionary::subDict(const word& keyword) const
|
|||||||
// Allow patterns, non-recursive
|
// Allow patterns, non-recursive
|
||||||
const const_searcher finder(csearch(keyword, keyType::REGEX));
|
const const_searcher finder(csearch(keyword, keyType::REGEX));
|
||||||
|
|
||||||
if (!finder.found())
|
if (!finder.good())
|
||||||
{
|
{
|
||||||
FatalIOErrorInFunction(*this)
|
FatalIOErrorInFunction(*this)
|
||||||
<< "Entry '" << keyword << "' not found in dictionary "
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
<< name()
|
<< name() << nl
|
||||||
<< exit(FatalIOError);
|
<< exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,11 +506,11 @@ Foam::dictionary& Foam::dictionary::subDict(const word& keyword)
|
|||||||
// Allow patterns, non-recursive
|
// Allow patterns, non-recursive
|
||||||
searcher finder(search(keyword, keyType::REGEX));
|
searcher finder(search(keyword, keyType::REGEX));
|
||||||
|
|
||||||
if (!finder.found())
|
if (!finder.good())
|
||||||
{
|
{
|
||||||
FatalIOErrorInFunction(*this)
|
FatalIOErrorInFunction(*this)
|
||||||
<< "Entry '" << keyword << "' not found in dictionary "
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
<< name()
|
<< name() << nl
|
||||||
<< exit(FatalIOError);
|
<< exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,7 +542,7 @@ Foam::dictionary Foam::dictionary::subOrEmptyDict
|
|||||||
<< exit(FatalIOError);
|
<< exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
IOWarningInFunction(*this)
|
IOWarningInFunction(*this)
|
||||||
<< "Entry '" << keyword
|
<< "Entry '" << keyword
|
||||||
@ -552,7 +568,7 @@ const Foam::dictionary& Foam::dictionary::optionalSubDict
|
|||||||
return finder.dict();
|
return finder.dict();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
IOWarningInFunction(*this)
|
IOWarningInFunction(*this)
|
||||||
<< "Entry '" << keyword
|
<< "Entry '" << keyword
|
||||||
@ -611,7 +627,7 @@ Foam::entry* Foam::dictionary::add(entry* entryPtr, bool mergeEntry)
|
|||||||
|
|
||||||
auto iter = hashedEntries_.find(entryPtr->keyword());
|
auto iter = hashedEntries_.find(entryPtr->keyword());
|
||||||
|
|
||||||
if (mergeEntry && iter.found())
|
if (mergeEntry && iter.good())
|
||||||
{
|
{
|
||||||
// Merge dictionary with dictionary
|
// Merge dictionary with dictionary
|
||||||
if (iter()->isDict() && entryPtr->isDict())
|
if (iter()->isDict() && entryPtr->isDict())
|
||||||
@ -786,7 +802,7 @@ bool Foam::dictionary::merge(const dictionary& dict)
|
|||||||
{
|
{
|
||||||
auto fnd = hashedEntries_.find(e.keyword());
|
auto fnd = hashedEntries_.find(e.keyword());
|
||||||
|
|
||||||
if (fnd.found())
|
if (fnd.good())
|
||||||
{
|
{
|
||||||
// Recursively merge sub-dictionaries
|
// Recursively merge sub-dictionaries
|
||||||
// TODO: merge without copying
|
// TODO: merge without copying
|
||||||
|
|||||||
@ -62,8 +62,8 @@ Note
|
|||||||
key2 $..key1; // use key1 value from parent
|
key2 $..key1; // use key1 value from parent
|
||||||
subdict2
|
subdict2
|
||||||
{
|
{
|
||||||
key2 val2;
|
key2 val2;
|
||||||
key3 $...key1; // use key1 value from grandparent
|
key3 $...key1; // use key1 value from grandparent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,8 +285,9 @@ private:
|
|||||||
// Private Data
|
// Private Data
|
||||||
|
|
||||||
//- Report optional keywords and values if not present in dictionary
|
//- Report optional keywords and values if not present in dictionary
|
||||||
|
// For value greater than 1: fatal.
|
||||||
// Set/unset via an InfoSwitch
|
// Set/unset via an InfoSwitch
|
||||||
static bool writeOptionalEntries;
|
static int writeOptionalEntries;
|
||||||
|
|
||||||
//- The dictionary name
|
//- The dictionary name
|
||||||
fileName name_;
|
fileName name_;
|
||||||
@ -359,6 +360,10 @@ private:
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
//- Emit IOError about bad input for the entry
|
||||||
|
void raiseBadInput(const word& keyword) const;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Declare name of the class and its debug switch
|
// Declare name of the class and its debug switch
|
||||||
@ -532,7 +537,6 @@ public:
|
|||||||
enum keyType::option matchOpt = keyType::REGEX
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Search for an entry (const access) with the given keyword.
|
|
||||||
//- Find and return a sub-dictionary pointer if present
|
//- Find and return a sub-dictionary pointer if present
|
||||||
// (and a sub-dictionary) otherwise return nullptr.
|
// (and a sub-dictionary) otherwise return nullptr.
|
||||||
//
|
//
|
||||||
@ -543,6 +547,7 @@ public:
|
|||||||
enum keyType::option matchOpt = keyType::REGEX
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Search for an entry (const access) with the given keyword.
|
||||||
//
|
//
|
||||||
// \param matchOpt the default search is non-recursive with patterns
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
//
|
//
|
||||||
@ -553,6 +558,16 @@ public:
|
|||||||
enum keyType::option matchOpt
|
enum keyType::option matchOpt
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Find and return an entry data stream.
|
||||||
|
//- FatalIOError if not found, or if the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
ITstream& lookup
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Find and return a T.
|
//- Find and return a T.
|
||||||
//- FatalIOError if not found, or if the number of tokens is incorrect.
|
//- FatalIOError if not found, or if the number of tokens is incorrect.
|
||||||
//
|
//
|
||||||
@ -564,22 +579,12 @@ public:
|
|||||||
enum keyType::option matchOpt = keyType::REGEX
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Find and return an entry data stream.
|
|
||||||
//- FatalIOError if not found, or if the number of tokens is incorrect.
|
|
||||||
//
|
|
||||||
// \param matchOpt the default search is non-recursive with patterns
|
|
||||||
ITstream& lookup
|
|
||||||
(
|
|
||||||
const word& keyword,
|
|
||||||
enum keyType::option matchOpt = keyType::REGEX
|
|
||||||
) const;
|
|
||||||
|
|
||||||
//- Find and return a T, or return the given default value.
|
//- Find and return a T, or return the given default value.
|
||||||
//- FatalIOError if it is found and the number of tokens is incorrect.
|
//- FatalIOError if it is found and the number of tokens is incorrect.
|
||||||
//
|
//
|
||||||
// \param matchOpt the default search is non-recursive with patterns
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
template<class T>
|
template<class T>
|
||||||
T lookupOrDefault
|
T getOrDefault
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
const T& deflt,
|
const T& deflt,
|
||||||
@ -592,7 +597,7 @@ public:
|
|||||||
//
|
//
|
||||||
// \param matchOpt the default search is non-recursive with patterns
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
template<class T>
|
template<class T>
|
||||||
T lookupOrAddDefault
|
T getOrAdd
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
const T& deflt,
|
const T& deflt,
|
||||||
@ -633,6 +638,86 @@ public:
|
|||||||
enum keyType::option matchOpt = keyType::REGEX
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Find and return a T with additional checking
|
||||||
|
//- FatalIOError if not found, or if the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param pred the value check predicate
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T getCheck
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Find and return a T, or return the given default value.
|
||||||
|
//- FatalIOError if it is found and the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param pred the value check predicate
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T getCheckOrDefault
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const T& deflt,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Find and return a T, or return the given default value
|
||||||
|
//- and add it to dictionary.
|
||||||
|
//- FatalIOError if it is found and the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param pred the value check predicate
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T getCheckOrAdd
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const T& deflt,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Find entry and assign to T val.
|
||||||
|
//- FatalIOError if it is found and the number of tokens is incorrect,
|
||||||
|
//- or it is mandatory and not found.
|
||||||
|
//
|
||||||
|
// \param val the value to read into
|
||||||
|
// \param pred the value check predicate
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
// \param mandatory the keyword is mandatory
|
||||||
|
//
|
||||||
|
// \return true if the entry was found.
|
||||||
|
template<class T, class Predicate>
|
||||||
|
bool readCheck
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
T& val,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX,
|
||||||
|
bool mandatory = true
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Find an entry if present, and assign to T val.
|
||||||
|
//- FatalIOError if it is found and the number of tokens is incorrect.
|
||||||
|
// Default search: non-recursive with patterns.
|
||||||
|
//
|
||||||
|
// \param val the value to read into
|
||||||
|
// \param pred the value check predicate
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
//
|
||||||
|
// \return true if the entry was found.
|
||||||
|
template<class T, class Predicate>
|
||||||
|
bool readCheckIfPresent
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
T& val,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Check if entry is found and and is a sub-dictionary.
|
//- Check if entry is found and and is a sub-dictionary.
|
||||||
//
|
//
|
||||||
// Search type: non-recursive with patterns.
|
// Search type: non-recursive with patterns.
|
||||||
@ -983,6 +1068,21 @@ public:
|
|||||||
enum keyType::option
|
enum keyType::option
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Find and return an entry data stream,
|
||||||
|
//- using any compatibility names if needed.
|
||||||
|
// Default search: non-recursive with patterns.
|
||||||
|
//
|
||||||
|
// \param compat list of old compatibility keywords and the last
|
||||||
|
// OpenFOAM version for which they were used.
|
||||||
|
// \param recursive search parent dictionaries
|
||||||
|
// \param patternMatch use regular expressions
|
||||||
|
ITstream& lookupCompat
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
std::initializer_list<std::pair<const char*,int>> compat,
|
||||||
|
enum keyType::option = keyType::REGEX
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Find and return a T
|
//- Find and return a T
|
||||||
//- using any compatibility names if needed.
|
//- using any compatibility names if needed.
|
||||||
//- FatalIOError if not found, or if there are excess tokens.
|
//- FatalIOError if not found, or if there are excess tokens.
|
||||||
@ -1000,21 +1100,6 @@ public:
|
|||||||
enum keyType::option = keyType::REGEX
|
enum keyType::option = keyType::REGEX
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Find and return an entry data stream,
|
|
||||||
//- using any compatibility names if needed.
|
|
||||||
// Default search: non-recursive with patterns.
|
|
||||||
//
|
|
||||||
// \param compat list of old compatibility keywords and the last
|
|
||||||
// OpenFOAM version for which they were used.
|
|
||||||
// \param recursive search parent dictionaries
|
|
||||||
// \param patternMatch use regular expressions
|
|
||||||
ITstream& lookupCompat
|
|
||||||
(
|
|
||||||
const word& keyword,
|
|
||||||
std::initializer_list<std::pair<const char*,int>> compat,
|
|
||||||
enum keyType::option = keyType::REGEX
|
|
||||||
) const;
|
|
||||||
|
|
||||||
//- Find and return a T, or return the given default value
|
//- Find and return a T, or return the given default value
|
||||||
//- using any compatibility names if needed.
|
//- using any compatibility names if needed.
|
||||||
// Default search: non-recursive with patterns.
|
// Default search: non-recursive with patterns.
|
||||||
@ -1024,7 +1109,7 @@ public:
|
|||||||
// \param recursive search parent dictionaries
|
// \param recursive search parent dictionaries
|
||||||
// \param patternMatch use regular expressions
|
// \param patternMatch use regular expressions
|
||||||
template<class T>
|
template<class T>
|
||||||
T lookupOrDefaultCompat
|
T getOrDefaultCompat
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
std::initializer_list<std::pair<const char*,int>> compat,
|
std::initializer_list<std::pair<const char*,int>> compat,
|
||||||
@ -1105,6 +1190,58 @@ public:
|
|||||||
|
|
||||||
// Housekeeping
|
// Housekeeping
|
||||||
|
|
||||||
|
//- Find and return a T, or return the given default value.
|
||||||
|
//- FatalIOError if it is found and the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
template<class T>
|
||||||
|
T lookupOrDefault
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const T& deflt,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return getOrDefault<T>(keyword, deflt, matchOpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Find and return a T, or return the given default value
|
||||||
|
//- and add it to dictionary.
|
||||||
|
//- FatalIOError if it is found and the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param matchOpt the default search is non-recursive with patterns
|
||||||
|
template<class T>
|
||||||
|
T lookupOrAddDefault
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const T& deflt,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return getOrAdd<T>(keyword, deflt, matchOpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Find and return a T, or return the given default value
|
||||||
|
//- using any compatibility names if needed.
|
||||||
|
// Default search: non-recursive with patterns.
|
||||||
|
//
|
||||||
|
// \param compat list of old compatibility keywords and the last
|
||||||
|
// OpenFOAM version for which they were used.
|
||||||
|
// \param recursive search parent dictionaries
|
||||||
|
// \param patternMatch use regular expressions
|
||||||
|
template<class T>
|
||||||
|
T lookupOrDefaultCompat
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
std::initializer_list<std::pair<const char*,int>> compat,
|
||||||
|
const T& deflt,
|
||||||
|
enum keyType::option matchOpt = keyType::REGEX
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return getOrDefaultCompat<T>(keyword, compat, deflt, matchOpt);
|
||||||
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-07) find and return an entry data stream
|
//- Deprecated(2018-07) find and return an entry data stream
|
||||||
//
|
//
|
||||||
// \deprecated(2018-07) - use lookup() method
|
// \deprecated(2018-07) - use lookup() method
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -54,7 +54,7 @@ Foam::dictionary::const_searcher Foam::dictionary::csearchCompat
|
|||||||
{
|
{
|
||||||
const_searcher finder(csearch(keyword, matchOpt));
|
const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
return finder;
|
return finder;
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ Foam::dictionary::const_searcher Foam::dictionary::csearchCompat
|
|||||||
{
|
{
|
||||||
finder = csearch(word::validate(iter.first), matchOpt);
|
finder = csearch(word::validate(iter.first), matchOpt);
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
// Only want a single warning (on master), but guard with a
|
// Only want a single warning (on master), but guard with a
|
||||||
// parRun check to avoid Pstream::master() when Pstream has not
|
// parRun check to avoid Pstream::master() when Pstream has not
|
||||||
@ -101,7 +101,7 @@ bool Foam::dictionary::foundCompat
|
|||||||
enum keyType::option matchOpt
|
enum keyType::option matchOpt
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
return csearchCompat(keyword, compat, matchOpt).found();
|
return csearchCompat(keyword, compat, matchOpt).good();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ const Foam::entry& Foam::dictionary::lookupEntryCompat
|
|||||||
{
|
{
|
||||||
const const_searcher finder(csearchCompat(keyword, compat, matchOpt));
|
const const_searcher finder(csearchCompat(keyword, compat, matchOpt));
|
||||||
|
|
||||||
if (!finder.found())
|
if (!finder.good())
|
||||||
{
|
{
|
||||||
FatalIOErrorInFunction(*this)
|
FatalIOErrorInFunction(*this)
|
||||||
<< "Entry '" << keyword << "' not found in dictionary "
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
|
|||||||
@ -130,7 +130,7 @@ Foam::dictionary::const_searcher Foam::dictionary::csearchDotScoped
|
|||||||
// a.b.c.d it would try
|
// a.b.c.d it would try
|
||||||
// a.b, a.b.c, a.b.c.d
|
// a.b, a.b.c, a.b.c.d
|
||||||
|
|
||||||
if (!finder.found())
|
if (!finder.good())
|
||||||
{
|
{
|
||||||
while (!finder.isDict())
|
while (!finder.isDict())
|
||||||
{
|
{
|
||||||
@ -225,7 +225,7 @@ Foam::dictionary::const_searcher Foam::dictionary::csearchSlashScoped
|
|||||||
|
|
||||||
auto finder = dictPtr->csearch(key, matchOpt);
|
auto finder = dictPtr->csearch(key, matchOpt);
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
if (remaining)
|
if (remaining)
|
||||||
{
|
{
|
||||||
@ -269,7 +269,7 @@ Foam::dictionary::const_searcher Foam::dictionary::csearch
|
|||||||
|
|
||||||
auto iter = hashedEntries_.cfind(keyword);
|
auto iter = hashedEntries_.cfind(keyword);
|
||||||
|
|
||||||
if (iter.found())
|
if (iter.good())
|
||||||
{
|
{
|
||||||
finder.set(iter.val());
|
finder.set(iter.val());
|
||||||
return finder;
|
return finder;
|
||||||
@ -425,7 +425,7 @@ const Foam::dictionary* Foam::dictionary::cfindScopedDict
|
|||||||
|
|
||||||
auto iter = dictPtr->hashedEntries_.cfind(cmpt);
|
auto iter = dictPtr->hashedEntries_.cfind(cmpt);
|
||||||
|
|
||||||
if (iter.found())
|
if (iter.good())
|
||||||
{
|
{
|
||||||
const entry *eptr = iter.val();
|
const entry *eptr = iter.val();
|
||||||
|
|
||||||
@ -532,7 +532,7 @@ Foam::dictionary* Foam::dictionary::makeScopedDict(const fileName& dictPath)
|
|||||||
|
|
||||||
auto iter = dictPtr->hashedEntries_.find(cmptName);
|
auto iter = dictPtr->hashedEntries_.find(cmptName);
|
||||||
|
|
||||||
if (iter.found())
|
if (iter.good())
|
||||||
{
|
{
|
||||||
entry *eptr = iter.val();
|
entry *eptr = iter.val();
|
||||||
|
|
||||||
@ -581,7 +581,7 @@ bool Foam::dictionary::remove(const word& keyword)
|
|||||||
{
|
{
|
||||||
auto iter = hashedEntries_.find(keyword);
|
auto iter = hashedEntries_.find(keyword);
|
||||||
|
|
||||||
if (iter.found())
|
if (iter.good())
|
||||||
{
|
{
|
||||||
// Delete from patterns
|
// Delete from patterns
|
||||||
auto wcLink = patterns_.begin();
|
auto wcLink = patterns_.begin();
|
||||||
@ -621,7 +621,7 @@ bool Foam::dictionary::changeKeyword
|
|||||||
// Check that oldKeyword exists and can be changed
|
// Check that oldKeyword exists and can be changed
|
||||||
auto iter = hashedEntries_.find(oldKeyword);
|
auto iter = hashedEntries_.find(oldKeyword);
|
||||||
|
|
||||||
if (!iter.found())
|
if (!iter.good())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -638,7 +638,7 @@ bool Foam::dictionary::changeKeyword
|
|||||||
auto iter2 = hashedEntries_.find(newKeyword);
|
auto iter2 = hashedEntries_.find(newKeyword);
|
||||||
|
|
||||||
// newKeyword already exists
|
// newKeyword already exists
|
||||||
if (iter2.found())
|
if (iter2.good())
|
||||||
{
|
{
|
||||||
if (overwrite)
|
if (overwrite)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -64,6 +64,20 @@ T Foam::dictionary::get
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T Foam::dictionary::getCheck
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
T val;
|
||||||
|
readCheck<T, Predicate>(keyword, val, pred, matchOpt);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
T Foam::dictionary::getCompat
|
T Foam::dictionary::getCompat
|
||||||
(
|
(
|
||||||
@ -79,40 +93,7 @@ T Foam::dictionary::getCompat
|
|||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
bool Foam::dictionary::readCompat
|
T Foam::dictionary::getOrDefault
|
||||||
(
|
|
||||||
const word& keyword,
|
|
||||||
std::initializer_list<std::pair<const char*,int>> compat,
|
|
||||||
T& val,
|
|
||||||
enum keyType::option matchOpt,
|
|
||||||
bool mandatory
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const const_searcher finder(csearchCompat(keyword, compat, matchOpt));
|
|
||||||
|
|
||||||
if (finder.found())
|
|
||||||
{
|
|
||||||
ITstream& is = finder.ptr()->stream();
|
|
||||||
is >> val;
|
|
||||||
|
|
||||||
checkITstream(is, keyword);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (mandatory)
|
|
||||||
{
|
|
||||||
FatalIOErrorInFunction(*this)
|
|
||||||
<< "Entry '" << keyword << "' not found in dictionary "
|
|
||||||
<< name()
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T Foam::dictionary::lookupOrDefault
|
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
const T& deflt,
|
const T& deflt,
|
||||||
@ -121,7 +102,7 @@ T Foam::dictionary::lookupOrDefault
|
|||||||
{
|
{
|
||||||
const const_searcher finder(csearch(keyword, matchOpt));
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
T val;
|
T val;
|
||||||
|
|
||||||
@ -134,10 +115,19 @@ T Foam::dictionary::lookupOrDefault
|
|||||||
}
|
}
|
||||||
else if (writeOptionalEntries)
|
else if (writeOptionalEntries)
|
||||||
{
|
{
|
||||||
IOInfoInFunction(*this)
|
if (writeOptionalEntries > 1)
|
||||||
<< "Optional entry '" << keyword
|
{
|
||||||
<< "' not found, using default value '" << deflt << "'"
|
FatalIOErrorInFunction(*this)
|
||||||
<< nl;
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Default '" << deflt << "' ignored" << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IOInfoInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Using default '" << deflt << "'" << nl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return deflt;
|
return deflt;
|
||||||
@ -145,7 +135,7 @@ T Foam::dictionary::lookupOrDefault
|
|||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
T Foam::dictionary::lookupOrAddDefault
|
T Foam::dictionary::getOrAdd
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
const T& deflt,
|
const T& deflt,
|
||||||
@ -154,7 +144,7 @@ T Foam::dictionary::lookupOrAddDefault
|
|||||||
{
|
{
|
||||||
const const_searcher finder(csearch(keyword, matchOpt));
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
T val;
|
T val;
|
||||||
|
|
||||||
@ -167,10 +157,134 @@ T Foam::dictionary::lookupOrAddDefault
|
|||||||
}
|
}
|
||||||
else if (writeOptionalEntries)
|
else if (writeOptionalEntries)
|
||||||
{
|
{
|
||||||
IOInfoInFunction(*this)
|
if (writeOptionalEntries > 1)
|
||||||
<< "Optional entry '" << keyword
|
{
|
||||||
<< "' not found, adding default value '" << deflt << "'"
|
FatalIOErrorInFunction(*this)
|
||||||
<< nl;
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Default '" << deflt << "' ignored" << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IOInfoInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Adding default '" << deflt << "'" << nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
add(new primitiveEntry(keyword, deflt));
|
||||||
|
return deflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T Foam::dictionary::getCheckOrDefault
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const T& deflt,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (!pred(deflt))
|
||||||
|
{
|
||||||
|
// Could be as FULLDEBUG instead?
|
||||||
|
FatalIOErrorInFunction(*this)
|
||||||
|
<< "Entry '" << keyword << "' with invalid default in dictionary "
|
||||||
|
<< name()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
|
if (finder.good())
|
||||||
|
{
|
||||||
|
T val;
|
||||||
|
|
||||||
|
ITstream& is = finder.ptr()->stream();
|
||||||
|
is >> val;
|
||||||
|
|
||||||
|
checkITstream(is, keyword);
|
||||||
|
|
||||||
|
if (!pred(val))
|
||||||
|
{
|
||||||
|
raiseBadInput(keyword);
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
else if (writeOptionalEntries)
|
||||||
|
{
|
||||||
|
if (writeOptionalEntries > 1)
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Default '" << deflt << "' ignored" << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IOInfoInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Using default '" << deflt << "'" << nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return deflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T Foam::dictionary::getCheckOrAdd
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
const T& deflt,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!pred(deflt))
|
||||||
|
{
|
||||||
|
// Could be as FULLDEBUG instead?
|
||||||
|
FatalIOErrorInFunction(*this)
|
||||||
|
<< "Entry '" << keyword << "' with invalid default in dictionary "
|
||||||
|
<< name()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
|
if (finder.good())
|
||||||
|
{
|
||||||
|
T val;
|
||||||
|
|
||||||
|
ITstream& is = finder.ptr()->stream();
|
||||||
|
is >> val;
|
||||||
|
|
||||||
|
checkITstream(is, keyword);
|
||||||
|
|
||||||
|
if (!pred(val))
|
||||||
|
{
|
||||||
|
raiseBadInput(keyword);
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
else if (writeOptionalEntries)
|
||||||
|
{
|
||||||
|
if (writeOptionalEntries > 1)
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Default '" << deflt << "' ignored" << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IOInfoInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Adding default '" << deflt << "'" << nl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
add(new primitiveEntry(keyword, deflt));
|
add(new primitiveEntry(keyword, deflt));
|
||||||
@ -189,7 +303,7 @@ bool Foam::dictionary::readEntry
|
|||||||
{
|
{
|
||||||
const const_searcher finder(csearch(keyword, matchOpt));
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
ITstream& is = finder.ptr()->stream();
|
ITstream& is = finder.ptr()->stream();
|
||||||
is >> val;
|
is >> val;
|
||||||
@ -202,7 +316,78 @@ bool Foam::dictionary::readEntry
|
|||||||
{
|
{
|
||||||
FatalIOErrorInFunction(*this)
|
FatalIOErrorInFunction(*this)
|
||||||
<< "Entry '" << keyword << "' not found in dictionary "
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
<< name()
|
<< name() << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, class Predicate>
|
||||||
|
bool Foam::dictionary::readCheck
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
T& val,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt,
|
||||||
|
bool mandatory
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const const_searcher finder(csearch(keyword, matchOpt));
|
||||||
|
|
||||||
|
if (finder.good())
|
||||||
|
{
|
||||||
|
ITstream& is = finder.ptr()->stream();
|
||||||
|
is >> val;
|
||||||
|
|
||||||
|
checkITstream(is, keyword);
|
||||||
|
|
||||||
|
if (!pred(val))
|
||||||
|
{
|
||||||
|
raiseBadInput(keyword);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (mandatory)
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(*this)
|
||||||
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
|
<< name() << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool Foam::dictionary::readCompat
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
std::initializer_list<std::pair<const char*,int>> compat,
|
||||||
|
T& val,
|
||||||
|
enum keyType::option matchOpt,
|
||||||
|
bool mandatory
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const const_searcher finder(csearchCompat(keyword, compat, matchOpt));
|
||||||
|
|
||||||
|
if (finder.good())
|
||||||
|
{
|
||||||
|
ITstream& is = finder.ptr()->stream();
|
||||||
|
is >> val;
|
||||||
|
|
||||||
|
checkITstream(is, keyword);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (mandatory)
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(*this)
|
||||||
|
<< "Entry '" << keyword << "' not found in dictionary "
|
||||||
|
<< name() << nl
|
||||||
<< exit(FatalIOError);
|
<< exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,8 +408,22 @@ bool Foam::dictionary::readIfPresent
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, class Predicate>
|
||||||
|
bool Foam::dictionary::readCheckIfPresent
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
T& val,
|
||||||
|
const Predicate& pred,
|
||||||
|
enum keyType::option matchOpt
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// Read is non-mandatory
|
||||||
|
return readCheck<T, Predicate>(keyword, val, pred, matchOpt, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
T Foam::dictionary::lookupOrDefaultCompat
|
T Foam::dictionary::getOrDefaultCompat
|
||||||
(
|
(
|
||||||
const word& keyword,
|
const word& keyword,
|
||||||
std::initializer_list<std::pair<const char*,int>> compat,
|
std::initializer_list<std::pair<const char*,int>> compat,
|
||||||
@ -234,7 +433,7 @@ T Foam::dictionary::lookupOrDefaultCompat
|
|||||||
{
|
{
|
||||||
const const_searcher finder(csearchCompat(keyword, compat, matchOpt));
|
const const_searcher finder(csearchCompat(keyword, compat, matchOpt));
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
T val;
|
T val;
|
||||||
|
|
||||||
@ -247,10 +446,19 @@ T Foam::dictionary::lookupOrDefaultCompat
|
|||||||
}
|
}
|
||||||
else if (writeOptionalEntries)
|
else if (writeOptionalEntries)
|
||||||
{
|
{
|
||||||
IOInfoInFunction(*this)
|
if (writeOptionalEntries > 1)
|
||||||
<< "Optional entry '" << keyword << "' not found,"
|
{
|
||||||
<< " using default value '" << deflt << "'"
|
FatalIOErrorInFunction(*this)
|
||||||
<< nl;
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Default '" << deflt << "' ignored" << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IOInfoInFunction(*this)
|
||||||
|
<< "Optional entry '" << keyword
|
||||||
|
<< "' not found. Using default '" << deflt << "'" << nl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return deflt;
|
return deflt;
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd |
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2015 OpenFOAM Foundation
|
| Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
@ -73,6 +73,25 @@ Foam::autoPtr<Foam::entry> Foam::entry::clone() const
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::entry::raiseBadInput(const ITstream& is) const
|
||||||
|
{
|
||||||
|
const word& keyword = keyword_;
|
||||||
|
|
||||||
|
// Can use FatalIOError instead of SafeFatalIOError
|
||||||
|
// since predicate checks are not used at the earliest stages
|
||||||
|
FatalIOError
|
||||||
|
(
|
||||||
|
"", // functionName
|
||||||
|
"", // sourceFileName
|
||||||
|
0, // sourceFileLineNumber
|
||||||
|
this->name(), // ioFileName
|
||||||
|
is.lineNumber() // ioStartLineNumber
|
||||||
|
)
|
||||||
|
<< "Entry '" << keyword << "' with invalid input" << nl << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::entry::checkITstream(const ITstream& is) const
|
void Foam::entry::checkITstream(const ITstream& is) const
|
||||||
{
|
{
|
||||||
const word& keyword = keyword_;
|
const word& keyword = keyword_;
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
@ -109,6 +109,9 @@ private:
|
|||||||
// \return True if it is a valid keyType.
|
// \return True if it is a valid keyType.
|
||||||
static bool getKeyword(keyType& keyword, Istream& is);
|
static bool getKeyword(keyType& keyword, Istream& is);
|
||||||
|
|
||||||
|
//- Emit IOError about bad input for the entry
|
||||||
|
void raiseBadInput(const ITstream& is) const;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -272,6 +275,37 @@ public:
|
|||||||
checkITstream(is);
|
checkITstream(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- Get a T from the stream,
|
||||||
|
//- FatalIOError if the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param pred the value check predicate
|
||||||
|
template<class T, class Predicate>
|
||||||
|
T getCheck(const Predicate& pred) const
|
||||||
|
{
|
||||||
|
T val;
|
||||||
|
readCheck<T>(val, pred);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Assign to T val,
|
||||||
|
//- FatalIOError if the number of tokens is incorrect.
|
||||||
|
//
|
||||||
|
// \param val the value to read into
|
||||||
|
// \param pred the value check predicate
|
||||||
|
template<class T, class Predicate>
|
||||||
|
void readCheck(T& val, const Predicate& pred) const
|
||||||
|
{
|
||||||
|
ITstream& is = this->stream();
|
||||||
|
is >> val;
|
||||||
|
|
||||||
|
checkITstream(is);
|
||||||
|
if (!pred(val))
|
||||||
|
{
|
||||||
|
raiseBadInput(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Write
|
// Write
|
||||||
|
|
||||||
//- Write
|
//- Write
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
@ -246,7 +246,7 @@ bool Foam::entry::New
|
|||||||
const auto finder =
|
const auto finder =
|
||||||
parentDict.csearchScoped(varName, keyType::REGEX_RECURSIVE);
|
parentDict.csearchScoped(varName, keyType::REGEX_RECURSIVE);
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
// Read as primitiveEntry
|
// Read as primitiveEntry
|
||||||
const keyType newKeyword(finder.ptr()->stream());
|
const keyType newKeyword(finder.ptr()->stream());
|
||||||
@ -311,7 +311,7 @@ bool Foam::entry::New
|
|||||||
// How to manage duplicate entries
|
// How to manage duplicate entries
|
||||||
bool mergeEntry = false;
|
bool mergeEntry = false;
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
// Use keyword from the found entry (ie, eliminate scoping chars)
|
// Use keyword from the found entry (ie, eliminate scoping chars)
|
||||||
const keyType key = finder.ref().keyword();
|
const keyType key = finder.ref().keyword();
|
||||||
|
|||||||
@ -65,7 +65,7 @@ bool Foam::functionEntries::removeEntry::execute
|
|||||||
// Remove scoped keyword, or keyword in the local scope
|
// Remove scoped keyword, or keyword in the local scope
|
||||||
auto finder(parentDict.searchScoped(key, keyType::LITERAL));
|
auto finder(parentDict.searchScoped(key, keyType::LITERAL));
|
||||||
|
|
||||||
if (finder.found())
|
if (finder.good())
|
||||||
{
|
{
|
||||||
finder.context().remove(finder.ptr()->keyword());
|
finder.context().remove(finder.ptr()->keyword());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -274,38 +274,38 @@ Foam::dimensioned<Type>::dimensioned
|
|||||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::dimensioned<Type> Foam::dimensioned<Type>::lookupOrDefault
|
Foam::dimensioned<Type> Foam::dimensioned<Type>::getOrDefault
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const dimensionSet& dims,
|
const dimensionSet& dims,
|
||||||
const Type& defaultValue
|
const Type& deflt
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// checkDims = true
|
// checkDims = true
|
||||||
return dimensioned<Type>(name, dims, defaultValue, dict);
|
return dimensioned<Type>(name, dims, deflt, dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::dimensioned<Type> Foam::dimensioned<Type>::lookupOrDefault
|
Foam::dimensioned<Type> Foam::dimensioned<Type>::getOrDefault
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const Type& defaultValue
|
const Type& deflt
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return dimensioned<Type>(name, dimless, defaultValue, dict);
|
return dimensioned<Type>(name, dimless, deflt, dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::dimensioned<Type> Foam::dimensioned<Type>::lookupOrAddToDict
|
Foam::dimensioned<Type> Foam::dimensioned<Type>::getOrAddToDict
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
dictionary& dict,
|
dictionary& dict,
|
||||||
const dimensionSet& dims,
|
const dimensionSet& dims,
|
||||||
const Type& defaultValue
|
const Type& deflt
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (dict.found(name))
|
if (dict.found(name))
|
||||||
@ -313,20 +313,20 @@ Foam::dimensioned<Type> Foam::dimensioned<Type>::lookupOrAddToDict
|
|||||||
return dimensioned<Type>(name, dims, dict);
|
return dimensioned<Type>(name, dims, dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) dict.add(name, defaultValue);
|
(void) dict.add(name, deflt);
|
||||||
return dimensioned<Type>(name, dims, defaultValue);
|
return dimensioned<Type>(name, dims, deflt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::dimensioned<Type> Foam::dimensioned<Type>::lookupOrAddToDict
|
Foam::dimensioned<Type> Foam::dimensioned<Type>::getOrAddToDict
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
dictionary& dict,
|
dictionary& dict,
|
||||||
const Type& defaultValue
|
const Type& deflt
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return lookupOrAddToDict(name, dict, dimless, defaultValue);
|
return getOrAddToDict(name, dict, dimless, deflt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -207,42 +207,42 @@ public:
|
|||||||
|
|
||||||
//- Construct dimensioned from dictionary, with default value.
|
//- Construct dimensioned from dictionary, with default value.
|
||||||
//- FatalIOError if there are excess tokens.
|
//- FatalIOError if there are excess tokens.
|
||||||
static dimensioned<Type> lookupOrDefault
|
static dimensioned<Type> getOrDefault
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const dimensionSet& dims = dimless,
|
const dimensionSet& dims = dimless,
|
||||||
const Type& defaultValue = Type(Zero)
|
const Type& deflt = Type(Zero)
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct dimensionless from dictionary, with default value.
|
//- Construct dimensionless from dictionary, with default value.
|
||||||
// FatalIOError if it is found and there are excess tokens.
|
// FatalIOError if it is found and there are excess tokens.
|
||||||
static dimensioned<Type> lookupOrDefault
|
static dimensioned<Type> getOrDefault
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const Type& defaultValue = Type(Zero)
|
const Type& deflt = Type(Zero)
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct dimensioned from dictionary, with default value.
|
//- Construct dimensioned from dictionary, with default value.
|
||||||
// If the value is not found, it is added into the dictionary.
|
// If the value is not found, it is added into the dictionary.
|
||||||
// FatalIOError if it is found and there are excess tokens.
|
// FatalIOError if it is found and there are excess tokens.
|
||||||
static dimensioned<Type> lookupOrAddToDict
|
static dimensioned<Type> getOrAddToDict
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
dictionary& dict,
|
dictionary& dict,
|
||||||
const dimensionSet& dims = dimless,
|
const dimensionSet& dims = dimless,
|
||||||
const Type& defaultValue = Type(Zero)
|
const Type& deflt = Type(Zero)
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct dimensionless from dictionary, with default value.
|
//- Construct dimensionless from dictionary, with default value.
|
||||||
// If the value is not found, it is added into the dictionary.
|
// If the value is not found, it is added into the dictionary.
|
||||||
// FatalIOError if it is found and there are excess tokens.
|
// FatalIOError if it is found and there are excess tokens.
|
||||||
static dimensioned<Type> lookupOrAddToDict
|
static dimensioned<Type> getOrAddToDict
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
dictionary& dict,
|
dictionary& dict,
|
||||||
const Type& defaultValue = Type(Zero)
|
const Type& deflt = Type(Zero)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -361,6 +361,59 @@ public:
|
|||||||
// dictionary instead (additional checks on the input stream).
|
// dictionary instead (additional checks on the input stream).
|
||||||
dimensioned(const word& name, const dimensionSet& dims, Istream& is)
|
dimensioned(const word& name, const dimensionSet& dims, Istream& is)
|
||||||
FOAM_DEPRECATED(2018-11);
|
FOAM_DEPRECATED(2018-11);
|
||||||
|
|
||||||
|
|
||||||
|
//- Construct dimensioned from dictionary, with default value.
|
||||||
|
//- FatalIOError if there are excess tokens.
|
||||||
|
static dimensioned<Type> lookupOrDefault
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const dictionary& dict,
|
||||||
|
const dimensionSet& dims = dimless,
|
||||||
|
const Type& deflt = Type(Zero)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return getOrDefault(name, dict, dims, deflt);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Construct dimensionless from dictionary, with default value.
|
||||||
|
// FatalIOError if it is found and there are excess tokens.
|
||||||
|
static dimensioned<Type> lookupOrDefault
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const dictionary& dict,
|
||||||
|
const Type& deflt = Type(Zero)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return getOrDefault(name, dict, deflt);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Construct dimensioned from dictionary, with default value.
|
||||||
|
// If the value is not found, it is added into the dictionary.
|
||||||
|
// FatalIOError if it is found and there are excess tokens.
|
||||||
|
static dimensioned<Type> lookupOrAddToDict
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
dictionary& dict,
|
||||||
|
const dimensionSet& dims = dimless,
|
||||||
|
const Type& deflt = Type(Zero)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return getOrAddToDict(name, dict, dims, deflt);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Construct dimensionless from dictionary, with default value.
|
||||||
|
// If the value is not found, it is added into the dictionary.
|
||||||
|
// FatalIOError if it is found and there are excess tokens.
|
||||||
|
static dimensioned<Type> lookupOrAddToDict
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
dictionary& dict,
|
||||||
|
const Type& deflt = Type(Zero)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return getOrAddToDict(name, dict, deflt);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1168,7 +1168,7 @@ void Foam::argList::parse
|
|||||||
|
|
||||||
decompDict.readEntry("numberOfSubdomains", dictNProcs);
|
decompDict.readEntry("numberOfSubdomains", dictNProcs);
|
||||||
|
|
||||||
if (decompDict.lookupOrDefault("distributed", false))
|
if (decompDict.getOrDefault("distributed", false))
|
||||||
{
|
{
|
||||||
parRunControl_.distributed(true);
|
parRunControl_.distributed(true);
|
||||||
decompDict.readEntry("roots", roots);
|
decompDict.readEntry("roots", roots);
|
||||||
|
|||||||
@ -124,7 +124,7 @@ namespace Foam
|
|||||||
|
|
||||||
class argList
|
class argList
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
//- Track if command arguments are mandatory/optional
|
//- Track if command arguments are mandatory/optional
|
||||||
static bool argsMandatory_;
|
static bool argsMandatory_;
|
||||||
@ -383,7 +383,7 @@ public:
|
|||||||
inline T opt(const word& optName) const;
|
inline T opt(const word& optName) const;
|
||||||
|
|
||||||
//- Get a value from the named option if present, or return default.
|
//- Get a value from the named option if present, or return default.
|
||||||
// Identical to lookupOrDefault().
|
// Identical to getOrDefault().
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T opt(const word& optName, const T& deflt) const;
|
inline T opt(const word& optName, const T& deflt) const;
|
||||||
|
|
||||||
@ -405,7 +405,7 @@ public:
|
|||||||
|
|
||||||
//- Get a value from the named option if present, or return default.
|
//- Get a value from the named option if present, or return default.
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T lookupOrDefault
|
inline T getOrDefault
|
||||||
(
|
(
|
||||||
const word& optName,
|
const word& optName,
|
||||||
const T& deflt
|
const T& deflt
|
||||||
@ -590,6 +590,16 @@ public:
|
|||||||
inline const string& operator[](const word& optName) const;
|
inline const string& operator[](const word& optName) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Housekeeping
|
||||||
|
|
||||||
|
//- Get a value from the named option if present, or return default.
|
||||||
|
template<class T>
|
||||||
|
T lookupOrDefault(const word& optName, const T& deflt) const
|
||||||
|
{
|
||||||
|
return getOrDefault<T>(optName, deflt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Older style access (including 1712 release)
|
// Older style access (including 1712 release)
|
||||||
|
|
||||||
#ifdef Foam_argList_1712
|
#ifdef Foam_argList_1712
|
||||||
@ -598,7 +608,8 @@ public:
|
|||||||
// Index 1 is the first (non-option) argument.
|
// Index 1 is the first (non-option) argument.
|
||||||
// \deprecated(2018-08) - use get() method
|
// \deprecated(2018-08) - use get() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T read(const label index) const
|
T FOAM_DEPRECATED_FOR(2018-08, "get() method")
|
||||||
|
read(const label index) const
|
||||||
{
|
{
|
||||||
return this->get<T>(index);
|
return this->get<T>(index);
|
||||||
}
|
}
|
||||||
@ -607,21 +618,24 @@ public:
|
|||||||
// Index 1 is the first (non-option) argument.
|
// Index 1 is the first (non-option) argument.
|
||||||
// \deprecated(2018-01) - use get() method
|
// \deprecated(2018-01) - use get() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T argRead(const label index) const
|
T FOAM_DEPRECATED_FOR(2018-01, "get() method")
|
||||||
|
argRead(const label index) const
|
||||||
{
|
{
|
||||||
return this->get<T>(index);
|
return this->get<T>(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-01) return true if the named option is found
|
//- Deprecated(2018-01) return true if the named option is found
|
||||||
// \deprecated(2018-01) - use found() method
|
// \deprecated(2018-01) - use found() method
|
||||||
inline bool optionFound(const word& optName) const
|
bool FOAM_DEPRECATED_FOR(2018-01, "found() method")
|
||||||
|
optionFound(const word& optName) const
|
||||||
{
|
{
|
||||||
return found(optName);
|
return found(optName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-01) return an input stream from the named option
|
//- Deprecated(2018-01) return an input stream from the named option
|
||||||
// \deprecated(2018-01) - use lookup() method
|
// \deprecated(2018-01) - use lookup() method
|
||||||
inline ITstream optionLookup(const word& optName) const
|
ITstream FOAM_DEPRECATED_FOR(2018-01, "lookup() method")
|
||||||
|
optionLookup(const word& optName) const
|
||||||
{
|
{
|
||||||
return lookup(optName);
|
return lookup(optName);
|
||||||
}
|
}
|
||||||
@ -629,7 +643,8 @@ public:
|
|||||||
//- Deprecated(2018-01) read a value from the named option
|
//- Deprecated(2018-01) read a value from the named option
|
||||||
// \deprecated(2018-01) - use opt() method
|
// \deprecated(2018-01) - use opt() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T optionRead(const word& optName) const
|
T FOAM_DEPRECATED_FOR(2018-01, "opt() method")
|
||||||
|
optionRead(const word& optName) const
|
||||||
{
|
{
|
||||||
return opt<T>(optName);
|
return opt<T>(optName);
|
||||||
}
|
}
|
||||||
@ -638,7 +653,8 @@ public:
|
|||||||
// Return true if the named option was found.
|
// Return true if the named option was found.
|
||||||
// \deprecated(2018-01) - use readIfPresent() method
|
// \deprecated(2018-01) - use readIfPresent() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool optionReadIfPresent
|
bool FOAM_DEPRECATED_FOR(2018-01, "readIfPresent() method")
|
||||||
|
optionReadIfPresent
|
||||||
(
|
(
|
||||||
const word& optName,
|
const word& optName,
|
||||||
T& val
|
T& val
|
||||||
@ -652,7 +668,8 @@ public:
|
|||||||
// use the supplied default and return false.
|
// use the supplied default and return false.
|
||||||
// \deprecated(2018-01) - use readIfPresent() method
|
// \deprecated(2018-01) - use readIfPresent() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool optionReadIfPresent
|
bool FOAM_DEPRECATED_FOR(2018-01, "readIfPresent() method")
|
||||||
|
optionReadIfPresent
|
||||||
(
|
(
|
||||||
const word& optName,
|
const word& optName,
|
||||||
T& val,
|
T& val,
|
||||||
@ -664,21 +681,23 @@ public:
|
|||||||
|
|
||||||
//- Deprecated(2018-01) read a value from the named option if present.
|
//- Deprecated(2018-01) read a value from the named option if present.
|
||||||
// Return supplied default otherwise.
|
// Return supplied default otherwise.
|
||||||
// \deprecated(2018-01) - use lookupOrDefault() method
|
// \deprecated(2018-01) - use getOrDefault() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T optionLookupOrDefault
|
T FOAM_DEPRECATED_FOR(2018-01, "getOrDefault() method")
|
||||||
|
optionLookupOrDefault
|
||||||
(
|
(
|
||||||
const word& optName,
|
const word& optName,
|
||||||
const T& deflt
|
const T& deflt
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
return lookupOrDefault<T>(optName, deflt);
|
return getOrDefault<T>(optName, deflt);
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-01) read a List of values from the named option
|
//- Deprecated(2018-01) read a List of values from the named option
|
||||||
// \deprecated(2018-01) - use getList() method
|
// \deprecated(2018-01) - use getList() method
|
||||||
template<class T>
|
template<class T>
|
||||||
inline List<T> optionReadList(const word& optName) const
|
List<T> FOAM_DEPRECATED_FOR(2018-01, "getList() method")
|
||||||
|
optionReadList(const word& optName) const
|
||||||
{
|
{
|
||||||
return this->getList<T>(optName);
|
return this->getList<T>(optName);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2013 OpenFOAM Foundation
|
| Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
@ -316,7 +316,7 @@ inline bool Foam::argList::readIfPresent
|
|||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline T Foam::argList::lookupOrDefault
|
inline T Foam::argList::getOrDefault
|
||||||
(
|
(
|
||||||
const word& optName,
|
const word& optName,
|
||||||
const T& deflt
|
const T& deflt
|
||||||
|
|||||||
@ -110,14 +110,14 @@ Foam::Switch::switchType Foam::Switch::parse
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::Switch Foam::Switch::lookupOrAddToDict
|
Foam::Switch Foam::Switch::getOrAddToDict
|
||||||
(
|
(
|
||||||
const word& name,
|
const word& name,
|
||||||
dictionary& dict,
|
dictionary& dict,
|
||||||
const Switch defaultValue
|
const Switch deflt
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return dict.lookupOrAddDefault<Switch>(name, defaultValue);
|
return dict.getOrAdd<Switch>(name, deflt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -146,10 +146,10 @@ Foam::Switch::Switch
|
|||||||
(
|
(
|
||||||
const word& key,
|
const word& key,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const Switch defaultValue
|
const Switch deflt
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
Switch(defaultValue)
|
Switch(deflt)
|
||||||
{
|
{
|
||||||
const entry* eptr = dict.findEntry(key, keyType::LITERAL);
|
const entry* eptr = dict.findEntry(key, keyType::LITERAL);
|
||||||
|
|
||||||
|
|||||||
@ -169,7 +169,7 @@ public:
|
|||||||
(
|
(
|
||||||
const word& key, //!< Lookup key. Uses LITERAL (not REGEX)
|
const word& key, //!< Lookup key. Uses LITERAL (not REGEX)
|
||||||
const dictionary& dict, //!< dictionary
|
const dictionary& dict, //!< dictionary
|
||||||
const Switch defaultValue //!< fallback if not found
|
const Switch deflt //!< fallback if not found
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct from Istream
|
//- Construct from Istream
|
||||||
@ -180,11 +180,11 @@ public:
|
|||||||
|
|
||||||
//- Construct from dictionary, supplying default value so that if the
|
//- Construct from dictionary, supplying default value so that if the
|
||||||
//- value is not found, it is added into the dictionary.
|
//- value is not found, it is added into the dictionary.
|
||||||
static Switch lookupOrAddToDict
|
static Switch getOrAddToDict
|
||||||
(
|
(
|
||||||
const word& name, //!< Lookup key. Uses REGEX!
|
const word& name, //!< Lookup key. Uses REGEX!
|
||||||
dictionary& dict, //!< dictionary
|
dictionary& dict, //!< dictionary
|
||||||
const Switch defaultValue = switchType::FALSE //!< default to add
|
const Switch deflt = switchType::FALSE //!< default to add
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -235,6 +235,18 @@ public:
|
|||||||
|
|
||||||
// Housekeeping
|
// Housekeeping
|
||||||
|
|
||||||
|
//- Construct from dictionary, supplying default value so that if the
|
||||||
|
//- value is not found, it is added into the dictionary.
|
||||||
|
static Switch lookupOrAddToDict
|
||||||
|
(
|
||||||
|
const word& name, //!< Lookup key. Uses REGEX!
|
||||||
|
dictionary& dict, //!< dictionary
|
||||||
|
const Switch deflt = switchType::FALSE //!< default to add
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return getOrAddToDict(name, dict, deflt);
|
||||||
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-03) text representation of the Switch value
|
//- Deprecated(2018-03) text representation of the Switch value
|
||||||
// \deprecated(2018-03) - use c_str() method
|
// \deprecated(2018-03) - use c_str() method
|
||||||
inline const char* asText() const { return c_str(); };
|
inline const char* asText() const { return c_str(); };
|
||||||
|
|||||||
@ -81,14 +81,14 @@ template<class EnumType>
|
|||||||
EnumType Foam::Enum<EnumType>::get
|
EnumType Foam::Enum<EnumType>::get
|
||||||
(
|
(
|
||||||
const word& enumName,
|
const word& enumName,
|
||||||
const EnumType defaultValue
|
const EnumType deflt
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
const label idx = find(enumName);
|
const label idx = find(enumName);
|
||||||
|
|
||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
{
|
{
|
||||||
return defaultValue;
|
return deflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EnumType(vals_[idx]);
|
return EnumType(vals_[idx]);
|
||||||
@ -136,11 +136,11 @@ EnumType Foam::Enum<EnumType>::get
|
|||||||
|
|
||||||
|
|
||||||
template<class EnumType>
|
template<class EnumType>
|
||||||
EnumType Foam::Enum<EnumType>::lookupOrDefault
|
EnumType Foam::Enum<EnumType>::getOrDefault
|
||||||
(
|
(
|
||||||
const word& key,
|
const word& key,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const EnumType defaultValue,
|
const EnumType deflt,
|
||||||
const bool failsafe
|
const bool failsafe
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
@ -163,8 +163,8 @@ EnumType Foam::Enum<EnumType>::lookupOrDefault
|
|||||||
{
|
{
|
||||||
IOWarningInFunction(dict)
|
IOWarningInFunction(dict)
|
||||||
<< enumName << " is not in enumeration: " << *this << nl
|
<< enumName << " is not in enumeration: " << *this << nl
|
||||||
<< "using failsafe " << get(defaultValue)
|
<< "using failsafe " << get(deflt)
|
||||||
<< " (value " << int(defaultValue) << ")" << endl;
|
<< " (value " << int(deflt) << ")" << endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -174,7 +174,7 @@ EnumType Foam::Enum<EnumType>::lookupOrDefault
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return defaultValue;
|
return deflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -132,7 +132,7 @@ public:
|
|||||||
|
|
||||||
//- The enumeration corresponding to the given name.
|
//- The enumeration corresponding to the given name.
|
||||||
// \return The enumeration or default if not found.
|
// \return The enumeration or default if not found.
|
||||||
EnumType get(const word& enumName, const EnumType defaultValue) const;
|
EnumType get(const word& enumName, const EnumType deflt) const;
|
||||||
|
|
||||||
//- The name corresponding to the given enumeration.
|
//- The name corresponding to the given enumeration.
|
||||||
// Return an empty word if not found.
|
// Return an empty word if not found.
|
||||||
@ -155,11 +155,11 @@ public:
|
|||||||
//
|
//
|
||||||
// \return The value found or default if not found in dictionary.
|
// \return The value found or default if not found in dictionary.
|
||||||
// FatalError (or Warning) if the enumerated name was incorrect.
|
// FatalError (or Warning) if the enumerated name was incorrect.
|
||||||
EnumType lookupOrDefault
|
EnumType getOrDefault
|
||||||
(
|
(
|
||||||
const word& key, //!< Lookup key. Uses LITERAL (not REGEX)
|
const word& key, //!< Lookup key. Uses LITERAL (not REGEX)
|
||||||
const dictionary& dict, //!< dictionary
|
const dictionary& dict, //!< dictionary
|
||||||
const EnumType defaultValue, //!< fallback if not found
|
const EnumType deflt, //!< fallback if not found
|
||||||
const bool failsafe = false //!< Warn only on bad enumeration
|
const bool failsafe = false //!< Warn only on bad enumeration
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
@ -216,33 +216,51 @@ public:
|
|||||||
inline const word& operator[](const EnumType e) const;
|
inline const word& operator[](const EnumType e) const;
|
||||||
|
|
||||||
//- Return the enumeration corresponding to the given name or
|
//- Return the enumeration corresponding to the given name or
|
||||||
//- defaultValue if the name is not found.
|
//- deflt if the name is not found.
|
||||||
inline EnumType operator()
|
inline EnumType operator()
|
||||||
(
|
(
|
||||||
const word& enumName,
|
const word& enumName,
|
||||||
const EnumType defaultValue
|
const EnumType deflt
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
|
||||||
// Housekeeping
|
// Housekeeping
|
||||||
|
|
||||||
|
//- Find the key in the dictionary and return the corresponding
|
||||||
|
//- enumeration element based on its name.
|
||||||
|
//
|
||||||
|
// \return The value found or default if not found in dictionary.
|
||||||
|
// FatalError (or Warning) if the enumerated name was incorrect.
|
||||||
|
EnumType lookupOrDefault
|
||||||
|
(
|
||||||
|
const word& key, //!< Lookup key. Uses LITERAL (not REGEX)
|
||||||
|
const dictionary& dict, //!< dictionary
|
||||||
|
const EnumType deflt, //!< fallback if not found
|
||||||
|
const bool failsafe = false //!< Warn only on bad enumeration
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return getOrDefault(key, dict, deflt, failsafe);
|
||||||
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-10) same as two-parameter get()
|
//- Deprecated(2018-10) same as two-parameter get()
|
||||||
// \deprecated(2018-10) - use two-parameter get() method
|
// \deprecated(2018-10) - use two-parameter get() method
|
||||||
inline EnumType lookup(const word& key, const dictionary& dict) const
|
EnumType FOAM_DEPRECATED_FOR(2018-10, "get() method")
|
||||||
|
lookup(const word& key, const dictionary& dict) const
|
||||||
{
|
{
|
||||||
return get(key, dict);
|
return get(key, dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Deprecated(2018-10) lookupOrDefault with warnings instead of error.
|
//- Deprecated(2018-10) lookupOrDefault with warnings instead of error.
|
||||||
// \deprecated(2018-10) - use lookupOrDefault() with failsafe option
|
// \deprecated(2018-10) - use getOrDefault() with failsafe option
|
||||||
EnumType lookupOrFailsafe
|
EnumType FOAM_DEPRECATED_FOR(2018-10, "getOrDefault() method")
|
||||||
|
lookupOrFailsafe
|
||||||
(
|
(
|
||||||
const word& key,
|
const word& key,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const EnumType defaultValue
|
const EnumType deflt
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
return lookupOrDefault(key, dict, defaultValue, true);
|
return getOrDefault(key, dict, deflt, true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -27,9 +27,9 @@ InNamespace
|
|||||||
Foam
|
Foam
|
||||||
|
|
||||||
Description
|
Description
|
||||||
Various function objects for unary and binary operations.
|
Various functors for unary and binary operations.
|
||||||
Can be used for parallel combine-reduce operations or other places
|
Can be used for parallel combine-reduce operations or other places
|
||||||
requiring a function object.
|
requiring a functor.
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
@ -159,6 +159,25 @@ EqOp(nopEq, (void)x)
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Operations taking one parameter, returning bool.
|
||||||
|
// The comparison value is defined during construction
|
||||||
|
|
||||||
|
#define Bool1Op(opName, op) \
|
||||||
|
\
|
||||||
|
template<class T> \
|
||||||
|
struct opName##Op1 \
|
||||||
|
{ \
|
||||||
|
const T& value; \
|
||||||
|
\
|
||||||
|
opName##Op1(const T& v) : value(v) {} \
|
||||||
|
\
|
||||||
|
bool operator()(const T& x) const WARNRETURN \
|
||||||
|
{ \
|
||||||
|
return op; \
|
||||||
|
} \
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Weighting operations
|
// Weighting operations
|
||||||
|
|
||||||
#define WeightedOp(opName, op) \
|
#define WeightedOp(opName, op) \
|
||||||
@ -216,10 +235,18 @@ BoolOp(lessEq, x <= y)
|
|||||||
BoolOp(greater, x > y)
|
BoolOp(greater, x > y)
|
||||||
BoolOp(greaterEq, x >= y)
|
BoolOp(greaterEq, x >= y)
|
||||||
|
|
||||||
|
Bool1Op(equal, x == value)
|
||||||
|
Bool1Op(notEqual, x != value)
|
||||||
|
Bool1Op(less, x < value)
|
||||||
|
Bool1Op(lessEq, x <= value)
|
||||||
|
Bool1Op(greater, x > value)
|
||||||
|
Bool1Op(greaterEq, x >= value)
|
||||||
|
|
||||||
WeightedOp(multiply, (weight*y))
|
WeightedOp(multiply, (weight*y))
|
||||||
|
|
||||||
#undef Op
|
#undef Op
|
||||||
#undef BoolOp
|
#undef BoolOp
|
||||||
|
#undef Bool1Op
|
||||||
#undef WeightedOp
|
#undef WeightedOp
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|||||||
@ -161,6 +161,12 @@ public:
|
|||||||
|
|
||||||
// Static Member Functions
|
// Static Member Functions
|
||||||
|
|
||||||
|
//- A semi-infinite range from minVal to the type max
|
||||||
|
inline static MinMax<T> ge(const T& minVal);
|
||||||
|
|
||||||
|
//- A semi-infinite range from type min to maxVal
|
||||||
|
inline static MinMax<T> le(const T& maxVal);
|
||||||
|
|
||||||
//- A 0-1 range corresponding to the pTraits zero, one
|
//- A 0-1 range corresponding to the pTraits zero, one
|
||||||
inline static MinMax<T> zero_one();
|
inline static MinMax<T> zero_one();
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,20 @@ License
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline Foam::MinMax<T> Foam::MinMax<T>::ge(const T& minVal)
|
||||||
|
{
|
||||||
|
return MinMax<T>(minVal, pTraits<T>::max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline Foam::MinMax<T> Foam::MinMax<T>::le(const T& maxVal)
|
||||||
|
{
|
||||||
|
return MinMax<T>(pTraits<T>::min, maxVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline Foam::MinMax<T> Foam::MinMax<T>::zero_one()
|
inline Foam::MinMax<T> Foam::MinMax<T>::zero_one()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -36,8 +36,8 @@ const Foam::scalarRange Foam::scalarRange::null;
|
|||||||
const Foam::scalarRange Foam::scalarRange::always
|
const Foam::scalarRange Foam::scalarRange::always
|
||||||
(
|
(
|
||||||
scalarRange::ALWAYS,
|
scalarRange::ALWAYS,
|
||||||
-Foam::GREAT,
|
-GREAT,
|
||||||
Foam::GREAT
|
GREAT
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -158,21 +158,21 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const scalarRange& range)
|
|||||||
switch (range.type_)
|
switch (range.type_)
|
||||||
{
|
{
|
||||||
case scalarRange::EQ:
|
case scalarRange::EQ:
|
||||||
os << range.min_;
|
os << range.min();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case scalarRange::GE:
|
case scalarRange::GE:
|
||||||
case scalarRange::GT:
|
case scalarRange::GT:
|
||||||
os << range.min_ << ":Inf";
|
os << range.min() << ":Inf";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case scalarRange::LE:
|
case scalarRange::LE:
|
||||||
case scalarRange::LT:
|
case scalarRange::LT:
|
||||||
os << "-Inf:" << range.max_;
|
os << "-Inf:" << range.max();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case scalarRange::GE_LE:
|
case scalarRange::GE_LE:
|
||||||
os << range.min_ << ':' << range.max_;
|
os << range.min() << ':' << range.max();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case scalarRange::ALWAYS:
|
case scalarRange::ALWAYS:
|
||||||
|
|||||||
@ -34,6 +34,7 @@ Description
|
|||||||
used to define an empty (inverse) range.
|
used to define an empty (inverse) range.
|
||||||
|
|
||||||
SeeAlso
|
SeeAlso
|
||||||
|
Foam::MinMax
|
||||||
Foam::predicates::scalars
|
Foam::predicates::scalars
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
@ -154,18 +155,27 @@ public:
|
|||||||
static scalarRange parse(const std::string& str);
|
static scalarRange parse(const std::string& str);
|
||||||
|
|
||||||
|
|
||||||
//- Construct a greater-than-equals bound
|
//- Construct a greater-equals bound
|
||||||
inline static scalarRange ge(const scalar minVal) noexcept;
|
inline static scalarRange ge(const scalar minVal) noexcept;
|
||||||
|
|
||||||
//- Construct a greater-than bound
|
//- Construct a greater-than bound
|
||||||
inline static scalarRange gt(const scalar minVal) noexcept;
|
inline static scalarRange gt(const scalar minVal) noexcept;
|
||||||
|
|
||||||
//- Construct a less-than-equals bound
|
//- Construct a greater-equals zero bound
|
||||||
|
inline static scalarRange ge0() noexcept;
|
||||||
|
|
||||||
|
//- Construct a greater-than zero bound
|
||||||
|
inline static scalarRange gt0() noexcept;
|
||||||
|
|
||||||
|
//- Construct a less-equals bound
|
||||||
inline static scalarRange le(const scalar maxVal) noexcept;
|
inline static scalarRange le(const scalar maxVal) noexcept;
|
||||||
|
|
||||||
//- Construct a less-than bound
|
//- Construct a less-than bound
|
||||||
inline static scalarRange lt(const scalar maxVal) noexcept;
|
inline static scalarRange lt(const scalar maxVal) noexcept;
|
||||||
|
|
||||||
|
//- Construct a greater-equals 0, less-equals 1 bound
|
||||||
|
inline static scalarRange zero_one() noexcept;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
@ -192,13 +202,13 @@ public:
|
|||||||
inline scalar value() const;
|
inline scalar value() const;
|
||||||
|
|
||||||
//- True if the value matches the condition.
|
//- True if the value matches the condition.
|
||||||
inline bool match(const scalar& value) const;
|
inline bool match(const scalar& val) const;
|
||||||
|
|
||||||
|
|
||||||
// Member Operators
|
// Member Operators
|
||||||
|
|
||||||
//- Identical to match(), for use as a predicate.
|
//- Identical to match(), for use as a predicate.
|
||||||
inline bool operator()(const scalar& value) const;
|
inline bool operator()(const scalar& val) const;
|
||||||
|
|
||||||
inline bool operator==(const scalarRange& rhs) const noexcept;
|
inline bool operator==(const scalarRange& rhs) const noexcept;
|
||||||
inline bool operator!=(const scalarRange& rhs) const noexcept;
|
inline bool operator!=(const scalarRange& rhs) const noexcept;
|
||||||
|
|||||||
@ -40,7 +40,7 @@ inline Foam::scalarRange::scalarRange
|
|||||||
|
|
||||||
inline Foam::scalarRange::scalarRange() noexcept
|
inline Foam::scalarRange::scalarRange() noexcept
|
||||||
:
|
:
|
||||||
scalarRange(scalarRange::NONE, Foam::GREAT, -Foam::GREAT)
|
scalarRange(scalarRange::NONE, GREAT, -GREAT)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ inline Foam::scalarRange::scalarRange
|
|||||||
{
|
{
|
||||||
clear(); // Inverted - explicitly mark as such
|
clear(); // Inverted - explicitly mark as such
|
||||||
}
|
}
|
||||||
else if (minVal == maxVal)
|
else if (equal(minVal, maxVal))
|
||||||
{
|
{
|
||||||
type_ = EQ;
|
type_ = EQ;
|
||||||
}
|
}
|
||||||
@ -71,24 +71,42 @@ inline Foam::scalarRange::scalarRange
|
|||||||
|
|
||||||
inline Foam::scalarRange Foam::scalarRange::ge(const scalar minVal) noexcept
|
inline Foam::scalarRange Foam::scalarRange::ge(const scalar minVal) noexcept
|
||||||
{
|
{
|
||||||
return scalarRange(GE, minVal, Foam::VGREAT);
|
return scalarRange(scalarRange::GE, minVal, GREAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::scalarRange Foam::scalarRange::gt(const scalar minVal) noexcept
|
inline Foam::scalarRange Foam::scalarRange::gt(const scalar minVal) noexcept
|
||||||
{
|
{
|
||||||
return scalarRange(GT, minVal, Foam::VGREAT);
|
return scalarRange(scalarRange::GT, minVal, GREAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalarRange Foam::scalarRange::ge0() noexcept
|
||||||
|
{
|
||||||
|
return scalarRange(scalarRange::GE, 0, GREAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalarRange Foam::scalarRange::gt0() noexcept
|
||||||
|
{
|
||||||
|
return scalarRange(scalarRange::GT, 0, GREAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::scalarRange Foam::scalarRange::le(const scalar maxVal) noexcept
|
inline Foam::scalarRange Foam::scalarRange::le(const scalar maxVal) noexcept
|
||||||
{
|
{
|
||||||
return scalarRange(LE, -Foam::VGREAT, maxVal);
|
return scalarRange(scalarRange::LE, -GREAT, maxVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Foam::scalarRange Foam::scalarRange::lt(const scalar maxVal) noexcept
|
inline Foam::scalarRange Foam::scalarRange::lt(const scalar maxVal) noexcept
|
||||||
{
|
{
|
||||||
return scalarRange(LT, -Foam::VGREAT, maxVal);
|
return scalarRange(scalarRange::LT, -GREAT, maxVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalarRange Foam::scalarRange::zero_one() noexcept
|
||||||
|
{
|
||||||
|
return scalarRange(scalarRange::GE_LE, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -96,8 +114,8 @@ inline Foam::scalarRange Foam::scalarRange::lt(const scalar maxVal) noexcept
|
|||||||
|
|
||||||
inline void Foam::scalarRange::clear() noexcept
|
inline void Foam::scalarRange::clear() noexcept
|
||||||
{
|
{
|
||||||
min_ = Foam::GREAT;
|
min_ = GREAT;
|
||||||
max_ = -Foam::GREAT;
|
max_ = -GREAT;
|
||||||
type_ = scalarRange::NONE;
|
type_ = scalarRange::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,16 +154,16 @@ inline Foam::scalar Foam::scalarRange::value() const
|
|||||||
{
|
{
|
||||||
switch (type_)
|
switch (type_)
|
||||||
{
|
{
|
||||||
case EQ: // For equals, min and max are identical
|
case scalarRange::EQ: // For equals, min and max are identical
|
||||||
case GE:
|
case scalarRange::GE:
|
||||||
case GT:
|
case scalarRange::GT:
|
||||||
return min_;
|
return min_;
|
||||||
|
|
||||||
case LE:
|
case scalarRange::LE:
|
||||||
case LT:
|
case scalarRange::LT:
|
||||||
return max_;
|
return max_;
|
||||||
|
|
||||||
case GE_LE:
|
case scalarRange::GE_LE:
|
||||||
// Multiply before adding to avoid possible overflow
|
// Multiply before adding to avoid possible overflow
|
||||||
return (0.5 * min_) + (0.5 * max_);
|
return (0.5 * min_) + (0.5 * max_);
|
||||||
|
|
||||||
@ -155,16 +173,16 @@ inline Foam::scalar Foam::scalarRange::value() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Foam::scalarRange::match(const scalar& value) const
|
inline bool Foam::scalarRange::match(const scalar& val) const
|
||||||
{
|
{
|
||||||
switch (type_)
|
switch (type_)
|
||||||
{
|
{
|
||||||
case EQ: return equal(value, min_);
|
case EQ: return equal(val, min_);
|
||||||
case GE: return (value >= min_);
|
case GE: return (val >= min_);
|
||||||
case GT: return (value > min_);
|
case GT: return (val > min_);
|
||||||
case LE: return (value <= max_);
|
case LE: return (val <= max_);
|
||||||
case LT: return (value < max_);
|
case LT: return (val < max_);
|
||||||
case GE_LE: return (value >= min_ && value <= max_);
|
case GE_LE: return (val >= min_ && val <= max_);
|
||||||
case ALWAYS: return true;
|
case ALWAYS: return true;
|
||||||
default: return false;
|
default: return false;
|
||||||
}
|
}
|
||||||
@ -173,9 +191,9 @@ inline bool Foam::scalarRange::match(const scalar& value) const
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
inline bool Foam::scalarRange::operator()(const scalar& value) const
|
inline bool Foam::scalarRange::operator()(const scalar& val) const
|
||||||
{
|
{
|
||||||
return match(value);
|
return match(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,11 @@ public:
|
|||||||
//- Construct by parsing string for scalar ranges
|
//- Construct by parsing string for scalar ranges
|
||||||
// The individual items are space, comma or semicolon delimited.
|
// The individual items are space, comma or semicolon delimited.
|
||||||
// Optionally report when any range failed to parse
|
// Optionally report when any range failed to parse
|
||||||
inline scalarRanges(const std::string& str, bool verbose = true);
|
inline explicit scalarRanges
|
||||||
|
(
|
||||||
|
const std::string& str,
|
||||||
|
bool verbose = true
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// Static Constructors
|
// Static Constructors
|
||||||
|
|||||||
Reference in New Issue
Block a user