ENH: define nameOp<>, typeOp<>, sizeOp<> functors (issue #1013)

This commit is contained in:
Mark Olesen
2018-09-19 15:32:04 +02:00
parent 47519b2e04
commit 12c903bba8
15 changed files with 149 additions and 44 deletions

View File

@ -617,6 +617,7 @@ int main(int argc, char *argv[])
fileName pathName(wrdList); fileName pathName(wrdList);
Info<< "pathName = " << pathName << nl Info<< "pathName = " << pathName << nl
<< "nameOp = " << nameOp<fileName>()(pathName) << nl
<< "pathName.name() = >" << pathName.name() << "<\n" << "pathName.name() = >" << pathName.name() << "<\n"
<< "pathName.path() = " << pathName.path() << nl << "pathName.path() = " << pathName.path() << nl
<< "pathName.ext() = >" << pathName.ext() << "<\n" << "pathName.ext() = >" << pathName.ext() << "<\n"

View File

@ -271,32 +271,31 @@ int main(int argc, char *argv[])
Info<< "hash: = " << word::printf("0x%012X", string::hash()(s2)) << endl; Info<< "hash: = " << word::printf("0x%012X", string::hash()(s2)) << endl;
// test formatting on int // Test formatting on int
{ {
label val = 25; label val = 25;
Info<<"val: " << val << "\n"; Info<< "int " << val << " nameOp='"
<< nameOp<label>()(val) << "', name='"
Info<< "int " << val << " as word >" << Foam::name(val) << "' or "
<< Foam::name(val) << "< or " << word::printf("formatted '%08d'", val) << "\n";
<< word::printf("formatted >%08d<", val) << "\n";
} }
// test formatting on scalar // Test formatting on scalar
{ {
scalar val = 3.1415926535897931; scalar val = 3.1415926535897931;
Info<< "scalar " << val << " as word >" Info<< "scalar " << val << " nameOp='"
<< Foam::name(val) << "< or " << nameOp<scalar>()(val) << "', name='"
<< word::printf("formatted >%.9f<", val) << "\n"; << Foam::name(val) << "' or "
<< word::printf("formatted '%.9f'", val) << "\n";
} }
// test formatting on uint // Test formatting on uint
{ {
uint64_t val = 25000000ul; uint64_t val = 25000000ul;
Info<<"val: " << val << "\n"; Info<< "uint64 " << val << " nameOp='"
<< nameOp<uint64_t>()(val) << "', name='"
Info<< "uint64 " << val << " as word >" << Foam::name(val) << "' or "
<< Foam::name(val) << "< or " << word::printf("formatted '%08d'", val) << "\n";
<< word::printf("formatted >%08d<", val) << "\n";
} }
// test startsWith, endsWith methods // test startsWith, endsWith methods

View File

@ -87,12 +87,12 @@ static const Enum<restoreMethod> methodEndings
// Files in given directory at time instant // Files in given directory at time instant
wordList getFiles(const fileName& dir, const word& instance) inline wordList getFiles(const fileName& dir, const word& instance)
{ {
return ListOps::create<word> return ListOps::create<word>
( (
Foam::readDir(dir/instance, fileName::FILE), Foam::readDir(dir/instance, fileName::FILE),
[](const fileName& f){ return f.name(); } nameOp<fileName>()
); );
} }

View File

@ -3,7 +3,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) 2011-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -612,6 +612,17 @@ struct Hash<UList<T>>
}; };
//- Extract size (as label) from an object, typically using its size() method.
template<class T>
struct sizeOp
{
inline label operator()(const T& obj) const
{
return obj.size();
}
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam } // End namespace Foam

View File

@ -105,10 +105,22 @@ public:
// * * * * * * * * * * * * * * * IO/Conversion * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IO/Conversion * * * * * * * * * * * * * * * //
//- Return a word representation of a Scalar. //- A word representation of a floating-point value.
// Uses stringstream instead of std::to_string for more consistent formatting. // Uses stringstream instead of std::to_string for more consistent formatting.
word name(const Scalar val); word name(const Scalar val);
//- A word representation of a floating-point value.
template<>
struct nameOp<Scalar>
{
inline word operator()(const Scalar val) const
{
return Foam::name(val);
}
};
//- Parse entire buffer as a float/double, skipping leading/trailing whitespace. //- Parse entire buffer as a float/double, skipping leading/trailing whitespace.
// \return Parsed value or FatalIOError on any problem // \return Parsed value or FatalIOError on any problem
Scalar ScalarRead(const char* buf); Scalar ScalarRead(const char* buf);

View File

@ -216,9 +216,9 @@ public:
// * * * * * * * * * * * * * * Global functions * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Global functions * * * * * * * * * * * * * * //
//- Return a string representation of a VectorSpace //- A word representation of a VectorSpace
template<class Form, class Cmpt, direction Ncmpts> template<class Form, class Cmpt, direction Ncmpts>
word name(const VectorSpace<Form, Cmpt, Ncmpts>&); word name(const VectorSpace<Form, Cmpt, Ncmpts>& vs);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -48,13 +48,22 @@ class Ostream;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Return a word representation of an int16 //- A word representation of int16 value
inline word name(const int16_t val) inline word name(const int16_t val)
{ {
// No stripping required return word(std::to_string(int(val)), false); // Needs no stripping
return word(std::to_string(int(val)), false);
} }
//- A word representation of int16 value
template<>
struct nameOp<int16_t>
{
inline word operator()(const int16_t val) const
{
return word(std::to_string(int(val)), false); // Needs no stripping
}
};
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //

