Mantid
Loading...
Searching...
No Matches
Strings.h
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2007 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#pragma once
8
9//----------------------------------------------------------------------
10// Includes
11//----------------------------------------------------------------------
12#include "MantidKernel/DllConfig.h"
15
16#ifndef Q_MOC_RUN
17#include <boost/lexical_cast.hpp>
18#endif
19#include <algorithm>
20#include <cstddef>
21#include <iosfwd>
22#include <map>
23#include <set>
24#include <sstream>
25#include <string>
26#include <vector>
27
28namespace Mantid {
29namespace Kernel {
30
34namespace Strings {
35
36//------------------------------------------------------------------------------------------------
53template <typename ITERATOR_TYPE>
54std::string simpleJoin(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator) {
55 std::ostringstream output;
56 ITERATOR_TYPE it;
57 for (it = begin; it != end;) {
58 output << *it;
59 it++;
60 if (it != end)
61 output << separator;
62 }
63 return output.str();
64}
65
66//------------------------------------------------------------------------------------------------
83template <typename ITERATOR_TYPE>
84std::string join(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator,
85 typename std::enable_if<!(std::is_same<typename std::iterator_traits<ITERATOR_TYPE>::iterator_category,
86 std::random_access_iterator_tag>::value)>::type * = nullptr) {
87 return simpleJoin(begin, end, separator);
88}
89
90//------------------------------------------------------------------------------------------------
109template <typename ITERATOR_TYPE>
110std::string join(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator,
111 typename std::enable_if<(std::is_same<typename std::iterator_traits<ITERATOR_TYPE>::iterator_category,
112 std::random_access_iterator_tag>::value)>::type * = nullptr) {
113
114 // Get max number of threads
115 int nmaxThreads = static_cast<int>(PARALLEL_GET_MAX_THREADS);
116
117 // Define minimum size for using threading
118 int min_size = 500 * nmaxThreads;
119
120 // Get the distance between begining and end
121 int dist = static_cast<int>(std::distance(begin, end));
122
123 if (dist < min_size) {
124
125 // If the input array is small, use the simpler function to avoid
126 // unnecessary overhead from generating the parallel section
127 return simpleJoin(begin, end, separator);
128
129 } else {
130
131 // Allocate vector space
132 std::vector<std::string> output(nmaxThreads);
133 size_t stream_size = 0;
134
135 // Actual number of threads in the current region
136 int nThreads = 1;
137#pragma omp parallel reduction(+ : stream_size)
138 {
139 nThreads = static_cast<int>(PARALLEL_NUMBER_OF_THREADS);
140 int idThread = static_cast<int>(PARALLEL_THREAD_NUMBER);
141
142 // Initialise ostringstream
143 std::ostringstream thread_stream;
144
145/* To make sure the loop is done in the right order, we use schedule(static).
146
147 From the OpenMP documentation:
148 "When schedule(static, chunk_size) is specified, iterations are divided into
149 chunks of size chunk_size, and the chunks are assigned to the threads in the
150 team in a round-robin fashion **in the order of the thread number**."
151
152 "When no chunk_size is specified, the iteration space is divided into chunks
153 that are approximately equal in size, and at most one chunk is distributed
154 to each thread."
155*/
156#pragma omp for schedule(static)
157 for (int i = 0; i < dist; i++) {
158 thread_stream << separator << *(begin + i);
159 }
160 output[idThread] = thread_stream.str();
161 stream_size += output[idThread].length();
162 }
163
164 // Reserve space in memory for output string
165 std::string master_string = output[0].erase(0, separator.length());
166 master_string.reserve(stream_size - separator.length());
167
168 // Concatenate the contributions from the remaning threads
169 // cppcheck-suppress knownConditionTrueFalse
170 for (int i = 1; i < nThreads; i++) {
171 master_string += output[i];
172 }
173
174 return master_string;
175 }
176}
177
178//------------------------------------------------------------------------------------------------
195template <typename ITERATOR_TYPE>
196std::string joinCompress(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator = ",",
197 const std::string &listSeparator = "-") {
198
199 if (begin == end) {
200 return "";
201 }
202 std::stringstream result;
203
204 ITERATOR_TYPE i = begin;
205 // Always include the first value
206 result << *begin;
207 // move on to the next value
208 ITERATOR_TYPE previousValue = i;
209 ++i;
210
211 std::string currentSeparator = separator;
212 for (; i != end; ++i) {
213 // if it is one higher than the last value
214 if (*i == (*previousValue + 1)) {
215 currentSeparator = listSeparator;
216 } else {
217 if (currentSeparator == listSeparator) {
218 // add the last value that was the end of the list
219 result << currentSeparator;
220 result << *previousValue;
221 currentSeparator = separator;
222 }
223 // add the current value
224 result << currentSeparator;
225 result << *i;
226 }
227 previousValue = i;
228 }
229 // if we have got to the end and part of a list output the last value
230 if (currentSeparator == listSeparator) {
231 result << currentSeparator;
232 result << *previousValue;
233 }
234 return result.str();
235}
237MANTID_KERNEL_DLL std::string shorten(const std::string &input, const size_t max_length);
238
240MANTID_KERNEL_DLL std::string replace(const std::string &input, const std::string &find_what,
241 const std::string &replace_with);
242
244MANTID_KERNEL_DLL std::string replaceAll(std::string const &input, char const to_replace, char const substitute);
245
248MANTID_KERNEL_DLL std::string replaceAll(const std::string &input, const std::string &charStr,
249 const std::string &substitute);
250
252MANTID_KERNEL_DLL std::string toLower(const std::string &input);
253
255MANTID_KERNEL_DLL std::string toUpper(const std::string &input);
256
258MANTID_KERNEL_DLL bool endsWith(std::string const &str, std::string const &suffix);
259
261MANTID_KERNEL_DLL int confirmStr(const std::string &S, const std::string &fullPhrase);
263MANTID_KERNEL_DLL int extractWord(std::string &Line, const std::string &Word, const int cnt = 4);
265MANTID_KERNEL_DLL int endsWithInt(const std::string &word);
266
268MANTID_KERNEL_DLL std::string removeSpace(const std::string &CLine);
270MANTID_KERNEL_DLL std::string fullBlock(const std::string &A);
272MANTID_KERNEL_DLL std::string strip(const std::string &A);
274MANTID_KERNEL_DLL void stripInPlace(std::string &A);
276MANTID_KERNEL_DLL void stripComment(std::string &A);
278MANTID_KERNEL_DLL int isEmpty(const std::string &A);
280MANTID_KERNEL_DLL bool skipLine(const std::string &line);
283MANTID_KERNEL_DLL std::string getLine(std::istream &fh);
286MANTID_KERNEL_DLL void getLine(std::istream &fh, std::string &Line);
288MANTID_KERNEL_DLL std::string peekLine(std::istream &fh);
290MANTID_KERNEL_DLL int getPartLine(std::istream &fh, std::string &Out, std::string &Excess, const int spc = 256);
291
293template <typename T> int convPartNum(const std::string &A, T &out);
294
296template <typename T> int convert(const std::string &A, T &out);
298template <typename T> int convert(const char *A, T &out);
299
301template <typename T> std::string toString(const T &value);
302
304template <typename T> std::string toString(const std::vector<T> &value);
305
307template <typename T> std::string toString(const std::set<T> &value);
308
309template <typename T> int setValues(const std::string &Line, const std::vector<int> &Index, std::vector<T> &Out);
310
312template <typename T> int sectPartNum(std::string &A, T &out);
313
315template <typename T> int section(std::string &A, T &out);
317template <typename T> int section(char *cA, T &out);
318
320template <typename T> int sectionMCNPX(std::string &A, T &out);
321
323MANTID_KERNEL_DLL void writeMCNPX(const std::string &Line, std::ostream &OX);
324
326MANTID_KERNEL_DLL std::vector<std::string> StrParts(const std::string &Ln);
327
329MANTID_KERNEL_DLL std::map<std::string, std::string>
330splitToKeyValues(const std::string &input, const std::string &keyValSep = "=", const std::string &listSep = ",");
331
333template <template <typename T, typename A> class V, typename T, typename A>
334int writeFile(const std::string &Fname, const T &step, const V<T, A> &Y);
335template <template <typename T, typename A> class V, typename T, typename A>
336int writeFile(const std::string &Fname, const V<T, A> &X, const V<T, A> &Y);
337template <template <typename T, typename A> class V, typename T, typename A>
338int writeFile(const std::string &Fname, const V<T, A> &X, const V<T, A> &Y, const V<T, A> &Err);
339
341float getVAXnum(const float A);
342
344MANTID_KERNEL_DLL void readToEndOfLine(std::istream &in, bool ConsumeEOL);
346MANTID_KERNEL_DLL std::string getWord(std::istream &in, bool consumeEOL);
349MANTID_KERNEL_DLL size_t split_path(const std::string &path, std::vector<std::string> &path_components);
350
352MANTID_KERNEL_DLL std::string loadFile(const std::string &filename);
353
355MANTID_KERNEL_DLL int isMember(const std::vector<std::string> &group, const std::string &candidate);
356
359MANTID_KERNEL_DLL std::vector<int> parseRange(const std::string &str, const std::string &elemSep = ",",
360 const std::string &rangeSep = "-");
361
364template <typename Integer> std::vector<std::vector<Integer>> parseGroups(const std::string &str) {
365 std::vector<std::vector<Integer>> groups;
366
367 // Local helper functions.
368 auto translateAdd = [&groups](const std::string &str) {
369 const auto tokens = Kernel::StringTokenizer(
371 std::vector<Integer> currentGroup;
372 currentGroup.reserve(tokens.count());
373 std::transform(tokens.cbegin(), tokens.cend(), std::back_inserter(currentGroup),
374 [](const auto &t) { return boost::lexical_cast<Integer>(t); });
375 groups.emplace_back(std::move(currentGroup));
376 };
377
378 auto translateSumRange = [&groups](const std::string &str) {
379 // add a group with the numbers in the range
380 const auto tokens = Kernel::StringTokenizer(
382 if (tokens.count() != 2)
383 throw std::runtime_error("Malformed range (-) operation.");
384 Integer first = boost::lexical_cast<Integer>(tokens[0]);
385 Integer last = boost::lexical_cast<Integer>(tokens[1]);
386 if (first > last)
387 std::swap(first, last);
388 // add all the numbers in the range to the output group
389 std::vector<Integer> group;
390 group.reserve(last - first + 1);
391 for (Integer i = first; i <= last; ++i)
392 group.emplace_back(i);
393 if (!group.empty())
394 groups.emplace_back(std::move(group));
395 };
396
397 auto translateRange = [&groups](const std::string &str) {
398 // add a group per number
399 const auto tokens = Kernel::StringTokenizer(
401 if (tokens.count() != 2)
402 throw std::runtime_error("Malformed range (:) operation.");
403 Integer first = boost::lexical_cast<Integer>(tokens[0]);
404 Integer last = boost::lexical_cast<Integer>(tokens[1]);
405 if (first > last)
406 std::swap(first, last);
407 // add all the numbers in the range to separate output groups
408 for (Integer i = first; i <= last; ++i) {
409 groups.emplace_back(1, i);
410 }
411 };
412
413 try {
414 // split into comma separated groups, each group potentially containing
415 // an operation (+-:) that produces even more groups.
417 for (const auto &token : tokens) {
418 // Look for the various operators in the string. If one is found then
419 // do the necessary translation into groupings.
420 if (token.find('+') != std::string::npos) {
421 translateAdd(token);
422 } else if (token.find('-') != std::string::npos) {
423 translateSumRange(token);
424 } else if (token.find(':') != std::string::npos) {
425 translateRange(token);
426 } else if (!token.empty()) {
427 // contains a single number, just add it as a new group
428 groups.emplace_back(1, boost::lexical_cast<Integer>(token));
429 }
430 }
431 } catch (boost::bad_lexical_cast &) {
432 throw std::runtime_error("Cannot parse numbers from string: '" + str + "'");
433 }
434
435 return groups;
436}
437
443MANTID_KERNEL_DLL std::string randomString(const size_t len);
444
446MANTID_KERNEL_DLL std::istream &extractToEOL(std::istream &is, std::string &str);
447
455MANTID_KERNEL_DLL std::string strmakef(char const *const fmt, ...);
456
457} // NAMESPACE Strings
458
459} // NAMESPACE Kernel
460
461} // NAMESPACE Mantid
double value
The value of the point.
Definition FitMW.cpp:51
#define PARALLEL_THREAD_NUMBER
#define PARALLEL_NUMBER_OF_THREADS
#define PARALLEL_GET_MAX_THREADS
Impliments a line.
Definition Line.h:43
@ TOK_IGNORE_EMPTY
ignore empty tokens
@ TOK_TRIM
remove leading and trailing whitespace from tokens
Holds support functions for strings.
MANTID_KERNEL_DLL void stripInPlace(std::string &A)
strip pre/post spaces
Definition Strings.cpp:430
MANTID_KERNEL_DLL std::string removeSpace(const std::string &CLine)
strip all spaces
Definition Strings.cpp:323
MANTID_KERNEL_DLL std::string toLower(const std::string &input)
Converts string to all lowercase.
Definition Strings.cpp:130
MANTID_KERNEL_DLL std::istream & extractToEOL(std::istream &is, std::string &str)
Extract a line from input stream, discarding any EOL characters encountered.
Definition Strings.cpp:1163
int sectPartNum(std::string &A, T &out)
Convert and cut a string.
Definition Strings.cpp:559
MANTID_KERNEL_DLL size_t split_path(const std::string &path, std::vector< std::string > &path_components)
function parses a path, found in input string "path" and returns vector of the folders contributed in...
Definition Strings.cpp:1002
MANTID_KERNEL_DLL int confirmStr(const std::string &S, const std::string &fullPhrase)
determine if a character group exists in a string
Definition Strings.cpp:262
float getVAXnum(const float A)
Convert a VAX number to x86 little eindien.
Definition Strings.cpp:523
MANTID_KERNEL_DLL std::vector< int > parseRange(const std::string &str, const std::string &elemSep=",", const std::string &rangeSep="-")
Parses a number range, e.g.
Definition Strings.cpp:1097
MANTID_KERNEL_DLL std::string shorten(const std::string &input, const size_t max_length)
Converts long strings into "start ... end".
Definition Strings.cpp:53
int convPartNum(const std::string &A, T &out)
Takes a character string and evaluates the first [typename T] object.
Definition Strings.cpp:671
MANTID_KERNEL_DLL int isMember(const std::vector< std::string > &group, const std::string &candidate)
checks if the candidate is the member of the group
Definition Strings.cpp:1078
MANTID_KERNEL_DLL std::string replace(const std::string &input, const std::string &find_what, const std::string &replace_with)
Return a string with all matching occurence-strings.
Definition Strings.cpp:73
int section(std::string &A, T &out)
Convert and cut a string.
Definition Strings.cpp:605
MANTID_KERNEL_DLL std::string peekLine(std::istream &fh)
Peek at a line without extracting it from the stream.
Definition Strings.cpp:367
std::vector< std::vector< Integer > > parseGroups(const std::string &str)
Parses unsigned integer groups, e.g.
Definition Strings.h:364
MANTID_KERNEL_DLL std::string replaceAll(std::string const &input, char const to_replace, char const substitute)
Return a string with all occurrences of indicated character replaced by the new character.
Definition Strings.cpp:91
std::string joinCompress(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator=",", const std::string &listSeparator="-")
Join a set or vector of (something that turns into a string) together into one string,...
Definition Strings.h:196
MANTID_KERNEL_DLL std::string fullBlock(const std::string &A)
strip pre/post spaces
Definition Strings.cpp:412
MANTID_KERNEL_DLL bool skipLine(const std::string &line)
Determines if a string starts with a #.
Definition Strings.cpp:440
int sectionMCNPX(std::string &A, T &out)
Convert and cut a string for MCNPX.
Definition Strings.cpp:635
MANTID_KERNEL_DLL std::string loadFile(const std::string &filename)
Loads the entire contents of a text file into a string.
Definition Strings.cpp:27
MANTID_KERNEL_DLL std::vector< std::string > StrParts(std::string, const boost::regex &)
Split a line into component parts.
MANTID_KERNEL_DLL std::string toUpper(const std::string &input)
Converts string to all uppercase.
Definition Strings.cpp:138
MANTID_KERNEL_DLL bool endsWith(std::string const &str, std::string const &suffix)
Checks if string ends with a suffix.
Definition Strings.cpp:146
MANTID_KERNEL_DLL int endsWithInt(const std::string &word)
Get an int from the end of a word.
Definition Strings.cpp:233
MANTID_KERNEL_DLL void writeMCNPX(const std::string &Line, std::ostream &OX)
Write file in standard MCNPX input form.
Definition Strings.cpp:453
MANTID_KERNEL_DLL std::string getLine(std::istream &fh)
Get a line and strip comments Use only for a single call.
Definition Strings.cpp:342
std::string join(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator, typename std::enable_if<!(std::is_same< typename std::iterator_traits< ITERATOR_TYPE >::iterator_category, std::random_access_iterator_tag >::value)>::type *=nullptr)
Join a set or vector of (something that turns into a string) together into one string,...
Definition Strings.h:84
MANTID_KERNEL_DLL void stripComment(std::string &A)
strip trailling comments
Definition Strings.cpp:393
std::string simpleJoin(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator)
Join a set or vector of (something that turns into a string) together into one string,...
Definition Strings.h:54
MANTID_KERNEL_DLL int extractWord(std::string &Line, const std::string &Word, const int cnt=4)
Get a word from a string.
Definition Strings.cpp:209
MANTID_KERNEL_DLL std::map< std::string, std::string > splitToKeyValues(const std::string &input, const std::string &keyValSep="=", const std::string &listSep=",")
Splits a string into key value pairs.
Definition Strings.cpp:501
int setValues(const std::string &Line, const std::vector< int > &Index, std::vector< T > &Out)
Call to read in various values in position x1,x2,x3 from the line.
Definition Strings.cpp:876
MANTID_KERNEL_DLL int isEmpty(const std::string &A)
Determines if a string is only spaces.
Definition Strings.cpp:382
int writeFile(const std::string &Fname, const T &step, const V< T, A > &Y)
Write a set of containers to a file.
Definition Strings.cpp:795
MANTID_KERNEL_DLL int getPartLine(std::istream &fh, std::string &Out, std::string &Excess, const int spc=256)
get a part of a long line
Definition Strings.cpp:285
std::string toString(const T &value)
Convert values to strings.
Helper class which provides the Collimation Length for SANS instruments.