diff --git a/applications/test/charList/Make/files b/applications/test/charList/Make/files new file mode 100644 index 0000000000..e7b5eba75b --- /dev/null +++ b/applications/test/charList/Make/files @@ -0,0 +1,3 @@ +Test-charList.C + +EXE = $(FOAM_USER_APPBIN)/Test-charList diff --git a/applications/test/charList/Make/options b/applications/test/charList/Make/options new file mode 100644 index 0000000000..18e6fe47af --- /dev/null +++ b/applications/test/charList/Make/options @@ -0,0 +1,2 @@ +/* EXE_INC = */ +/* EXE_LIBS = */ diff --git a/applications/test/charList/Test-charList.C b/applications/test/charList/Test-charList.C new file mode 100644 index 0000000000..3288c3b7f0 --- /dev/null +++ b/applications/test/charList/Test-charList.C @@ -0,0 +1,87 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 . + +Application + Test-charList + +Description + Some test of UList, List for characters + +\*---------------------------------------------------------------------------*/ + +#include "OSspecific.H" +#include "argList.H" +#include "IOstreams.H" +#include "messageStream.H" + +#include "charList.H" +#include "labelList.H" +#include "StringStream.H" +#include "ListOps.H" +#include "SubList.H" +#include "FlatOutput.H" + +#include + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noBanner(); + argList::noParallel(); + argList::noFunctionObjects(); + + #include "setRootCase.H" + + Info<< "Known compound tokens: " + << token::compound::IstreamConstructorTablePtr_->sortedToc() << nl; + + OStringStream ostr; + + { + List alphabet(64); + std::iota(alphabet.begin(), alphabet.end(), '@'); + + alphabet.writeEntry("alphabet", Info); + + ostr << alphabet; + + Info<< "wrote: " << ostr.str() << nl; + } + + { + IStringStream istr(ostr.str()); + List alphabet(istr); + + Info<< "re-read: " << alphabet << nl; + } + + return 0; +} + +// ************************************************************************* // diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index 8a66579f1f..5d41eddc04 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -31,8 +31,10 @@ $(bools)/Switch/Switch.C $(bools)/lists/boolList.C chars = primitives/chars -$(chars)/char/charIO.C -$(chars)/wchar/wcharIO.C +$(chars)/char/char.C +$(chars)/wchar/wchar.C +$(chars)/lists/charList.C +$(chars)/lists/charUList.C primitives/direction/directionIO.C diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H index 34202f1bdc..7dbcd5077c 100644 --- a/src/OpenFOAM/containers/Lists/List/List.H +++ b/src/OpenFOAM/containers/Lists/List/List.H @@ -353,6 +353,14 @@ public: }; +// * * * * * * * * * * * * Template Specializations * * * * * * * * * * * * // + +//- Specialized list reading for character lists which always uses +//- binary format. +template<> +Istream& List::readList(Istream& is); + + // * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * * // //- Create identity map of the given length with (map[i] == i) diff --git a/src/OpenFOAM/containers/Lists/UList/UList.H b/src/OpenFOAM/containers/Lists/UList/UList.H index 2ba4a13bb7..f0a3ab0d58 100644 --- a/src/OpenFOAM/containers/Lists/UList/UList.H +++ b/src/OpenFOAM/containers/Lists/UList/UList.H @@ -551,6 +551,24 @@ public: }; +// * * * * * * * * * * * * Template Specializations * * * * * * * * * * * * // + +//- Specialized list reading for character lists which always uses +//- binary format. +template<> +Istream& UList::readList(Istream& is); + +//- Specialized writeEntry for character lists which always uses +//- binary format. +template<> +void UList::writeEntry(Ostream& os) const; + +//- Specialized writeList for character lists which always uses +//- binary format. +template<> +Ostream& UList::writeList(Ostream& os, const label /*unused*/) const; + + // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // //- Write List to Ostream, as per UList::writeList() with default length. diff --git a/src/OpenFOAM/primitives/chars/char/charIO.C b/src/OpenFOAM/primitives/chars/char/char.C similarity index 87% rename from src/OpenFOAM/primitives/chars/char/charIO.C rename to src/OpenFOAM/primitives/chars/char/char.C index b1f99fad3e..6d5802816b 100644 --- a/src/OpenFOAM/primitives/chars/char/charIO.C +++ b/src/OpenFOAM/primitives/chars/char/char.C @@ -5,7 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2011-2016 OpenFOAM Foundation + Copyright (C) 2011 OpenFOAM Foundation + Copyright (C) 2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -30,6 +31,20 @@ License // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +const char* const Foam::pTraits::typeName = "char"; + +Foam::pTraits::pTraits(const char p) noexcept +: + p_(p) +{} + + +Foam::pTraits::pTraits(Istream& is) +{ + is >> p_; +} + + char Foam::readChar(Istream& is) { char c; diff --git a/src/OpenFOAM/primitives/chars/char/char.H b/src/OpenFOAM/primitives/chars/char/char.H index 4ac3bb747f..c8efbbc39e 100644 --- a/src/OpenFOAM/primitives/chars/char/char.H +++ b/src/OpenFOAM/primitives/chars/char/char.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011 OpenFOAM Foundation + Copyright (C) 2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -30,7 +31,7 @@ Description A character and a pointer to a character string. SourceFiles - charIO.C + char.C \*---------------------------------------------------------------------------*/ @@ -42,6 +43,7 @@ SourceFiles namespace Foam { +// Forward Declarations class Istream; class Ostream; @@ -59,7 +61,7 @@ Ostream& operator<<(Ostream& os, const char c); //- Write a nul-terminated C-string Ostream& operator<<(Ostream& os, const char* str); -//- Test for \em horizontal whitespace +//- Test for whitespace inline bool isspace(char c) { return @@ -72,6 +74,55 @@ inline bool isspace(char c) } +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "pTraits.H" + +namespace Foam +{ + +// Template specialisation for pTraits +template<> +class pTraits +{ + char p_; + +public: + + // Static Data Members + + static const char* const typeName; + + + // Constructors + + //- Copy construct from primitive + explicit pTraits(const char p) noexcept; + + //- Read construct from Istream + explicit pTraits(Istream& is); + + + // Member Functions + + //- Read access to primitive value + operator char() const noexcept + { + return p_; + } + + //- Write access to primitive value + operator char&() noexcept + { + return p_; + } +}; + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/primitives/chars/lists/charList.C b/src/OpenFOAM/primitives/chars/lists/charList.C new file mode 100644 index 0000000000..95f5a1d864 --- /dev/null +++ b/src/OpenFOAM/primitives/chars/lists/charList.C @@ -0,0 +1,116 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 . + +\*---------------------------------------------------------------------------*/ + +#include "charList.H" +#include "Istream.H" +#include "Ostream.H" +#include "token.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineCompoundTypeName(List, charList); + addCompoundToRunTimeSelectionTable(List, charList); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +namespace Foam +{ + +template<> +Istream& List::readList(Istream& is) +{ + List& list = *this; + + // Anull list + list.clear(); + + is.fatalCheck(FUNCTION_NAME); + + token tok(is); + + is.fatalCheck("List::readList(Istream&) : reading first token"); + + if (tok.isCompound()) + { + // Compound: simply transfer contents + + list.transfer + ( + dynamicCast>> + ( + tok.transferCompoundToken(is) + ) + ); + } + else if (tok.isLabel()) + { + // Label: could be int(..) or just a plain '0' + + const label len = tok.labelToken(); + + // Resize to actual length read + list.resize(len); + + // Binary, always contiguous + + if (len) + { + const auto oldFmt = is.format(IOstream::BINARY); + + // read(...) includes surrounding start/end delimiters + is.read(list.data(), std::streamsize(len)); + + is.format(oldFmt); + + is.fatalCheck + ( + "List::readList(Istream&) : " + "reading binary block" + ); + } + } + else + { + FatalIOErrorInFunction(is) + << "incorrect first token, expected , found " + << tok.info() << nl + << exit(FatalIOError); + } + + return is; +} + + +} // End namespace Foam + + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/chars/lists/charList.H b/src/OpenFOAM/primitives/chars/lists/charList.H new file mode 100644 index 0000000000..cc13e3fa69 --- /dev/null +++ b/src/OpenFOAM/primitives/chars/lists/charList.H @@ -0,0 +1,56 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 . + +Typedef + Foam::charListList + +Description + A List of charList. + +\*---------------------------------------------------------------------------*/ + +#ifndef charList_H +#define charList_H + +#include "char.H" +#include "List.H" +#include "SubList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + // charUList = defined in UList.H + // charList = defined in List.H + // charSubList = defined in SubList.H + + typedef List charListList; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/chars/lists/charUList.C b/src/OpenFOAM/primitives/chars/lists/charUList.C new file mode 100644 index 0000000000..5fc94f3d61 --- /dev/null +++ b/src/OpenFOAM/primitives/chars/lists/charUList.C @@ -0,0 +1,193 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 . + +\*---------------------------------------------------------------------------*/ + +#include "charList.H" +#include "Istream.H" +#include "Ostream.H" +#include "token.H" + +// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * // + +namespace Foam +{ + +static Ostream& writeChars +( + Ostream& os, + const char* chars, + std::streamsize count +) +{ + // Contents are binary and contiguous + os << nl << label(count) << nl; + + if (count) + { + const auto oldFmt = os.format(IOstream::BINARY); + + // write(...) includes surrounding start/end delimiters + os.write(chars, count); + + os.format(oldFmt); + } + + os.check(FUNCTION_NAME); + return os; +} + +} // End namespace Foam + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +namespace Foam +{ + +template<> +void UList::writeEntry(Ostream& os) const +{ + const std::streamsize count(this->size()); + + os << word("List"); + + if (count) + { + writeChars(os, this->cdata(), count); + } + else + { + // Zero-sized binary - Write size only + os << token::SPACE << label(0); + } +} + +} // End namespace Foam + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +namespace Foam +{ + +template<> +Ostream& UList::writeList +( + Ostream& os, + const label /* shortLen (unused) */ +) const +{ + return writeChars(os, this->cdata(), std::streamsize(this->size())); +} + + +template<> +Istream& UList::readList(Istream& is) +{ + UList& list = *this; + + // The target list length - must match with sizes read + const label len = list.size(); + + is.fatalCheck(FUNCTION_NAME); + + token tok(is); + + is.fatalCheck("UList::readList(Istream&) : reading first token"); + + if (tok.isCompound()) + { + // Compound: simply transfer contents + + List elems; + elems.transfer + ( + dynamicCast>> + ( + tok.transferCompoundToken(is) + ) + ); + + const label inputLen = elems.size(); + + // List lengths must match + if (inputLen != len) + { + FatalIOErrorInFunction(is) + << "incorrect length for UList. Read " + << inputLen << " expected " << len + << exit(FatalIOError); + } + + this->deepCopy(elems); + } + if (tok.isLabel()) + { + // Label: could be int(..) or just a plain '0' + + const label inputLen = tok.labelToken(); + + // List lengths must match + if (inputLen != len) + { + FatalIOErrorInFunction(is) + << "incorrect length for UList. Read " + << inputLen << " expected " << len + << exit(FatalIOError); + } + + // Binary, always contiguous + + if (len) + { + const auto oldFmt = is.format(IOstream::BINARY); + + // read(...) includes surrounding start/end delimiters + is.read(list.data(), std::streamsize(len)); + + is.format(oldFmt); + + is.fatalCheck + ( + "UList::readList(Istream&) : " + "reading binary block" + ); + } + } + else + { + FatalIOErrorInFunction(is) + << "incorrect first token, expected , found " + << tok.info() << nl + << exit(FatalIOError); + } + + return is; +} + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/chars/wchar/wcharIO.C b/src/OpenFOAM/primitives/chars/wchar/wchar.C similarity index 100% rename from src/OpenFOAM/primitives/chars/wchar/wcharIO.C rename to src/OpenFOAM/primitives/chars/wchar/wchar.C diff --git a/src/OpenFOAM/primitives/chars/wchar/wchar.H b/src/OpenFOAM/primitives/chars/wchar/wchar.H index c03a1db7a8..25a80bc554 100644 --- a/src/OpenFOAM/primitives/chars/wchar/wchar.H +++ b/src/OpenFOAM/primitives/chars/wchar/wchar.H @@ -30,7 +30,7 @@ Description A wide-character and a pointer to a wide-character string. SourceFiles - wcharIO.C + wchar.C See also http://en.wikipedia.org/wiki/UTF-8 @@ -49,6 +49,7 @@ See also namespace Foam { +// Forward Declarations class Istream; class Ostream;