17#ifndef TOOLBOX_UTIL_STRING_HPP
18#define TOOLBOX_UTIL_STRING_HPP
29inline namespace util {
31template <
typename ValueT>
35 return Traits::from_string(
sv);
39template <
typename ValueT>
43 return Traits::from_string(
s);
46template <
typename ValueT>
50 return Traits::from_string(std::string_view{
s});
54template <
typename ValueT>
62template <
typename ValueT>
68 return std::to_string(
val);
71template <std::
size_t SizeN>
85inline void trim(std::string_view&
s)
noexcept
91inline void trim(std::string&
s)
noexcept
97inline std::string_view
ltrim_copy(std::string_view
s)
noexcept
121inline std::string_view
trim_copy(std::string_view
s)
noexcept
133TOOLBOX_API std::pair<std::string_view, std::string_view>
137 std::string_view
delim);
140 char delim)
noexcept;
146 F f)
noexcept(
noexcept(
split_pair(std::declval<std::string_view>(),
','))
147 &&
noexcept(
f(std::declval<std::string_view>())))
159 [](std::string_view)
noexcept {})),
160 "for_each_csv_item is noexcept(true)");
161static_assert(!
noexcept(
for_each_csv_item(std::string_view{
"a,b"}, [](std::string_view) {})),
162 "for_each_csv_item is noexcept(false)");
170constexpr std::size_t
pstrlen(
const char*
src, std::size_t
n)
noexcept
172 if constexpr (
PadC ==
'\0') {
189template <
char PadC, std::
size_t SizeN>
204 if constexpr (
PadC ==
'\0') {
206#pragma GCC diagnostic push
207#pragma GCC diagnostic ignored "-Wstringop-truncation"
212#pragma GCC diagnostic pop
216 for (;
i <
n &&
src[
i] !=
'\0'; ++
i) {
232template <
char PadC, std::
size_t SizeN>
245constexpr std::size_t
pstrcpy(
char*
dst, std::string_view
src, std::size_t
n)
noexcept
247 const std::size_t
len{std::min(
n,
src.size())};
263template <
char PadC, std::
size_t SizeN>
270constexpr std::size_t
pstrcpyid(
char*
dst, std::int64_t
id, std::size_t
n)
noexcept
273 const auto [
eptr,
ec] = std::to_chars(
dst, end,
id);
274 if (
ec == std::errc::value_too_large) {
283template <
char PadC, std::
size_t SizeN>
309template <
char PadC, std::
size_t SizeN>
340template <
char PadC, std::
size_t SizeN>
353constexpr std::size_t
lpstrcpy(
char*
dst, std::string_view
src, std::size_t
n)
noexcept
355 const std::size_t
len{std::min(
n,
src.size())};
371template <
char PadC, std::
size_t SizeN>
377template <
typename...
ArgsT>
380 std::stringstream os;