mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: improve consistency in parsing primitives from strings (issue #590)
- Any trailing whitespace when parsing from strings or character buffers
is ignored rather than being treated as an error. This is consistent
with behaviour when reading from an Istream and with leading whitespace
being ignored in the underlying atof/atod, strtof/strtod... functions.
- Allow parsing directly from a std::string instead of just from a 'char*'.
This reflects the C++11 addition of std::stod to complement the C
functions strtod. This also makes it easier to parse string directly
without using an IStringStream.
- Two-parameter parsing methods return success/failure.
Eg,
if (readInt32(str, &int32Val)) ...
- One-parameter parsing methods return the value on success or
emit a FatalIOError.
Eg,
const char* buf;
int32Val = readInt32(buf, &);
- Improved consistency when parsing unsigned ints.
Use strtoimax and strtoumax throughout.
- Rename readDoubleScalar -> readDouble, readFloatScalar -> readFloat.
Using the primitive name directly instead of the Foam typedef for
better consistency with readInt32 etc.
- Clean/improve parseNasScalar.
Handle normal numbers directly, reduce some operations.
This commit is contained in:
3
applications/test/primitives/Make/files
Normal file
3
applications/test/primitives/Make/files
Normal file
@ -0,0 +1,3 @@
|
||||
Test-primitives.C
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-primitives
|
||||
5
applications/test/primitives/Make/options
Normal file
5
applications/test/primitives/Make/options
Normal file
@ -0,0 +1,5 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/fileFormats/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfileFormats
|
||||
198
applications/test/primitives/Test-primitives.C
Normal file
198
applications/test/primitives/Test-primitives.C
Normal file
@ -0,0 +1,198 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Application
|
||||
Test-primitives
|
||||
|
||||
Description
|
||||
Parsing etc for primitives.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "scalar.H"
|
||||
#include "label.H"
|
||||
#include "StringStream.H"
|
||||
#include "NASCore.H"
|
||||
#include "parsing.H"
|
||||
#include "Tuple2.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
// Shadow fileFormats::NASCore::readNasScalar
|
||||
inline scalar readNasScalar(const std::string& str)
|
||||
{
|
||||
return fileFormats::NASCore::readNasScalar(str);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
template<class TYPE>
|
||||
unsigned testParsing
|
||||
(
|
||||
TYPE (*function)(const std::string&),
|
||||
const List<Tuple2<std::string, bool>>& tests
|
||||
)
|
||||
{
|
||||
unsigned nFail = 0;
|
||||
|
||||
// Expect some failures
|
||||
const bool prev = FatalIOError.throwExceptions();
|
||||
|
||||
for (const Tuple2<std::string, bool>& test : tests)
|
||||
{
|
||||
const std::string& str = test.first();
|
||||
const bool expected = test.second();
|
||||
|
||||
bool parsed = true;
|
||||
|
||||
TYPE val;
|
||||
try
|
||||
{
|
||||
val = function (str);
|
||||
}
|
||||
catch (Foam::error& err)
|
||||
{
|
||||
parsed = false;
|
||||
}
|
||||
|
||||
if (parsed)
|
||||
{
|
||||
if (expected)
|
||||
{
|
||||
Info<< "(pass) parsed " << str << " = " << val << nl;
|
||||
}
|
||||
else
|
||||
{
|
||||
++nFail;
|
||||
Info<< "(fail) unexpected success for " << str << nl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (expected)
|
||||
{
|
||||
++nFail;
|
||||
Info<< "(fail) unexpected failure " << str << nl;
|
||||
}
|
||||
else
|
||||
{
|
||||
Info<< "(pass) expected failure " << str << nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FatalIOError.throwExceptions(prev);
|
||||
|
||||
return nFail;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
unsigned nFail = 0;
|
||||
|
||||
{
|
||||
Info<< nl << "Test readDouble:" << nl;
|
||||
nFail += testParsing
|
||||
(
|
||||
&readDouble,
|
||||
{
|
||||
{ "", false },
|
||||
{ " ", false },
|
||||
{ " xxx ", false },
|
||||
{ " 1234E-", false },
|
||||
{ " 1234E junk", false },
|
||||
{ " 3.14159 ", true },
|
||||
{ " 31.4159E-1 " , true },
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
Info<< nl << "Test readFloat:" << nl;
|
||||
nFail += testParsing
|
||||
(
|
||||
&readFloat,
|
||||
{
|
||||
{ " 3.14159 ", true },
|
||||
{ " 31.4159E-1 " , true },
|
||||
{ " 31.4159E200 " , false },
|
||||
{ " 31.4159E20 " , true },
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
Info<< nl << "Test readNasScalar:" << nl;
|
||||
nFail += testParsing
|
||||
(
|
||||
&readNasScalar,
|
||||
{
|
||||
{ " 3.14159 ", true },
|
||||
{ " 31.4159E-1 " , true },
|
||||
{ " 314.159-2 " , true },
|
||||
{ " 31.4159E200 " , true },
|
||||
{ " 31.4159E20 " , true },
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
Info<< nl << "Test readInt32 (max= " << INT32_MAX << "):" << nl;
|
||||
nFail += testParsing
|
||||
(
|
||||
&readInt32,
|
||||
{
|
||||
{ " 3.14159 ", false },
|
||||
{ " 31.4159E-1 " , false },
|
||||
{ "100" , true },
|
||||
{ " 2147483644" , true },
|
||||
{ " 2147483700 " , false },
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
Info<< nl << "Test readUint32 (max= " << INT32_MAX << "):" << nl;
|
||||
nFail += testParsing
|
||||
(
|
||||
&readUint32,
|
||||
{
|
||||
{ " 2147483644" , true },
|
||||
{ " 2147483700 " , true },
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
if (nFail)
|
||||
{
|
||||
Info<< nl << "failed " << nFail << " tests" << nl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
Info<< nl << "passed all tests" << nl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -28,7 +28,7 @@ License
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <cinttypes>
|
||||
#include <cxxabi.h>
|
||||
#include <execinfo.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
@ -114,6 +114,7 @@ $(strings)/wordRe/wordRe.C
|
||||
$(strings)/wordRes/wordRes.C
|
||||
$(strings)/lists/hashedWordList.C
|
||||
$(strings)/stringOps/stringOps.C
|
||||
$(strings)/parsing/parsing.C
|
||||
|
||||
ops = primitives/ops
|
||||
$(ops)/flipOp.C
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -42,9 +42,9 @@ const Scalar pTraits<Scalar>::rootMax = ScalarROOTVGREAT;
|
||||
|
||||
const char* const pTraits<Scalar>::componentNames[] = { "" };
|
||||
|
||||
pTraits<Scalar>::pTraits(const Scalar& p)
|
||||
pTraits<Scalar>::pTraits(const Scalar& val)
|
||||
:
|
||||
p_(p)
|
||||
p_(val)
|
||||
{}
|
||||
|
||||
|
||||
@ -54,7 +54,7 @@ pTraits<Scalar>::pTraits(Istream& is)
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * * * IO/Conversion * * * * * * * * * * * * * * * //
|
||||
|
||||
word name(const Scalar val)
|
||||
{
|
||||
@ -76,18 +76,59 @@ word name(const std::string& fmt, const Scalar val)
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Scalar readScalar(Istream& is)
|
||||
Scalar ScalarRead(const char* buf)
|
||||
{
|
||||
Scalar rs;
|
||||
is >> rs;
|
||||
char* endptr = nullptr;
|
||||
errno = 0;
|
||||
|
||||
return rs;
|
||||
const Scalar val = ScalarConvert(buf, &endptr);
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
Istream& operator>>(Istream& is, Scalar& s)
|
||||
bool readScalar(const char* buf, Scalar& val)
|
||||
{
|
||||
char* endptr = nullptr;
|
||||
errno = 0;
|
||||
|
||||
val = ScalarConvert(buf, &endptr);
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
IOWarningInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Scalar ScalarRead(Istream& is)
|
||||
{
|
||||
Scalar val;
|
||||
is >> val;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
Istream& operator>>(Istream& is, Scalar& val)
|
||||
{
|
||||
token t(is);
|
||||
|
||||
@ -99,7 +140,7 @@ Istream& operator>>(Istream& is, Scalar& s)
|
||||
|
||||
if (t.isNumber())
|
||||
{
|
||||
s = t.number();
|
||||
val = t.number();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -116,9 +157,9 @@ Istream& operator>>(Istream& is, Scalar& s)
|
||||
}
|
||||
|
||||
|
||||
Ostream& operator<<(Ostream& os, const Scalar s)
|
||||
Ostream& operator<<(Ostream& os, const Scalar val)
|
||||
{
|
||||
os.write(s);
|
||||
os.write(val);
|
||||
os.check(FUNCTION_NAME);
|
||||
return os;
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Typedef
|
||||
Foam::Scalar
|
||||
|
||||
Description
|
||||
Single floating point number (float or double)
|
||||
Floating-point number (float or double)
|
||||
|
||||
SourceFiles
|
||||
Scalar.C
|
||||
@ -81,10 +81,10 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from primitive
|
||||
explicit pTraits(const Scalar&);
|
||||
explicit pTraits(const Scalar& val);
|
||||
|
||||
//- Construct from Istream
|
||||
pTraits(Istream&);
|
||||
pTraits(Istream& is);
|
||||
|
||||
|
||||
// Member Functions
|
||||
@ -103,21 +103,47 @@ public:
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * * * IO/Conversion * * * * * * * * * * * * * * * //
|
||||
|
||||
//- Return a string representation of a Scalar
|
||||
word name(const Scalar);
|
||||
|
||||
word name(const Scalar val);
|
||||
|
||||
//- Return a word representation of a Scalar, using printf-style formatter.
|
||||
// The representation is not checked for valid word characters.
|
||||
word name(const char* fmt, const Scalar);
|
||||
|
||||
word name(const char* fmt, const Scalar val);
|
||||
|
||||
//- Return a word representation of a Scalar, using printf-style formatter.
|
||||
// The representation is not checked for valid word characters.
|
||||
word name(const std::string& fmt, const Scalar);
|
||||
word name(const std::string& fmt, const Scalar val);
|
||||
|
||||
//- Parse entire buffer as a float/double, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
Scalar ScalarRead(const char* buf);
|
||||
|
||||
//- Parse entire string as a float/double, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline Scalar ScalarRead(const std::string& str)
|
||||
{
|
||||
return ScalarRead(str.c_str());
|
||||
}
|
||||
|
||||
//- Parse entire buffer as a float/double, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
bool readScalar(const char* buf, Scalar& val);
|
||||
|
||||
//- Parse entire string as a float/double, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
inline bool readScalar(const std::string& str, Scalar& val)
|
||||
{
|
||||
return readScalar(str.c_str(), val);
|
||||
}
|
||||
|
||||
Scalar ScalarRead(Istream& is);
|
||||
Istream& operator>>(Istream& is, Scalar& val);
|
||||
Ostream& operator<<(Ostream& os, const Scalar val);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// Standard C++ transcendental functions
|
||||
transFunc(sqrt)
|
||||
@ -344,8 +370,8 @@ inline Scalar cmptMag(const Scalar s)
|
||||
|
||||
inline Scalar sqrtSumSqr(const Scalar a, const Scalar b)
|
||||
{
|
||||
Scalar maga = mag(a);
|
||||
Scalar magb = mag(b);
|
||||
const Scalar maga = mag(a);
|
||||
const Scalar magb = mag(b);
|
||||
|
||||
if (maga > magb)
|
||||
{
|
||||
@ -372,12 +398,6 @@ inline Scalar stabilise(const Scalar s, const Scalar small)
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Scalar readScalar(Istream&);
|
||||
Istream& operator>>(Istream&, Scalar&);
|
||||
Ostream& operator<<(Ostream&, const Scalar);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,24 +24,32 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "doubleScalar.H"
|
||||
#include "error.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// Scalar.C is used for template-like substitution
|
||||
|
||||
#define Scalar doubleScalar
|
||||
#define ScalarVGREAT doubleScalarVGREAT
|
||||
#define ScalarVSMALL doubleScalarVSMALL
|
||||
#define ScalarROOTVGREAT doubleScalarROOTVGREAT
|
||||
#define ScalarROOTVSMALL doubleScalarROOTVSMALL
|
||||
#define readScalar readDoubleScalar
|
||||
#define ScalarRead readDouble
|
||||
#define ScalarConvert ::strtod
|
||||
|
||||
#include "Scalar.C"
|
||||
|
||||
#undef Scalar
|
||||
#undef ScalarVGREAT
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarROOTVGREAT
|
||||
#undef ScalarROOTVSMALL
|
||||
#undef readScalar
|
||||
#undef ScalarRead
|
||||
#undef ScalarConvert
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Typedef
|
||||
Foam::doubleScalar
|
||||
|
||||
Description
|
||||
Double precision floating point scalar type.
|
||||
Floating-point double precision scalar type.
|
||||
|
||||
SourceFiles
|
||||
doubleScalar.C
|
||||
@ -59,48 +59,20 @@ static const doubleScalar doubleScalarROOTSMALL = 3.0e-8;
|
||||
static const doubleScalar doubleScalarVSMALL = 1.0e-300;
|
||||
static const doubleScalar doubleScalarROOTVSMALL = 1.0e-150;
|
||||
|
||||
//- Read whole of buf as a scalar. Return true if succesful.
|
||||
inline bool readScalar(const char* buf, doubleScalar& s)
|
||||
{
|
||||
char* endPtr;
|
||||
s = strtod(buf, &endPtr);
|
||||
|
||||
return (*endPtr == '\0');
|
||||
}
|
||||
|
||||
#define Scalar doubleScalar
|
||||
#define ScalarVGREAT doubleScalarVGREAT
|
||||
#define ScalarVSMALL doubleScalarVSMALL
|
||||
#define ScalarROOTVGREAT doubleScalarROOTVGREAT
|
||||
#define ScalarROOTVSMALL doubleScalarROOTVSMALL
|
||||
#define readScalar readDoubleScalar
|
||||
#define ScalarRead readDouble
|
||||
|
||||
|
||||
inline Scalar mag(const Scalar s)
|
||||
{
|
||||
return ::fabs(s);
|
||||
}
|
||||
|
||||
#define transFunc(func) \
|
||||
inline Scalar func(const Scalar s) \
|
||||
{ \
|
||||
return ::func(s); \
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#include "Scalar.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
inline Scalar hypot(const Scalar x, const Scalar y)
|
||||
{
|
||||
return ::hypot(x, y);
|
||||
@ -121,19 +93,30 @@ inline Scalar yn(const int n, const Scalar s)
|
||||
return ::yn(n, s);
|
||||
}
|
||||
|
||||
#undef Scalar
|
||||
#undef ScalarVGREAT
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarROOTVGREAT
|
||||
#undef ScalarROOTVSMALL
|
||||
#undef readScalar
|
||||
#undef transFunc
|
||||
|
||||
// Normal (double-precision) transcendental functions
|
||||
#define transFunc(func) \
|
||||
inline Scalar func(const Scalar s) \
|
||||
{ \
|
||||
return ::func(s); \
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#include "Scalar.H"
|
||||
|
||||
#undef Scalar
|
||||
#undef ScalarVGREAT
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarROOTVGREAT
|
||||
#undef ScalarROOTVSMALL
|
||||
#undef ScalarRead
|
||||
#undef transFunc
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,24 +24,32 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "floatScalar.H"
|
||||
#include "error.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// Scalar.C is used for template-like substitution
|
||||
|
||||
#define Scalar floatScalar
|
||||
#define ScalarVGREAT floatScalarVGREAT
|
||||
#define ScalarVSMALL floatScalarVSMALL
|
||||
#define ScalarROOTVGREAT floatScalarROOTVGREAT
|
||||
#define ScalarROOTVSMALL floatScalarROOTVSMALL
|
||||
#define readScalar readFloatScalar
|
||||
#define ScalarRead readFloat
|
||||
#define ScalarConvert ::strtof
|
||||
|
||||
#include "Scalar.C"
|
||||
|
||||
#undef Scalar
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarVGREAT
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarROOTVGREAT
|
||||
#undef ScalarROOTVSMALL
|
||||
#undef readScalar
|
||||
#undef ScalarRead
|
||||
#undef ScalarConvert
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Typedef
|
||||
Foam::floatScalar
|
||||
|
||||
Description
|
||||
Float precision floating point scalar type.
|
||||
Floating-point single precision scalar type.
|
||||
|
||||
SourceFiles
|
||||
floatScalar.C
|
||||
@ -48,7 +48,7 @@ namespace Foam
|
||||
|
||||
typedef float floatScalar;
|
||||
|
||||
// Largest and smallest scalar values allowed in certain parts of the code
|
||||
// Largest and smallest scalar values allowed in certain parts of the code.
|
||||
// (6 is the number of significant figures in an
|
||||
// IEEE single precision number. See limits.h or float.h)
|
||||
static const floatScalar floatScalarGREAT = 1.0e+6;
|
||||
@ -59,48 +59,20 @@ static const floatScalar floatScalarROOTSMALL = 1.0e-3;
|
||||
static const floatScalar floatScalarVSMALL = 1.0e-37;
|
||||
static const floatScalar floatScalarROOTVSMALL = 1.0e-18;
|
||||
|
||||
//- Read whole of buf as a scalar. Return true if succesful.
|
||||
inline bool readScalar(const char* buf, floatScalar& s)
|
||||
{
|
||||
char* endPtr;
|
||||
s = strtof(buf, &endPtr);
|
||||
|
||||
return (*endPtr == '\0');
|
||||
}
|
||||
|
||||
#define Scalar floatScalar
|
||||
#define ScalarVGREAT floatScalarVGREAT
|
||||
#define ScalarVSMALL floatScalarVSMALL
|
||||
#define ScalarROOTVGREAT floatScalarROOTVGREAT
|
||||
#define ScalarROOTVSMALL floatScalarROOTVSMALL
|
||||
#define readScalar readFloatScalar
|
||||
#define ScalarRead readFloat
|
||||
|
||||
|
||||
inline Scalar mag(const Scalar s)
|
||||
{
|
||||
return ::fabsf(s);
|
||||
}
|
||||
|
||||
#define transFunc(func) \
|
||||
inline Scalar func(const Scalar s) \
|
||||
{ \
|
||||
return ::func##f(s); \
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#include "Scalar.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
inline Scalar hypot(const Scalar x, const Scalar y)
|
||||
{
|
||||
return ::hypotf(x, y);
|
||||
@ -121,19 +93,30 @@ inline Scalar yn(const int n, const Scalar s)
|
||||
return ::ynf(n, s);
|
||||
}
|
||||
|
||||
#undef Scalar
|
||||
#undef ScalarVGREAT
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarROOTVGREAT
|
||||
#undef ScalarROOTVSMALL
|
||||
#undef readScalar
|
||||
#undef transFunc
|
||||
|
||||
// Single-precision transcendental functions (with 'f' appended to the name)
|
||||
#define transFunc(func) \
|
||||
inline Scalar func(const Scalar s) \
|
||||
{ \
|
||||
return ::func##f(s); \
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#include "Scalar.H"
|
||||
|
||||
#undef Scalar
|
||||
#undef ScalarVGREAT
|
||||
#undef ScalarVSMALL
|
||||
#undef ScalarROOTVGREAT
|
||||
#undef ScalarROOTVSMALL
|
||||
#undef ScalarRead
|
||||
#undef transFunc
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
@ -24,24 +24,17 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "scalar.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
Foam::scalar Foam::readScalar(Istream& is)
|
||||
{
|
||||
scalar val;
|
||||
is >> val;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
scalar readScalar(Istream& is)
|
||||
{
|
||||
scalar rs;
|
||||
is >> rs;
|
||||
|
||||
return rs;
|
||||
return val;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Typedef
|
||||
Foam::scalar
|
||||
|
||||
Description
|
||||
Single floating point number identical to float or double depending on
|
||||
A floating-point number identical to float or double depending on
|
||||
whether WM_SP or WM_DP is defined.
|
||||
|
||||
SourceFiles
|
||||
@ -58,6 +58,11 @@ namespace Foam
|
||||
static const scalar ROOTVSMALL = floatScalarROOTVSMALL;
|
||||
|
||||
scalar readScalar(Istream& is);
|
||||
|
||||
inline scalar readScalar(const std::string& str)
|
||||
{
|
||||
return readFloat(str);
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(WM_DP)
|
||||
@ -77,6 +82,11 @@ namespace Foam
|
||||
static const scalar ROOTVSMALL = doubleScalarROOTVSMALL;
|
||||
|
||||
scalar readScalar(Istream& is);
|
||||
|
||||
inline scalar readScalar(const std::string& str)
|
||||
{
|
||||
return readDouble(str);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -25,7 +25,7 @@ Primitive
|
||||
int
|
||||
|
||||
Description
|
||||
System integer
|
||||
System signed integer
|
||||
|
||||
SourceFiles
|
||||
intIO.C
|
||||
@ -67,7 +67,30 @@ MAXMIN(int64_t, int64_t, int64_t)
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
int readInt(Istream&);
|
||||
//- Read int from stream
|
||||
int readInt(Istream& is);
|
||||
|
||||
//- Parse entire buffer as an int, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
int readInt(const char* buf);
|
||||
|
||||
//- Parse entire string as an int, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline int readInt(const std::string& str)
|
||||
{
|
||||
return readInt(str.c_str());
|
||||
}
|
||||
|
||||
//- Read entire buffer as an int, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
bool readInt(const char* buf, int& val);
|
||||
|
||||
//- Read entire string as an int32_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
inline bool readInt(const std::string& str, int& val)
|
||||
{
|
||||
return readInt(str.c_str(), val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,10 +24,68 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "int.H"
|
||||
#include "error.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
#include <cinttypes>
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
int Foam::readInt(const char* buf)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
|
||||
|
||||
const int val = int(parsed);
|
||||
|
||||
if (parsed < INT_MIN || parsed > INT_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
bool Foam::readInt(const char* buf, int& val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
|
||||
|
||||
val = int(parsed);
|
||||
|
||||
if (parsed < INT_MIN || parsed > INT_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
IOWarningInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
int Foam::readInt(Istream& is)
|
||||
{
|
||||
int val;
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,6 +24,21 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "int32.H"
|
||||
#include "stringOps.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const int32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const int32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -36,9 +51,9 @@ const int32_t Foam::pTraits<int32_t>::rootMax = pTraits<int32_t>::max;
|
||||
|
||||
const char* const Foam::pTraits<int32_t>::componentNames[] = { "" };
|
||||
|
||||
Foam::pTraits<int32_t>::pTraits(const int32_t& p)
|
||||
Foam::pTraits<int32_t>::pTraits(const int32_t& val)
|
||||
:
|
||||
p_(p)
|
||||
p_(val)
|
||||
{}
|
||||
|
||||
Foam::pTraits<int32_t>::pTraits(Istream& is)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -22,10 +22,10 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Primitive
|
||||
int32
|
||||
int32_t
|
||||
|
||||
Description
|
||||
32bit integer
|
||||
32bit signed integer
|
||||
|
||||
SourceFiles
|
||||
int32.C
|
||||
@ -57,34 +57,72 @@ class Ostream;
|
||||
//- Return a word representation of an int32
|
||||
inline word name(const int32_t val)
|
||||
{
|
||||
// no stripping required
|
||||
// No stripping required
|
||||
return word(std::to_string(val), false);
|
||||
}
|
||||
|
||||
|
||||
//- Return a word representation of an int32, using printf-style formatter.
|
||||
// The representation is not checked for valid word characters.
|
||||
word name(const char* fmt, const int32_t);
|
||||
word name(const char* fmt, const int32_t val);
|
||||
|
||||
|
||||
//- Return a word representation of an int32, using printf-style formatter.
|
||||
// The representation is not checked for valid word characters.
|
||||
word name(const std::string&, const int32_t);
|
||||
word name(const std::string&, const int32_t val);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
int32_t readInt32(Istream&);
|
||||
bool read(const char*, int32_t&);
|
||||
Istream& operator>>(Istream&, int32_t&);
|
||||
Ostream& operator<<(Ostream&, const int32_t);
|
||||
//- Read int32_t from stream
|
||||
int32_t readInt32(Istream& is);
|
||||
|
||||
//- Parse entire buffer as a int32_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
int32_t readInt32(const char* buf);
|
||||
|
||||
//- Parse entire string as a int32_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline int32_t readInt32(const std::string& str)
|
||||
{
|
||||
return readInt32(str.c_str());
|
||||
}
|
||||
|
||||
//- Read entire buffer as a int32_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
bool readInt32(const char* buf, int32_t& val);
|
||||
|
||||
//- Read entire string as a int32_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
inline bool readInt32(const std::string& str, int32_t& val)
|
||||
{
|
||||
return readInt32(str.c_str(), val);
|
||||
}
|
||||
|
||||
//- Same as readInt32
|
||||
// \return True if successful.
|
||||
inline bool read(const char* buf, int32_t& val)
|
||||
{
|
||||
return readInt32(buf, val);
|
||||
}
|
||||
|
||||
//- Same as readInt32
|
||||
// \return True if successful.
|
||||
inline bool read(const std::string& str, int32_t& val)
|
||||
{
|
||||
return readInt32(str, val);
|
||||
}
|
||||
|
||||
|
||||
Istream& operator>>(Istream& is, int32_t& val);
|
||||
Ostream& operator<<(Ostream& os, const int32_t val);
|
||||
|
||||
// On 32bit OSs long is not unambiguously int32_t (or int64_t) causing problems
|
||||
// for IO operator resolution.
|
||||
// This problem is avoided by explicitly defining the following operators:
|
||||
#if WM_ARCH_OPTION == 32
|
||||
Istream& operator>>(Istream&, long&);
|
||||
Ostream& operator<<(Ostream&, const long);
|
||||
Istream& operator>>(Istream& is, long& val);
|
||||
Ostream& operator<<(Ostream& os, const long val);
|
||||
#endif
|
||||
|
||||
|
||||
@ -127,10 +165,10 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from primitive
|
||||
explicit pTraits(const int32_t&);
|
||||
explicit pTraits(const int32_t& val);
|
||||
|
||||
//- Construct from Istream
|
||||
pTraits(Istream&);
|
||||
pTraits(Istream& is);
|
||||
|
||||
|
||||
// Member Functions
|
||||
@ -149,9 +187,9 @@ public:
|
||||
};
|
||||
|
||||
|
||||
inline int32_t mag(const int32_t l)
|
||||
inline int32_t mag(const int32_t val)
|
||||
{
|
||||
return ::abs(l);
|
||||
return ::abs(val);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,29 +24,69 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "int32.H"
|
||||
#include "stringOps.H"
|
||||
#include "error.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <cerrno>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const int32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const int32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, int32_t& i)
|
||||
int32_t Foam::readInt32(const char* buf)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
|
||||
|
||||
const int32_t val = int32_t(parsed);
|
||||
|
||||
if (parsed < INT32_MIN || parsed > INT32_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
bool Foam::readInt32(const char* buf, int32_t& val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
|
||||
|
||||
val = int32_t(parsed);
|
||||
|
||||
if (parsed < INT32_MIN || parsed > INT32_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
IOWarningInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, int32_t& val)
|
||||
{
|
||||
token t(is);
|
||||
|
||||
@ -58,7 +98,7 @@ Foam::Istream& Foam::operator>>(Istream& is, int32_t& i)
|
||||
|
||||
if (t.isLabel())
|
||||
{
|
||||
i = int32_t(t.labelToken());
|
||||
val = int32_t(t.labelToken());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -84,35 +124,23 @@ int32_t Foam::readInt32(Istream& is)
|
||||
}
|
||||
|
||||
|
||||
bool Foam::read(const char* buf, int32_t& s)
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const int32_t val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
intmax_t l = strtoimax(buf, &endptr, 10);
|
||||
s = int32_t(l);
|
||||
return
|
||||
(*endptr == 0) && (errno == 0)
|
||||
&& (l >= INT32_MIN) && (l <= INT32_MAX);
|
||||
}
|
||||
|
||||
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const int32_t i)
|
||||
{
|
||||
os.write(label(i));
|
||||
os.write(label(val));
|
||||
os.check(FUNCTION_NAME);
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
#if WM_ARCH_OPTION == 32
|
||||
Foam::Istream& Foam::operator>>(Istream& is, long& i)
|
||||
Foam::Istream& Foam::operator>>(Istream& is, long& val)
|
||||
{
|
||||
return operator>>(is, reinterpret_cast<int32_t&>(i));
|
||||
return operator>>(is, reinterpret_cast<int32_t&>(val));
|
||||
}
|
||||
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const long i)
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const long val)
|
||||
{
|
||||
os << int32_t(i);
|
||||
os << int32_t(val);
|
||||
return os;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,6 +24,21 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "int64.H"
|
||||
#include "stringOps.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const int64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const int64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -36,9 +51,9 @@ const int64_t Foam::pTraits<int64_t>::rootMax = pTraits<int64_t>::max;
|
||||
|
||||
const char* const Foam::pTraits<int64_t>::componentNames[] = { "" };
|
||||
|
||||
Foam::pTraits<int64_t>::pTraits(const int64_t& p)
|
||||
Foam::pTraits<int64_t>::pTraits(const int64_t& val)
|
||||
:
|
||||
p_(p)
|
||||
p_(val)
|
||||
{}
|
||||
|
||||
Foam::pTraits<int64_t>::pTraits(Istream& is)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -22,10 +22,10 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Primitive
|
||||
int64
|
||||
int64_t
|
||||
|
||||
Description
|
||||
64bit integer
|
||||
64bit signed integer
|
||||
|
||||
SourceFiles
|
||||
int64.C
|
||||
@ -58,7 +58,7 @@ class Ostream;
|
||||
//- Return a word representation of an int64
|
||||
inline word name(const int64_t val)
|
||||
{
|
||||
// no stripping required
|
||||
// No stripping required
|
||||
return word(std::to_string(val), false);
|
||||
}
|
||||
|
||||
@ -75,10 +75,48 @@ word name(const std::string& fmt, const int64_t);
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
int64_t readInt64(Istream&);
|
||||
bool read(const char*, int64_t&);
|
||||
Istream& operator>>(Istream&, int64_t&);
|
||||
Ostream& operator<<(Ostream&, const int64_t);
|
||||
//- Read int64_t from stream
|
||||
int64_t readInt64(Istream& is);
|
||||
|
||||
//- Parse entire buffer as a int64_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
int64_t readInt64(const char* buf);
|
||||
|
||||
//- Parse entire string as a int64_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline int64_t readInt64(const std::string& str)
|
||||
{
|
||||
return readInt64(str.c_str());
|
||||
}
|
||||
|
||||
//- Read entire buffer as a int64_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
bool readInt64(const char* buf, int64_t& val);
|
||||
|
||||
//- Read entire string as a int64_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
inline bool readInt64(const std::string& str, int64_t& val)
|
||||
{
|
||||
return readInt64(str.c_str(), val);
|
||||
}
|
||||
|
||||
//- Same as readInt64
|
||||
// \return True if successful.
|
||||
inline bool read(const char* buf, int64_t& val)
|
||||
{
|
||||
return readInt64(buf, val);
|
||||
}
|
||||
|
||||
//- Same as readInt64
|
||||
// \return True if successful.
|
||||
inline bool read(const std::string& str, int64_t& val)
|
||||
{
|
||||
return readInt64(str, val);
|
||||
}
|
||||
|
||||
|
||||
Istream& operator>>(Istream& is, int64_t& val);
|
||||
Ostream& operator<<(Ostream& os, const int64_t val);
|
||||
|
||||
//- Template specialization for pTraits<int64_t>
|
||||
template<>
|
||||
@ -119,10 +157,10 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from primitive
|
||||
explicit pTraits(const int64_t&);
|
||||
explicit pTraits(const int64_t& val);
|
||||
|
||||
//- Construct from Istream
|
||||
pTraits(Istream&);
|
||||
pTraits(Istream& is);
|
||||
|
||||
|
||||
// Member Functions
|
||||
@ -141,9 +179,9 @@ public:
|
||||
};
|
||||
|
||||
|
||||
inline int64_t mag(const int64_t l)
|
||||
inline int64_t mag(const int64_t val)
|
||||
{
|
||||
return ::labs(l);
|
||||
return ::labs(val);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,29 +24,69 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "int64.H"
|
||||
#include "stringOps.H"
|
||||
#include "error.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <cerrno>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const int64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const int64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, int64_t& i)
|
||||
int64_t Foam::readInt64(const char* buf)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
|
||||
|
||||
const int64_t val = int64_t(parsed);
|
||||
|
||||
if (parsed < INT64_MIN || parsed > INT64_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
bool Foam::readInt64(const char* buf, int64_t& val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
|
||||
|
||||
val = int64_t(parsed);
|
||||
|
||||
if (parsed < INT64_MIN || parsed > INT64_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
IOWarningInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, int64_t& val)
|
||||
{
|
||||
token t(is);
|
||||
|
||||
@ -58,7 +98,7 @@ Foam::Istream& Foam::operator>>(Istream& is, int64_t& i)
|
||||
|
||||
if (t.isLabel())
|
||||
{
|
||||
i = int64_t(t.labelToken());
|
||||
val = int64_t(t.labelToken());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -84,19 +124,9 @@ int64_t Foam::readInt64(Istream& is)
|
||||
}
|
||||
|
||||
|
||||
bool Foam::read(const char* buf, int64_t& s)
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const int64_t val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
intmax_t l = strtoimax(buf, &endptr, 10);
|
||||
s = int64_t(l);
|
||||
return (*endptr == 0) && (errno == 0);
|
||||
}
|
||||
|
||||
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const int64_t i)
|
||||
{
|
||||
os.write(label(i));
|
||||
os.write(label(val));
|
||||
os.check(FUNCTION_NAME);
|
||||
return os;
|
||||
}
|
||||
|
||||
@ -61,11 +61,45 @@ typedef INT_SIZE(int, _t) label;
|
||||
static const label labelMin = INT_SIZE(INT, _MIN);
|
||||
static const label labelMax = INT_SIZE(INT, _MAX);
|
||||
|
||||
//- Read label from stream.
|
||||
// Uses readInt32 or readInt64 according to WM_LABEL_SIZE
|
||||
inline label readLabel(Istream& is)
|
||||
{
|
||||
return INT_SIZE(readInt,) (is);
|
||||
}
|
||||
|
||||
//- Parse entire buffer as a label, skipping leading/trailing whitespace.
|
||||
// Uses readInt32 or readInt64 according to WM_LABEL_SIZE
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline label readLabel(const char* buf)
|
||||
{
|
||||
return INT_SIZE(readInt,) (buf);
|
||||
}
|
||||
|
||||
//- Parse entire string as a label, skipping leading/trailing whitespace.
|
||||
// Uses readInt32 or readInt64 according to WM_LABEL_SIZE
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline label readLabel(const std::string& str)
|
||||
{
|
||||
return INT_SIZE(readInt,) (str);
|
||||
}
|
||||
|
||||
//- Parse entire buffer as a label, skipping leading/trailing whitespace.
|
||||
// Uses readInt32 or readInt64 according to WM_LABEL_SIZE
|
||||
// \return True if successful.
|
||||
inline bool readLabel(const char* buf, label& val)
|
||||
{
|
||||
return INT_SIZE(readInt,) (buf, val);
|
||||
}
|
||||
|
||||
//- Parse entire string as a label, skipping leading/trailing whitespace.
|
||||
// Uses readInt32 or readInt64 according to WM_LABEL_SIZE
|
||||
// \return True if successful.
|
||||
inline bool readLabel(const std::string& str, label& val)
|
||||
{
|
||||
return INT_SIZE(readInt,) (str, val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -28,7 +28,7 @@ Description
|
||||
A uLabel is an uint32_t or uint64_t as specified by the pre-processor macro
|
||||
WM_LABEL_SIZE.
|
||||
|
||||
A readLabel function is defined so that uLabel can be constructed from
|
||||
A readULabel function is defined so that uLabel can be constructed from
|
||||
Istream.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
@ -60,11 +60,46 @@ typedef UINT_SIZE(uint, _t) uLabel;
|
||||
|
||||
static const uLabel uLabelMax = UINT_SIZE(UINT, _MAX);
|
||||
|
||||
//- Read uLabel from stream.
|
||||
// Uses readUint32 or readUint64 according to WM_LABEL_SIZE
|
||||
inline uLabel readULabel(Istream& is)
|
||||
{
|
||||
return UINT_SIZE(readUint,) (is);
|
||||
}
|
||||
|
||||
//- Parse entire buffer as a uLabel, skipping leading/trailing whitespace.
|
||||
// Uses readUint32 or readUint64 according to WM_LABEL_SIZE
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline uLabel readULabel(const char* buf)
|
||||
{
|
||||
return UINT_SIZE(readUint,) (buf);
|
||||
}
|
||||
|
||||
//- Parse entire string as a uLabel, skipping leading/trailing whitespace.
|
||||
// Uses readUint32 or readUint64 according to WM_LABEL_SIZE
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline uLabel readULabel(const std::string& str)
|
||||
{
|
||||
return UINT_SIZE(readUint,) (str);
|
||||
}
|
||||
|
||||
//- Parse entire buffer as a uLabel, skipping leading/trailing whitespace.
|
||||
// Uses readUint32 or readUint64 according to WM_LABEL_SIZE
|
||||
// \return True if successful.
|
||||
inline bool readULabel(const char* buf, uLabel& val)
|
||||
{
|
||||
return UINT_SIZE(readUint,) (buf, val);
|
||||
}
|
||||
|
||||
|
||||
//- Parse entire string as a uLabel, skipping leading/trailing whitespace.
|
||||
// Uses readUint32 or readUint64 according to WM_LABEL_SIZE
|
||||
// \return True if successful.
|
||||
inline bool readULabel(const std::string& str, uLabel& val)
|
||||
{
|
||||
return UINT_SIZE(readUint,) (str, val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ Primitive
|
||||
uint
|
||||
|
||||
Description
|
||||
System uinteger
|
||||
System unsigned integer
|
||||
|
||||
SourceFiles
|
||||
uintIO.C
|
||||
@ -67,7 +67,8 @@ MAXMIN(uint64_t, uint64_t, uint64_t)
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
unsigned int readUint(Istream&);
|
||||
//- Read unsigned int from stream
|
||||
unsigned int readUint(Istream& is);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,6 +24,21 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "uint32.H"
|
||||
#include "stringOps.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const uint32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const uint32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -36,9 +51,9 @@ const uint32_t Foam::pTraits<uint32_t>::rootMax = pTraits<uint32_t>::max;
|
||||
|
||||
const char* const Foam::pTraits<uint32_t>::componentNames[] = { "" };
|
||||
|
||||
Foam::pTraits<uint32_t>::pTraits(const uint32_t& p)
|
||||
Foam::pTraits<uint32_t>::pTraits(const uint32_t& val)
|
||||
:
|
||||
p_(p)
|
||||
p_(val)
|
||||
{}
|
||||
|
||||
Foam::pTraits<uint32_t>::pTraits(Istream& is)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -22,10 +22,10 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Primitive
|
||||
uint32
|
||||
uint32_t
|
||||
|
||||
Description
|
||||
32bit uinteger
|
||||
32bit unsigned integer
|
||||
|
||||
SourceFiles
|
||||
uint32.C
|
||||
@ -57,7 +57,7 @@ class Ostream;
|
||||
//- Return a word representation of a uint32
|
||||
inline word name(const uint32_t val)
|
||||
{
|
||||
// no stripping required
|
||||
// No stripping required
|
||||
return word(std::to_string(val), false);
|
||||
}
|
||||
|
||||
@ -74,10 +74,48 @@ word name(const std::string& fmt, const uint32_t);
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
uint32_t readUint32(Istream&);
|
||||
bool read(const char*, uint32_t&);
|
||||
Istream& operator>>(Istream&, uint32_t&);
|
||||
Ostream& operator<<(Ostream&, const uint32_t);
|
||||
//- Read uint32_t from stream
|
||||
uint32_t readUint32(Istream& is);
|
||||
|
||||
//- Parse entire buffer as a uint32_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
uint32_t readUint32(const char* buf);
|
||||
|
||||
//- Parse entire string as a uint32_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline uint32_t readUint32(const std::string& str)
|
||||
{
|
||||
return readUint32(str.c_str());
|
||||
}
|
||||
|
||||
//- Read entire buffer as a uint32_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
bool readUint32(const char* buf, uint32_t& val);
|
||||
|
||||
//- Read entire string as a uint32_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
inline bool readUint32(const std::string& str, uint32_t& val)
|
||||
{
|
||||
return readUint32(str.c_str(), val);
|
||||
}
|
||||
|
||||
//- Same as readUint32
|
||||
// \return True if successful.
|
||||
inline bool read(const char* buf, uint32_t& val)
|
||||
{
|
||||
return readUint32(buf, val);
|
||||
}
|
||||
|
||||
//- Same as readUint32
|
||||
// \return True if successful.
|
||||
inline bool read(const std::string& str, uint32_t& val)
|
||||
{
|
||||
return readUint32(str, val);
|
||||
}
|
||||
|
||||
|
||||
Istream& operator>>(Istream& is, uint32_t& val);
|
||||
Ostream& operator<<(Ostream& os, const uint32_t val);
|
||||
|
||||
//- Template specialization for pTraits<uint32_t>
|
||||
template<>
|
||||
@ -118,10 +156,10 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from primitive
|
||||
explicit pTraits(const uint32_t&);
|
||||
explicit pTraits(const uint32_t& val);
|
||||
|
||||
//- Construct from Istream
|
||||
pTraits(Istream&);
|
||||
pTraits(Istream& is);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,26 +24,68 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "uint32.H"
|
||||
#include "stringOps.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const uint32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const uint32_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, uint32_t& i)
|
||||
uint32_t Foam::readUint32(const char* buf)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const uintmax_t parsed = ::strtoumax(buf, &endptr, 10);
|
||||
|
||||
const uint32_t val = uint32_t(parsed);
|
||||
|
||||
if (parsed > UINT32_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
bool Foam::readUint32(const char* buf, uint32_t& val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const uintmax_t parsed = ::strtoumax(buf, &endptr, 10);
|
||||
|
||||
val = uint32_t(parsed);
|
||||
|
||||
if (parsed > UINT32_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
IOWarningInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, uint32_t& val)
|
||||
{
|
||||
token t(is);
|
||||
|
||||
@ -55,7 +97,7 @@ Foam::Istream& Foam::operator>>(Istream& is, uint32_t& i)
|
||||
|
||||
if (t.isLabel())
|
||||
{
|
||||
i = uint32_t(t.labelToken());
|
||||
val = uint32_t(t.labelToken());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -81,18 +123,9 @@ uint32_t Foam::readUint32(Istream& is)
|
||||
}
|
||||
|
||||
|
||||
bool Foam::read(const char* buf, uint32_t& s)
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const uint32_t val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
long l = strtol(buf, &endptr, 10);
|
||||
s = uint32_t(l);
|
||||
return (*endptr == 0);
|
||||
}
|
||||
|
||||
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const uint32_t i)
|
||||
{
|
||||
os.write(label(i));
|
||||
os.write(label(val));
|
||||
os.check(FUNCTION_NAME);
|
||||
return os;
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,6 +24,21 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "uint64.H"
|
||||
#include "stringOps.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const uint64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const uint64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -36,9 +51,9 @@ const uint64_t Foam::pTraits<uint64_t>::rootMax = pTraits<uint64_t>::max;
|
||||
|
||||
const char* const Foam::pTraits<uint64_t>::componentNames[] = { "" };
|
||||
|
||||
Foam::pTraits<uint64_t>::pTraits(const uint64_t& p)
|
||||
Foam::pTraits<uint64_t>::pTraits(const uint64_t& val)
|
||||
:
|
||||
p_(p)
|
||||
p_(val)
|
||||
{}
|
||||
|
||||
Foam::pTraits<uint64_t>::pTraits(Istream& is)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -22,10 +22,10 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Primitive
|
||||
uint64
|
||||
uint64_t
|
||||
|
||||
Description
|
||||
64bit uinteger
|
||||
64bit unsigned integer
|
||||
|
||||
SourceFiles
|
||||
uint64.C
|
||||
@ -44,7 +44,6 @@ SourceFiles
|
||||
#include "pTraits.H"
|
||||
#include "direction.H"
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
@ -58,7 +57,7 @@ class Ostream;
|
||||
//- Return a word representation of a uint64
|
||||
inline word name(const uint64_t val)
|
||||
{
|
||||
// no stripping required
|
||||
// No stripping required
|
||||
return word(std::to_string(val), false);
|
||||
}
|
||||
|
||||
@ -75,10 +74,48 @@ word name(const std::string& fmt, const uint64_t);
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
uint64_t readUint64(Istream&);
|
||||
bool read(const char*, uint64_t&);
|
||||
Istream& operator>>(Istream&, uint64_t&);
|
||||
Ostream& operator<<(Ostream&, const uint64_t);
|
||||
//- Read uint64_t from stream.
|
||||
uint64_t readUint64(Istream& is);
|
||||
|
||||
//- Parse entire buffer as uint64_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
uint64_t readUint64(const char* buf);
|
||||
|
||||
//- Parse entire string as uint64_t, skipping leading/trailing whitespace.
|
||||
// \return Parsed value or FatalIOError on any problem
|
||||
inline uint64_t readUint64(const std::string& str)
|
||||
{
|
||||
return readUint64(str.c_str());
|
||||
}
|
||||
|
||||
//- Parse entire buffer as uint64_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
bool readUint64(const char* buf, uint64_t& val);
|
||||
|
||||
//- Parse entire string as uint64_t, skipping leading/trailing whitespace.
|
||||
// \return True if successful.
|
||||
inline bool readUint64(const std::string& str, uint64_t& val)
|
||||
{
|
||||
return readUint64(str.c_str(), val);
|
||||
}
|
||||
|
||||
//- Same as readUint64
|
||||
// \return True if successful.
|
||||
inline bool read(const char* buf, uint64_t& val)
|
||||
{
|
||||
return readUint64(buf, val);
|
||||
}
|
||||
|
||||
//- Same as readUint64
|
||||
// \return True if successful.
|
||||
inline bool read(const std::string& str, uint64_t& val)
|
||||
{
|
||||
return readUint64(str, val);
|
||||
}
|
||||
|
||||
|
||||
Istream& operator>>(Istream& is, uint64_t& val);
|
||||
Ostream& operator<<(Ostream& os, const uint64_t val);
|
||||
|
||||
//- Template specialization for pTraits<uint64_t>
|
||||
template<>
|
||||
@ -119,10 +156,10 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from primitive
|
||||
explicit pTraits(const uint64_t&);
|
||||
explicit pTraits(const uint64_t& val);
|
||||
|
||||
//- Construct from Istream
|
||||
pTraits(Istream&);
|
||||
pTraits(Istream& is);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,26 +24,68 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "uint64.H"
|
||||
#include "stringOps.H"
|
||||
#include "parsing.H"
|
||||
#include "IOstreams.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::word Foam::name(const char* fmt, const uint64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
|
||||
Foam::word Foam::name(const std::string& fmt, const uint64_t val)
|
||||
{
|
||||
return stringOps::name(fmt, val);
|
||||
}
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, uint64_t& i)
|
||||
uint64_t Foam::readUint64(const char* buf)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const uintmax_t parsed = ::strtoumax(buf, &endptr, 10);
|
||||
|
||||
const uint64_t val = uint64_t(parsed);
|
||||
|
||||
if (parsed > UINT64_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< exit(FatalIOError);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
bool Foam::readUint64(const char* buf, uint64_t& val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
errno = 0;
|
||||
const uintmax_t parsed = ::strtoumax(buf, &endptr, 10);
|
||||
|
||||
val = uint64_t(parsed);
|
||||
|
||||
if (parsed > UINT64_MAX)
|
||||
{
|
||||
// Range error
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
const parsing::errorType err = parsing::checkConversion(buf, endptr);
|
||||
if (err != parsing::errorType::NONE)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
IOWarningInFunction("unknown")
|
||||
<< parsing::errorNames[err] << " '" << buf << "'"
|
||||
<< endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Foam::Istream& Foam::operator>>(Istream& is, uint64_t& val)
|
||||
{
|
||||
token t(is);
|
||||
|
||||
@ -55,7 +97,7 @@ Foam::Istream& Foam::operator>>(Istream& is, uint64_t& i)
|
||||
|
||||
if (t.isLabel())
|
||||
{
|
||||
i = uint64_t(t.labelToken());
|
||||
val = uint64_t(t.labelToken());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -81,18 +123,9 @@ uint64_t Foam::readUint64(Istream& is)
|
||||
}
|
||||
|
||||
|
||||
bool Foam::read(const char* buf, uint64_t& s)
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const uint64_t val)
|
||||
{
|
||||
char *endptr = nullptr;
|
||||
long l = strtol(buf, &endptr, 10);
|
||||
s = uint64_t(l);
|
||||
return (*endptr == 0);
|
||||
}
|
||||
|
||||
|
||||
Foam::Ostream& Foam::operator<<(Ostream& os, const uint64_t i)
|
||||
{
|
||||
os.write(label(i));
|
||||
os.write(label(val));
|
||||
os.check(FUNCTION_NAME);
|
||||
return os;
|
||||
}
|
||||
|
||||
38
src/OpenFOAM/primitives/strings/parsing/parsing.C
Normal file
38
src/OpenFOAM/primitives/strings/parsing/parsing.C
Normal file
@ -0,0 +1,38 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "parsing.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * //
|
||||
|
||||
const Foam::Enum<Foam::parsing::errorType>
|
||||
Foam::parsing::errorNames
|
||||
{
|
||||
{ errorType::GENERAL, "General error parsing" },
|
||||
{ errorType::TRAILING, "Trailing content found parsing" },
|
||||
};
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
85
src/OpenFOAM/primitives/strings/parsing/parsing.H
Normal file
85
src/OpenFOAM/primitives/strings/parsing/parsing.H
Normal file
@ -0,0 +1,85 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Namespace
|
||||
Foam::parsing
|
||||
|
||||
Description
|
||||
Collection of static functions and data related to parsing
|
||||
|
||||
SourceFiles
|
||||
parsing.C
|
||||
parsingI.H
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
#ifndef parsing_H
|
||||
#define parsing_H
|
||||
|
||||
#include "Enum.H"
|
||||
#include <cerrno>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Namespace parsing Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
namespace parsing
|
||||
{
|
||||
// Enumerations
|
||||
|
||||
//- Enumeration for possible parsing error
|
||||
enum class errorType
|
||||
{
|
||||
NONE = 0, //!< No error encountered
|
||||
GENERAL = 1, //!< General parsing error
|
||||
TRAILING = 2, //!< Trailing content detected
|
||||
};
|
||||
|
||||
|
||||
//- Strings corresponding to the errorType
|
||||
extern const Foam::Enum<errorType> errorNames;
|
||||
|
||||
//- Sanity check after strtof, strtod, etc.
|
||||
// Should set errno = 0 prior to the conversion.
|
||||
inline errorType checkConversion(const char* buf, char* endptr);
|
||||
|
||||
|
||||
} // End namespace parsing
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#include "parsingI.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
55
src/OpenFOAM/primitives/strings/parsing/parsingI.H
Normal file
55
src/OpenFOAM/primitives/strings/parsing/parsingI.H
Normal file
@ -0,0 +1,55 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
inline Foam::parsing::errorType Foam::parsing::checkConversion
|
||||
(
|
||||
const char* buf,
|
||||
char* endptr
|
||||
)
|
||||
{
|
||||
if (errno || endptr == buf)
|
||||
{
|
||||
// Some type of error OR no conversion
|
||||
return errorType::GENERAL;
|
||||
}
|
||||
|
||||
// Trailing spaces are permitted
|
||||
while (isspace(*endptr))
|
||||
{
|
||||
++endptr;
|
||||
}
|
||||
|
||||
if (*endptr != '\0')
|
||||
{
|
||||
// Trailing content
|
||||
return errorType::TRAILING;
|
||||
}
|
||||
|
||||
// Valid conversion
|
||||
return errorType::NONE;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,7 +24,55 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "NASCore.H"
|
||||
#include "StringStream.H"
|
||||
#include "parsing.H"
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
Foam::scalar Foam::fileFormats::NASCore::readNasScalar(const string& str)
|
||||
{
|
||||
const auto signPos = str.find_last_of("+-");
|
||||
|
||||
if
|
||||
(
|
||||
signPos == std::string::npos
|
||||
|| signPos == 0
|
||||
|| str[signPos-1] == 'E' || str[signPos-1] == 'e'
|
||||
|| isspace(str[signPos-1])
|
||||
)
|
||||
{
|
||||
// A normal number format
|
||||
return readScalar(str);
|
||||
}
|
||||
|
||||
|
||||
// Nastran compact number format.
|
||||
// Eg, "1234-2" instead of "1234E-2"
|
||||
|
||||
scalar value = 0;
|
||||
int exponent = 0; // Any integer
|
||||
|
||||
if
|
||||
(
|
||||
readScalar(str.substr(0, signPos), value) // Mantissa
|
||||
&& readInt(str.substr(signPos), exponent) // Exponent (with sign)
|
||||
)
|
||||
{
|
||||
// Note: this does not catch underflow/overflow
|
||||
// (especially when scalar is a float)
|
||||
value *= ::pow(10, exponent);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalIOErrorInFunction("unknown")
|
||||
<< parsing::errorNames[parsing::errorType::GENERAL] << str
|
||||
<< exit(FatalIOError);
|
||||
|
||||
value = 0;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
@ -32,36 +80,4 @@ Foam::fileFormats::NASCore::NASCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::scalar Foam::fileFormats::NASCore::parseNASCoord(const string& s)
|
||||
{
|
||||
scalar value = 0;
|
||||
|
||||
const size_t expSign = s.find_last_of("+-");
|
||||
|
||||
if (expSign != std::string::npos && expSign > 0 && !isspace(s[expSign-1]))
|
||||
{
|
||||
scalar exponent = 0;
|
||||
|
||||
// Parse as per strtod/strtof - allowing trailing space or [Ee]
|
||||
readScalar(s.substr(0, expSign).c_str(), value); // mantissa
|
||||
readScalar(s.substr(expSign+1).c_str(), exponent);
|
||||
|
||||
if (s[expSign] == '-')
|
||||
{
|
||||
exponent = -exponent;
|
||||
}
|
||||
|
||||
value *= ::pow(10, exponent);
|
||||
}
|
||||
else
|
||||
{
|
||||
readScalar(s.c_str(), value);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -56,7 +56,14 @@ public:
|
||||
// Public Member Functions
|
||||
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
static scalar parseNASCoord(const string& s);
|
||||
static scalar readNasScalar(const string& str);
|
||||
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
// \deprecated use readNasScalar instead (deprecated Sep 2017)
|
||||
inline static scalar parseNASCoord(const string& str)
|
||||
{
|
||||
return readNasScalar(str);
|
||||
}
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
Reference in New Issue
Block a user