17#ifndef TOOLBOX_UTIL_STRING_HPP
18#define TOOLBOX_UTIL_STRING_HPP
30inline namespace util {
32template <
typename ValueT>
36 return Traits::from_string(
sv);
40template <
typename ValueT>
44 return Traits::from_string(
s);
47template <
typename ValueT>
51 return Traits::from_string(std::string_view{
s});
55template <
typename ValueT>
63template <
typename ValueT>
69 return std::to_string(
val);
72template <
typename PolicyT>
78 return std::to_string(
val.count());
81template <std::
size_t SizeN>
95inline void trim(std::string_view&
s)
noexcept
101inline void trim(std::string&
s)
noexcept
131inline std::string_view
trim_copy(std::string_view
s)
noexcept
143TOOLBOX_API std::pair<std::string_view, std::string_view>
147 std::string_view
delim);
150 char delim)
noexcept;
156 F f)
noexcept(
noexcept(
split_pair(std::declval<std::string_view>(),
','))
157 &&
noexcept(
f(std::declval<std::string_view>())))
169 [](std::string_view)
noexcept {})),
170 "for_each_csv_item is noexcept(true)");
171static_assert(!
noexcept(
for_each_csv_item(std::string_view{
"a,b"}, [](std::string_view) {})),
172 "for_each_csv_item is noexcept(false)");
180constexpr std::size_t
pstrlen(
const char*
src, std::size_t
n)
noexcept
182 if constexpr (
PadC ==
'\0') {
199template <
char PadC, std::
size_t SizeN>
214 if constexpr (
PadC ==
'\0') {
216#pragma GCC diagnostic push
217#pragma GCC diagnostic ignored "-Wstringop-truncation"
222#pragma GCC diagnostic pop
226 for (;
i <
n &&
src[
i] !=
'\0'; ++
i) {
242template <
char PadC, std::
size_t SizeN>
255constexpr std::size_t
pstrcpy(
char*
dst, std::string_view
src, std::size_t
n)
noexcept
257 const std::size_t
len{std::min(
n,
src.size())};
273template <
char PadC, std::
size_t SizeN>
280constexpr std::size_t
pstrcpyid(
char*
dst, std::int64_t
id, std::size_t
n)
noexcept
283 const auto [
eptr,
ec] = std::to_chars(
dst, end,
id);
284 if (
ec == std::errc::value_too_large) {
293template <
char PadC, std::
size_t SizeN>
319template <
char PadC, std::
size_t SizeN>
350template <
char PadC, std::
size_t SizeN>
363constexpr std::size_t
lpstrcpy(
char*
dst, std::string_view
src, std::size_t
n)
noexcept
365 const std::size_t
len{std::min(
n,
src.size())};
381template <
char PadC, std::
size_t SizeN>
387template <
typename...
ArgsT>
390 std::stringstream os;