Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4String.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4String
27//
28// Class description:
29//
30// Common string type for Geant4
31//
32// Provides a `std::string` compliant implementation of basic
33// strings. It currently inherits from `std::string`, but this should
34// not be assumed other than that it will implement the same interface
35// as `std::string` as of the minimum C++ standard required by Geant4
36// (currently C++17).
37//
38// It can be passed to any function accepting `std::string` or `std::string_view`
39// arguments. Whilst it currently implements a conversion operator to `const char*`,
40// this should be considered deprecated for use outside of Geant4. Passing to
41// non-Geant4 functions taking `const char*` arguments should use the
42// `std::string::c_str` member function to explicitly convert.
43//
44// See `std::string` for primary interfaces, `G4StrUtil` for additional query/manipulation functions
45//
46// Author: G.Cosmo, 11 November 1999
47//---------------------------------------------------------------------
48
49#ifndef G4String_hh
50#define G4String_hh 1
51
52#include "G4Types.hh"
53
54#include <algorithm>
55#include <cstdio>
56#include <cstring>
57#include <iostream>
58#include <string>
59#include <string_view>
60
61class G4String : public std::string
62{
63 public:
64 /// @brief
65 /// @deprecated Will be removed in future release
71
72 /// @brief
73 /// @deprecated Will be removed in future release
80
81 using std::string::string;
82 using std::string::operator=;
83
84 inline G4String() = default;
85 inline G4String(const std::string&);
86 inline G4String(const G4String&);
87 inline G4String(std::string&&);
88 inline G4String(G4String&&);
89 inline G4String& operator=(const G4String&);
91
92 /// @brief Implicitly convert to `const char*`
93 /// @deprecated Will be removed in future releases for `std::string` compliance
94 /// If passing `G4String` to functions requiring `const char*`, use `std::string::c_str`
95 /// to explicitly convert. `G4String` also implicitly converts to `std::string_view`
96 /// to match the `std::string` interface.
97 inline operator const char*() const;
98
99 /// @brief Override of subscript operator for `int` to suppress C2666 errors with MSVC
100 /// @deprecated Will be removed at the same time as `operator const char*` that requires it
101 ///
102 /// This override is required because of G4String's provision of an implicit conversion
103 /// operator to `const char*`. Together with the subscript operator and C++'s built-in
104 /// `operator[](const char*, int) operator, use of G4String::operator[] will trigger
105 /// [MSVC error C2666](https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2666?view=msvc-170)
106 /// This is a known issue with mixing implicit conversion to `const char*` and subscript
107 /// operators. Provision of the override with `int` argument is thus a workaround
108 /// until the conversion operator is removed.
109 inline reference operator[](int);
110
111 /// @overload
112 inline const_reference operator[](int) const;
113
114 /// @brief Deprecated function
115 /// @deprecated Use `std::string::compare` or `G4StrUtil::icompare` instead
116 [[deprecated("Use std::string::compare, or G4StrUtil::icompare for case-insensitive comparison")]]
117 inline G4int compareTo(std::string_view, caseCompare mode = exact) const;
118
119 /// @brief Deprecated function
120 /// @deprecated Use `std::getline` plus `G4StrUtil::lstrip` instead
121 [[deprecated("Use std::getline instead, plus G4StrUtil::lstrip if required")]]
122 inline std::istream& readLine(std::istream&, G4bool skipWhite = true);
123
124 /// @brief Deprecated function
125 /// @deprecated Use `std::string::erase` instead
126 [[deprecated("Use std::string::erase instead")]]
127 inline G4String& remove(size_type);
128
129 /// @brief Deprecated function
130 /// @deprecated Use `G4StrUtil::contains` instead
131 [[deprecated("Use G4StrUtil::contains instead")]]
132 inline G4bool contains(const std::string&) const;
133
134 /// @brief Deprecated function
135 /// @deprecated Use `G4StrUtil::contains` instead
136 [[deprecated("Use G4StrUtil::contains instead")]]
137 inline G4bool contains(char) const;
138
139 /// @brief Deprecated function
140 /// @deprecated Use `G4StrUtil` functions instead
141 [[deprecated("Use G4StrUtil::{lstrip,rstrip,strip}_copy instead")]]
142 [[nodiscard]] inline G4String strip(stripType strip_Type = trailing, char ch = ' ');
143
144 /// @brief Deprecated function
145 /// @deprecated Use `G4StrUtil` functions instead
146 [[deprecated("Use G4StrUtil::to_lower/to_lower_copy instead")]]
147 inline void toLower();
148
149 /// @brief Deprecated function
150 /// @deprecated Use `G4StrUtil` functions instead
151 [[deprecated("Use G4StrUtil::to_upper/to_upper_copy instead")]]
152 inline void toUpper();
153};
154
155/// @brief Query and manipulation functions for G4String
156//
157/// Additional free functions that are not part of the `std::string` interface as
158/// of the minimum C++ standard supported by Geant4 (currently C++17).
159///
160/// @see `G4String`
161namespace G4StrUtil
162{
163 /// @brief Convert string to lowercase
164 /// @param[in, out] str the string to lowercase
165 inline void to_lower(G4String& str);
166
167 /// @brief Return lowercased copy of string
168 /// @param[in] str the string to lowercase
169 /// @return lowercased copy of `str`
170 inline G4String to_lower_copy(G4String str);
171
172 /// @brief Convert string to uppercase
173 /// @param[in, out] str the string to uppercase
174 inline void to_upper(G4String& str);
175
176 /// @brief Return uppercase copy of string
177 /// @param[in] str the string to upper case
178 /// @return uppercased copy of `str`
179 inline G4String to_upper_copy(G4String str);
180
181 /// @brief Remove leading characters from string
182 /// @param[in,out] str string to strip
183 /// @param[in] ch character to remove
184 /// @post `str` has any leading sequence of `ch` removed
185 void lstrip(G4String& str, char ch = ' ');
186
187 /// @brief Remove trailing characters from string
188 /// @param[in,out] str string to strip
189 /// @param[in] ch character to remove
190 /// @post `str` has any trailing sequence of `ch` removed
191 void rstrip(G4String& str, char ch = ' ');
192
193 /// @brief Remove leading and trailing characters from string
194 /// @param[in,out] str string to strip
195 /// @param[in] ch character to remove
196 /// @post `str` has any leading and trailing sequence of `ch` removed
197 void strip(G4String& str, char ch = ' ');
198
199 /// @brief Return copy of string with leading characters removed
200 /// @param[in] str string to copy and strip
201 /// @param[in] ch character to remove
202 /// @return copy of `str` with any leading sequence of `ch` removed
203 G4String lstrip_copy(G4String str, char ch = ' ');
204
205 /// @brief Return copy of string with trailing characters removed
206 /// @param[in] str string to copy and strip
207 /// @param[in] ch character to remove
208 /// @return copy of `str` with any trailing sequence of `ch` removed
209 G4String rstrip_copy(G4String str, char ch = ' ');
210
211 /// @brief Return copy of string with leading and trailing characters removed
212 /// @param[in] str string to copy and strip
213 /// @param[in] ch character to remove
214 /// @return copy of `str` with any leading and trailing sequence of `ch` removed
215 G4String strip_copy(G4String str, char ch = ' ');
216
217 /// @brief Check if a string contains a given substring
218 /// @param[in] str string to be checked
219 /// @param[in] ss substring to check for
220 /// @retval true if `str` contains `ss`
221 /// @retval false otherwise
222 inline G4bool contains(const G4String& str, std::string_view ss);
223
224 /// @overload
225 inline G4bool contains(const G4String& str, char ss);
226
227 /// @overload
228 inline G4bool contains(const G4String& str, const char* ss);
229
230 /// @overload
231 /// @note this overload is required to resolve ambiguity between the
232 /// signatures taking `std::string_view` and `const char*` substring
233 /// arguments. G4String currently provides implicit conversion to
234 /// `const char*`, which makes the calls ambiguous due to `std::string`'s
235 /// implicit conversion to `std::string_view`
236 inline G4bool contains(const G4String& str, const G4String& ss);
237
238 /// @brief Case insensitive comparison of two strings
239 ///
240 /// Converts both input arguments to lower case and returns the
241 /// result of `std::string::compare` with these values.
242 ///
243 /// @param[in] lhs the first string in the comparison
244 /// @param[in] rhs the second string in the comparison
245 /// @return negative(positive) `G4int` if lowercased `lhs` appears
246 /// before(after) lowercased `rhs` in lexicographical order, zero if both
247 /// compare equivalent after lowercasing.
248 inline G4int icompare(std::string_view lhs, std::string_view rhs);
249
250 /// @brief Return true if a string starts with a given prefix
251 /// @param[in] str string to be checked
252 /// @param[in] ss prefix to check for
253 /// @retval true if `str` starts with `ss`
254 /// @retval false otherwise
255 inline bool starts_with(const G4String& str, std::string_view ss);
256
257 /// @overload
258 inline bool starts_with(const G4String& str, G4String::value_type ss);
259
260 /// @overload
261 inline bool starts_with(const G4String& str, const char* ss);
262
263 /// @overload
264 /// @note this overload is required to resolve ambiguity between the
265 /// signatures taking `std::string_view` and `const char*` substring
266 /// arguments. G4String currently provides implicit conversion to
267 /// `const char*`, which makes the calls ambiguous due to `std::string`'s
268 /// implicit conversion to `std::string_view`
269 inline bool starts_with(const G4String& str, const G4String& ss);
270
271 /// @brief Return true if a string ends with a given suffix
272 /// @param[in] str string to be checked
273 /// @param[in] ss suffix to check for
274 /// @retval true if `str` ends with `ss`
275 /// @retval false otherwise
276 inline bool ends_with(const G4String& str, std::string_view ss);
277
278 /// @overload
279 inline bool ends_with(const G4String& str, G4String::value_type ss);
280
281 /// @overload
282 inline bool ends_with(const G4String& str, const char* ss);
283
284 /// @overload
285 inline bool ends_with(const G4String& str, const G4String& ss);
286
287 /// @brief Remove specified in-range characters from string
288 ///
289 /// Equivalent to `std::string::erase(index, count)` with erasure only occuring
290 /// if `index <= size()`. When `index > size()` the string is left unmodified.
291 ///
292 /// @deprecated It is strongly recommended to use `std::string::erase` if the
293 /// start index is already checked, or otherwise known, to be in range. Otherwise,
294 /// implement the index-size comparison instead of using this function.
295 ///
296 /// @param[in,out] str string to erase characters from
297 /// @param[in] index position to start removal from
298 /// @param[in] count number of characters to remove
299 /// @post `str` is unchanged if `index > str.size()`, otherwise `str` has
300 /// `min(count, str.size() - index)` characters removed starting at `index`
301 inline void safe_erase(G4String& str, G4String::size_type index = 0,
302 G4String::size_type count = G4String::npos);
303
304 /// @brief Read characters into a G4String from an input stream until end-of-line
305 ///
306 /// @deprecated It is strongly recommended to use `std::getline` instead of this
307 /// function, plus `G4StrUtil::lstrip` if leading whitespace removal is required.
308 ///
309 /// @param[in] is input stream to read from
310 /// @param[in,out] str string to read into
311 /// @param[in] skipWhite if true, discard leading whitespace from `is`
312 /// @return `is`
313 inline std::istream& readline(std::istream& is, G4String& str, G4bool skipWhite = true);
314} // namespace G4StrUtil
315
316#include "G4String.icc"
317
318#endif
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
G4String(G4String &&)
std::istream & readline(std::istream &is, G4String &str, G4bool skipWhite=true)
Override of subscript operator for int to suppress C2666 errors with MSVC.
@ ignoreCase
Definition G4String.hh:69
G4String(std::string &&)
G4String & operator=(const G4String &)
G4String(const G4String &)
G4String(const std::string &)
G4String & operator=(G4String &&)
G4String()=default