22 std::istringstream str_stream(str);
23 std::vector<std::string> items;
24 std::copy(std::istream_iterator<std::string>(str_stream),
25 std::istream_iterator<std::string>(),
26 std::back_inserter(items));
50void trim(std::string& str,
char ch)
52 std::string::size_type pos = str.find_last_not_of(ch);
53 if (pos != std::string::npos)
56 pos = str.find_first_not_of(ch);
57 if (pos != std::string::npos)
64 str.erase(str.begin(), str.end());
77std::string
format(
const char* format_str, ...)
80 va_start(args, format_str);
83 va_copy(args_tmp, args);
84 int char_length = std::vsnprintf(
nullptr, 0, format_str, args_tmp);
87 std::vector<char> buffer(char_length + 1);
88 vsnprintf(buffer.data(), buffer.size(), format_str, args);
91 return std::string(buffer.data());
96 static constexpr char charset[] =
97 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
99 static const auto seed =
static_cast<std::mt19937::result_type
>(
100 std::chrono::system_clock::now().time_since_epoch().count());
101 static std::mt19937 generator{seed};
102 static std::uniform_int_distribution<unsigned short> distribution(
103 0,
sizeof(charset) - 2);
105 std::string s(length, 0);
106 std::generate_n(begin(s), length,
107 [&]() {
return charset[distribution(generator)]; });
113 std::string
const& input_name)
115 std::string result_name = input_name;
116 std::size_t count = 1;
117 while (std::find(existing_names.cbegin(),
118 existing_names.cend(),
119 result_name) != existing_names.end())
122 result_name = input_name +
"-" + std::to_string(count);
129 auto const [ptr, ec] =
130 std::from_chars(str.data(), str.data() + str.size(), result);
132 if (ec == std::errc::invalid_argument)
134 return std::unexpected(
135 fmt::format(
"Could not parse '{}' to a valid integer.", str));
137 if (ec == std::errc::result_out_of_range)
139 return std::unexpected(fmt::format(
140 "Could not parse '{}'. The integer value exceeds the permitted "
145 std::size_t
const chars_consumed = std::distance(str.data(), ptr);
146 if (chars_consumed != str.size())
148 auto const non_ws_it = std::find_if_not(
149 str.begin() + chars_consumed, str.end(),
150 [](
unsigned char const c) { return std::isspace(c); });
151 if (non_ws_it != str.end())
153 return std::unexpected(fmt::format(
154 "Could not parse '{}'. Invalid character: '{}' at position {}.",
155 str, *non_ws_it, std::distance(str.begin(), non_ws_it)));