SYCL: Avoid using no_init read accessor in rocFFT
[alexxy/gromacs.git] / src / gromacs / utility / textreader.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2015,2017,2019,2021, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*! \libinternal \file
36  * \brief
37  * Declares gmx::TextReader.
38  *
39  * \author Teemu Murtola <teemu.murtola@gmail.com>
40  * \inlibraryapi
41  * \ingroup module_utility
42  */
43 #ifndef GMX_UTILITY_TEXTREADER_H
44 #define GMX_UTILITY_TEXTREADER_H
45
46 #include <memory>
47 #include <string>
48
49 #include "gromacs/utility/textstream.h"
50
51 namespace gmx
52 {
53
54 /*! \libinternal \brief
55  * Reads text from a TextInputStream.
56  *
57  * This class provides more formatted reading capabilities than reading raw
58  * lines from the stream (and a natural place to implement more such
59  * capabilities).
60  *
61  * All methods that read from the stream can throw any exceptions that the
62  * underlying stream throws.
63  *
64  * \inlibraryapi
65  * \ingroup module_utility
66  */
67 class TextReader
68 {
69 public:
70     /*! \brief
71      * Reads contents of a file to a std::string.
72      *
73      * \param[in] filename  Name of the file to read.
74      * \returns   The contents of \p filename.
75      * \throws    std::bad_alloc if out of memory.
76      * \throws    FileIOError on any I/O error.
77      */
78     static std::string readFileToString(const char* filename);
79     //! \copydoc readFileToString(const char *)
80     static std::string readFileToString(const std::string& filename);
81
82     /*! \brief
83      * Creates a reader that reads from specified file.
84      *
85      * \param[in]  filename  Path to the file to open.
86      * \throws     std::bad_alloc if out of memory.
87      * \throws     FileIOError on any I/O error.
88      *
89      * This constructor is provided for convenience for reading directly
90      * from a file, without the need to construct multiple objects.
91      */
92     explicit TextReader(const std::string& filename);
93     /*! \brief
94      * Creates a reader that reads from specified stream.
95      *
96      * \param[in]  stream  Stream to read from.
97      * \throws     std::bad_alloc if out of memory.
98      *
99      * The caller is responsible of the lifetime of the stream (should
100      * remain in existence as long as the reader exists).
101      *
102      * This constructor is provided for convenience for cases where the
103      * stream is not allocated with `new` and/or not managed by a
104      * std::shared_ptr (e.g., if the stream is an object on the stack).
105      */
106     explicit TextReader(TextInputStream* stream);
107     /*! \brief
108      * Creates a reader that reads from specified stream.
109      *
110      * \param[in]  stream  Stream to read from.
111      * \throws     std::bad_alloc if out of memory.
112      *
113      * The reader keeps a reference to the stream, so the caller can pass
114      * in a temporary if necessary.
115      */
116     explicit TextReader(const TextInputStreamPointer& stream);
117     ~TextReader();
118
119     /*! \brief
120      * Reads a single line (including newline) from the stream.
121      *
122      * \param[out] line    String to receive the line.
123      * \returns    `false` if nothing was read because the file ended.
124      *
125      * On error or when false is returned, \p line will be empty.
126      * Newlines will be returned as part of \p line if it was present in
127      * the stream.
128      * To loop over all lines in the stream, use:
129      * \code
130        std::string line;
131        while (reader.readLine(&line))
132        {
133            // ...
134        }
135        \endcode
136      *
137      * Behaviours such as trimming whitespace or comments can be
138      * configured by calling other methods before this one.
139      */
140     bool readLine(std::string* line);
141     /*! \brief Sets whether the reader should trim leading whitespace
142      * from a line before returning it.
143      *
144      * \param[in] doTrimming  Whether trimming should be active.
145      */
146     void setTrimLeadingWhiteSpace(bool doTrimming);
147     /*! \brief Sets whether the reader should trim trailing whitespace
148      * from a line before returning it.
149      *
150      * Note that comment trimming will precede whitespace trimming
151      * when both are active.
152      *
153      * \param[in] doTrimming  Whether trimming should be active.
154      */
155     void setTrimTrailingWhiteSpace(bool doTrimming);
156     /*! \brief Sets whether the reader should trim at trailing
157      * comment from a line before returning it.
158      *
159      * Note that comment trimming will precede whitespace trimming
160      * when both are active.
161      *
162      * \param[in]  commentChar  The character that begins a comment.
163      *
164      * \param[in] doTrimming  Whether trimming should be active.
165      */
166     void setTrimTrailingComment(bool doTrimming, char commentChar);
167     /*! \brief
168      * Reads all remaining lines from the stream as a single string.
169      *
170      * \returns   Full contents of the stream (from the current point to
171      *     the end).
172      */
173     std::string readAll();
174
175     /*! \brief
176      * Closes the underlying stream.
177      */
178     void close();
179
180 private:
181     class Impl;
182
183     std::unique_ptr<Impl> impl_;
184 };
185
186 } // namespace gmx
187
188 #endif