View File

@ -54,14 +54,24 @@ class Ostream;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Return a word representation of an int32 //- A word representation of int32 value
inline word name(const int32_t val) inline word name(const int32_t val)
{ {
// No stripping required return word(std::to_string(val), false); // Needs no stripping
return word(std::to_string(val), false);
} }
//- A word representation of int32 value
template<>
struct nameOp<int32_t>
{
inline word operator()(const int32_t val) const
{
return word(std::to_string(val), false); // Needs no stripping
}
};
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
//- Read int32_t from stream //- Read int32_t from stream

View File

@ -55,14 +55,24 @@ class Ostream;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Return a word representation of an int64 //- A word representation of int64 value
inline word name(const int64_t val) inline word name(const int64_t val)
{ {
// No stripping required return word(std::to_string(val), false); // Needs no stripping
return word(std::to_string(val), false);
} }
//- A word representation of int64 value
template<>
struct nameOp<int64_t>
{
inline word operator()(const int64_t val) const
{
return word(std::to_string(val), false); // Needs no stripping
}
};
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
//- Read int64_t from stream //- Read int64_t from stream

View File

@ -48,14 +48,24 @@ class Ostream;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Return a word representation of a uint16 //- A word representation of uint16 value
inline word name(const uint16_t val) inline word name(const uint16_t val)
{ {
// No stripping required return word(std::to_string(int(val)), false); // Needs no stripping
return word(std::to_string(int(val)), false);
} }
//- A word representation of uint16 value
template<>
struct nameOp<uint16_t>
{
inline word operator()(const uint16_t val) const
{
return word(std::to_string(int(val)), false); // Needs no stripping
}
};
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
Istream& operator>>(Istream& is, uint16_t& val); Istream& operator>>(Istream& is, uint16_t& val);

View File

@ -54,13 +54,22 @@ class Ostream;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Return a word representation of a uint32 //- A word representation of uint32 value
inline word name(const uint32_t val) inline word name(const uint32_t val)
{ {
// No stripping required return word(std::to_string(val), false); // Needs no stripping
return word(std::to_string(val), false);
} }
//- A word representation of uint32 value
template<>
struct nameOp<uint32_t>
{
inline word operator()(const uint32_t val) const
{
return word(std::to_string(val), false); // Needs no stripping
}
};
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //

View File

@ -54,14 +54,24 @@ class Ostream;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Return a word representation of a uint64 //- A word representation of uint64 value
inline word name(const uint64_t val) inline word name(const uint64_t val)
{ {
// No stripping required return word(std::to_string(val), false); // Needs no stripping
return word(std::to_string(val), false);
} }
//- A word representation of uint64 value
template<>
struct nameOp<uint64_t>
{
inline word operator()(const uint64_t val) const
{
return word(std::to_string(val), false); // Needs no stripping
}
};
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
//- Read uint64_t from stream. //- Read uint64_t from stream.

View File

@ -589,7 +589,7 @@ Foam::fileName Foam::operator/(const string& a, const string& b)
Foam::fileName Foam::search(const word& file, const fileName& directory) Foam::fileName Foam::search(const word& file, const fileName& directory)
{ {
// Search the current directory for the file // Search the current directory for the file
fileNameList files(fileHandler().readDir(directory)); fileNameList files(fileHandler().readDir(directory, fileName::FILE));
for (const fileName& item : files) for (const fileName& item : files)
{ {
if (item == file) if (item == file)

View File

@ -52,11 +52,11 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward declarations
template<class T> class List; template<class T> class List;
template<class T> class UList; template<class T> class UList;
typedef List<word> wordList; typedef List<word> wordList;
// Forward declaration of friend functions and operators
class wordRe; class wordRe;
class fileName; class fileName;

View File

@ -47,7 +47,7 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward declaration of friend functions and operators // Forward declarations
class word; class word;
Istream& operator>>(Istream& is, word& w); Istream& operator>>(Istream& is, word& w);
Ostream& operator<<(Ostream& os, const word& w); Ostream& operator<<(Ostream& os, const word& w);
@ -218,13 +218,37 @@ public:
}; };
// Global Operators // * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * * //
//- Join words as camelCase, capitalizing the first letter of b. //- Join words as camelCase, capitalizing the first letter of b.
// No effect if either argument is empty. // No effect if either argument is empty.
word operator&(const word& a, const word& b); word operator&(const word& a, const word& b);
// * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * * //
//- Extract name (as a word) from an object, typically using its name() method.
template<class T>
struct nameOp
{
inline word operator()(const T& obj) const
{
return obj.name();
}
};
//- Extract type (as a word) from an object, typically using its type() method.
template<class T>
struct typeOp
{
inline word operator()(const T& obj) const
{
return obj.type();
}
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam } // End namespace Foam