/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2017-2019 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 . Class Foam::ITstream Description An input stream of tokens. SourceFiles ITstream.C \*---------------------------------------------------------------------------*/ #ifndef ITstream_H #define ITstream_H #include "Istream.H" #include "tokenList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { // Forward declaration class ISstream; /*---------------------------------------------------------------------------*\ Class ITstream Declaration \*---------------------------------------------------------------------------*/ class ITstream : public Istream, public tokenList { // Private data //- Name of ITstream fileName name_; //- Index of token currently being read label tokenIndex_; // Private Member Functions //- Convert input sequence into a list of tokens. // \return the number of tokens in the resulting list. static label parseStream(ISstream& input, tokenList& tokens); //- An ad hoc combination of reserve and setCapacity somewhat //- similar to DynamicList. // // In lazy mode, increase list size if needed, but leave any // excess capacity - works like reserve. // // In non-lazy mode, set exact capacity void reserveCapacity(const label nElem, const bool lazy); public: // Constructors //- Construct from components ITstream ( const string& name, const UList& tokens, streamFormat format=ASCII, versionNumber version=currentVersion ) : Istream(format, version), tokenList(tokens), name_(name), tokenIndex_(0) { setOpened(); setGood(); } //- Construct from components, transferring the tokens ITstream ( const string& name, List&& tokens, streamFormat format=ASCII, versionNumber version=currentVersion ) : Istream(format, version), tokenList(std::move(tokens)), name_(name), tokenIndex_(0) { setOpened(); setGood(); } //- Construct token list by parsing the input character sequence // Uses UIListStream internally. ITstream ( const string& name, const UList& input, streamFormat format=ASCII, versionNumber version=currentVersion ); //- Construct token list by parsing the input string // Uses UIListStream internally. ITstream ( const string& name, const std::string& input, streamFormat format=ASCII, versionNumber version=currentVersion ); //- Construct token list by parsing the input character sequence // Uses UIListStream internally. ITstream ( const string& name, const char* input, streamFormat format=ASCII, versionNumber version=currentVersion ); //- Copy construct ITstream(const ITstream& is) : Istream(ASCII, currentVersion), tokenList(is), name_(is.name_), tokenIndex_(0) { setOpened(); setGood(); } //- Destructor virtual ~ITstream() = default; // Static Functions //- Create token list by parsing the input character sequence until //- no good tokens remain. static tokenList parse ( const UList& input, streamFormat format=ASCII ); //- Create token list by parsing the input string until //- no good tokens remain. static tokenList parse ( const std::string& input, streamFormat format=ASCII ); //- Create token list by parsing the input character sequence until //- no good tokens remain. static tokenList parse ( const char* input, streamFormat format=ASCII ); // Member Functions // Inquiry //- Return the name of the stream virtual const fileName& name() const { return name_; } //- Return non-const access to the name of the stream virtual fileName& name() { return name_; } //- The current token index when reading, or the insertion point. label tokenIndex() const { return tokenIndex_; } //- Non-const access to the current token index label& tokenIndex() { return tokenIndex_; } //- Return the number of remaining tokens label nRemainingTokens() const { return size() - tokenIndex_; } //- Return flags of output stream ios_base::fmtflags flags() const { return ios_base::fmtflags(0); } // Read Functions //- Return next token from stream virtual Istream& read(token& tok); //- Read a character virtual Istream& read(char&); //- Read a word virtual Istream& read(word&); // Read a string (including enclosing double-quotes) virtual Istream& read(string&); //- Read a label virtual Istream& read(label&); //- Read a floatScalar virtual Istream& read(floatScalar&); //- Read a doubleScalar virtual Istream& read(doubleScalar&); //- Read binary block // \note Not implemented virtual Istream& read(char* data, std::streamsize); //- Low-level raw binary read // \note Not implemented virtual Istream& readRaw(char* data, std::streamsize count); //- Start of low-level raw binary read virtual bool beginRawRead() { return false; } //- End of low-level raw binary read virtual bool endRawRead() { return false; } //- Rewind the stream so that it may be read again virtual void rewind(); //- Move the tokenIndex to the specified position. // Using seek(0) is identical to rewind. // Using seek(-1) moves to the end. void seek(label pos); // Edit //- Copy append a token at the current tokenIndex, //- incrementing the index. void append(const token& t, const bool lazy); //- Move append a token at the current tokenIndex, //- incrementing the index. void append(token&& t, const bool lazy); //- Copy append a tokenList at the current tokenIndex, //- incrementing the index. // // \param newTokens the list of tokens to copy append // \param lazy leaves any excess capacity for further appends. // The caller will be responsible for resizing later. void append(const tokenList& newTokens, const bool lazy); //- Move append a tokenList at the current tokenIndex, //- incrementing the index. // // \param newTokens the list of tokens to move append // \param lazy leaves any excess capacity for further appends. // The caller will be responsible for resizing later. void append(tokenList&& newTokens, const bool lazy); //- Set flags of stream ios_base::fmtflags flags(const ios_base::fmtflags) { return ios_base::fmtflags(0); } // Output //- Print description of stream to Ostream void print(Ostream& os) const; //- Concatenate tokens into a space-separated std::string. //- The resulting string may contain quote characters. std::string toString() const; }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //