diff --git a/applications/test/fileName/Test-fileName.C b/applications/test/fileName/Test-fileName.C index e214e98813f63f115e5b0fd4eadce82f1d34eab2..de8751c7b01dfa4f5526bd42edf832d9311c70dd 100644 --- a/applications/test/fileName/Test-fileName.C +++ b/applications/test/fileName/Test-fileName.C @@ -29,26 +29,98 @@ Description \*---------------------------------------------------------------------------*/ +#include "argList.H" #include "fileName.H" #include "SubList.H" +#include "DynamicList.H" #include "IOobject.H" #include "IOstreams.H" #include "OSspecific.H" #include "POSIX.H" +#include "etcFiles.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Main program: -int main() +int main(int argc, char *argv[]) { - wordList wrdList(5); - wrdList[0] = "hello"; - wrdList[1] = "hello1"; - wrdList[2] = "hello2"; - wrdList[3] = "hello3"; - wrdList[4] = "hello4.hmm"; + argList::noParallel(); + argList::addBoolOption("construct", "test constructors"); + argList::addBoolOption("default", "reinstate default tests"); + argList::addNote("runs default tests or specified ones only"); + + #include "setRootCase.H" + + // Run default tests, unless only specific tests are requested + const bool defaultTests = + args.optionFound("default") || args.options().empty(); + + if (args.optionFound("construct")) + { + Info<< "From initializer_list<word> = "; + fileName file1 + { + "hello", + "hello1", + "hello2", + "hello3", + "hello4.hmm" + }; + + Info<< file1 << nl; + + Info<< "From initializer_list<fileName> = "; + fileName file2 + { + file1, + "some", + "more/things.hmm" + }; + + Info<< file2 << nl; + + + Info<< "From initializer_list<fileName> with nesting = "; + fileName file3 + { + std::string("ffO"), + "some", + "more/things.hmm" + }; + Info<< file3 << nl; + + DynamicList<word> base + { + "hello", + "hello1" + }; + + fileName file4 + { + "some", + file3, + "more/things.hmm", + file1 + }; + Info<< "All ==> " << file4 << nl; + } + + + if (!defaultTests) + { + return 0; + } + + DynamicList<word> wrdList + { + "hello", + "hello1", + "hello2", + "hello3", + "hello4.hmm" + }; fileName pathName(wrdList); @@ -191,7 +263,6 @@ int main() } - // test findEtcFile Info<< "\n\nfindEtcFile tests:" << nl << " controlDict => " << findEtcFile("controlDict") << nl diff --git a/src/OpenFOAM/primitives/strings/fileName/fileName.C b/src/OpenFOAM/primitives/strings/fileName/fileName.C index 2186c5f17134bc3b9ffa98c308626a3766c5768c..7110bdf2f622d515ff960ae403a0c2e3d4c3dda8 100644 --- a/src/OpenFOAM/primitives/strings/fileName/fileName.C +++ b/src/OpenFOAM/primitives/strings/fileName/fileName.C @@ -37,11 +37,46 @@ const Foam::fileName Foam::fileName::null; // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::fileName::fileName(const wordList& lst) +Foam::fileName::fileName(const UList<word>& lst) { - forAll(lst, elemI) + // Estimate overall size + size_type sz = lst.size(); + for (const word& item : lst) { - operator=((*this)/lst[elemI]); + sz += item.size(); + } + reserve(sz); + + sz = 0; + for (const word& item : lst) + { + if (item.size()) + { + if (sz++) operator+=('/'); + operator+=(item); + } + } +} + + +Foam::fileName::fileName(std::initializer_list<word> lst) +{ + // Estimate overall size + size_type sz = lst.size(); + for (const word& item : lst) + { + sz += item.size(); + } + reserve(sz); + + sz = 0; + for (const word& item : lst) + { + if (item.size()) + { + if (sz++) operator+=('/'); + operator+=(item); + } } } diff --git a/src/OpenFOAM/primitives/strings/fileName/fileName.H b/src/OpenFOAM/primitives/strings/fileName/fileName.H index 18198ea0fc379fe5a3329ae12cbd8d733857315d..cc49f365e4f0c6a6234b32a28fa062abdb6f729e 100644 --- a/src/OpenFOAM/primitives/strings/fileName/fileName.H +++ b/src/OpenFOAM/primitives/strings/fileName/fileName.H @@ -53,10 +53,10 @@ namespace Foam { template<class T> class List; +template<class T> class UList; typedef List<word> wordList; // Forward declaration of friend functions and operators - class fileName; Istream& operator>>(Istream&, fileName&); @@ -119,7 +119,11 @@ public: inline fileName(const char*, const bool doStripInvalid=true); //- Construct by concatenating elements of wordList separated by '/' - explicit fileName(const wordList&); + explicit fileName(const UList<word>&); + + //- Construct by concatenating words separated by '/' + explicit fileName(std::initializer_list<word>); + //- Construct from Istream fileName(Istream&);