OGS
StringTools.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "StringTools.h"
5
6#include <algorithm>
7#include <boost/algorithm/string/replace.hpp>
8#include <chrono>
9#include <cstdarg>
10#include <cstdio>
11#include <iterator>
12#include <random>
13
14#include "Error.h"
15
16namespace BaseLib
17{
18std::vector<std::string> splitString(std::string const& str)
19{
20 std::istringstream str_stream(str);
21 std::vector<std::string> items;
22 std::copy(std::istream_iterator<std::string>(str_stream),
23 std::istream_iterator<std::string>(),
24 std::back_inserter(items));
25 return items;
26}
27
28std::list<std::string> splitString(const std::string& str, char delim)
29{
30 std::list<std::string> strList;
31 std::stringstream ss(str);
32 std::string item;
33 while (std::getline(ss, item, delim))
34 {
35 strList.push_back(item);
36 }
37 return strList;
38}
39
40std::string replaceString(const std::string& searchString,
41 const std::string& replaceString,
42 std::string stringToReplace)
43{
44 boost::replace_all(stringToReplace, searchString, replaceString);
45 return stringToReplace;
46}
47
48void trim(std::string& str, char ch)
49{
50 std::string::size_type pos = str.find_last_not_of(ch);
51 if (pos != std::string::npos)
52 {
53 str.erase(pos + 1);
54 pos = str.find_first_not_of(ch);
55 if (pos != std::string::npos)
56 {
57 str.erase(0, pos);
58 }
59 }
60 else
61 {
62 str.erase(str.begin(), str.end());
63 }
64}
65
66void simplify(std::string& str)
67{
68 trim(str);
69 str.erase(std::unique(str.begin(),
70 str.end(),
71 [](char a, char b) { return a == ' ' && b == ' '; }),
72 str.end());
73}
74
75std::string format(const char* format_str, ...)
76{
77 va_list args;
78 va_start(args, format_str);
79 // get the number of chars to write
80 va_list args_tmp;
81 va_copy(args_tmp, args);
82 int char_length = std::vsnprintf(nullptr, 0, format_str, args_tmp);
83 va_end(args_tmp);
84 // allocate buffer and store formatted output there
85 std::vector<char> buffer(char_length + 1); // note +1 for null terminator
86 vsnprintf(buffer.data(), buffer.size(), format_str, args);
87 va_end(args);
88
89 return std::string(buffer.data());
90}
91
92std::string randomString(std::size_t const length)
93{
94 static constexpr char charset[] =
95 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
96
97 static const auto seed = static_cast<std::mt19937::result_type>(
98 std::chrono::system_clock::now().time_since_epoch().count());
99 static std::mt19937 generator{seed};
100 static std::uniform_int_distribution<unsigned short> distribution(
101 0, sizeof(charset) - 2);
102
103 std::string s(length, 0);
104 std::generate_n(begin(s), length,
105 [&]() { return charset[distribution(generator)]; });
106
107 return s;
108}
109
110std::string getUniqueName(std::vector<std::string> const& existing_names,
111 std::string const& input_name)
112{
113 std::string result_name = input_name;
114 std::size_t count = 1;
115 while (std::find(existing_names.cbegin(),
116 existing_names.cend(),
117 result_name) != existing_names.end())
118 {
119 count++;
120 result_name = input_name + "-" + std::to_string(count);
121 }
122 return result_name;
123}
124} // end namespace BaseLib
void simplify(std::string &str)
std::string randomString(std::size_t const length)
Returns a random string of the given length containing just a-z,A-Z,0-9.
std::string getUniqueName(std::vector< std::string > const &existing_names, std::string const &input_name)
Append '-' and a number such that the name is unique.
std::string replaceString(const std::string &searchString, const std::string &replaceString, std::string stringToReplace)
void trim(std::string &str, char ch)
std::string format(const char *format_str,...)
std::vector< std::string > splitString(std::string const &str)