38#ifndef STRING_VIEW_UTILS_183e2da27fe9
39#define STRING_VIEW_UTILS_183e2da27fe9
66std::string_view
tokenize(std::string_view& str,
char delim,
char quot =
'\0');
68inline bool sv_contains(std::string_view haystack, std::string_view needle){
69 return haystack.find(needle) != std::string_view::npos;
72inline bool sv_is_prefix(std::string_view haystack, std::string_view needle){
73 return haystack.compare(0, needle.length(), needle) == 0;
78 while(i < sv.size() && isspace(sv[i])) i++;
85 while(i > 0 && isspace(sv[i - 1])) i--;
87 return sv.substr(0, i);
102#if __has_include(<charconv>)
105template<
typename T,
typename =
void>
106struct from_chars_available : std::false_type { };
109struct from_chars_available<T,
110 std::void_t<decltype(std::from_chars(std::declval<const char *>(), std::declval<const char *>(), std::declval<T&>()))>>
111 : std::true_type { };
116template<
typename T, std::enable_if_t<from_
chars_available_v<T>,
bool> = true,
117 std::enable_if_t<!std::is_
floating_po
int_v<T>,
bool> = true>
118bool parse_num(std::string_view sv, T& res,
int base = 10){
119 return !sv.empty() && std::from_chars(sv.begin(), sv.end(), res, base).ec == std::errc();
122template<
typename T, std::enable_if_t<from_
chars_available_v<T>,
bool> = true,
123 std::enable_if_t<std::is_
floating_po
int_v<T>,
bool> = true>
124bool parse_num(std::string_view sv, T& res){
125 return !sv.empty() && std::from_chars(sv.begin(), sv.end(), res).ec == std::errc();
135template<
typename T,
auto convert,
typename... Args>
141 const char *c_str_ptr = tmp.c_str();
142 char *endptr =
nullptr;
145 num =
convert(c_str_ptr, &endptr, args...);
147 if(c_str_ptr == endptr)
155 std::enable_if_t<!from_chars_available_v<T>,
bool> =
true,
156 std::enable_if_t<std::is_integral_v<T>,
bool> =
true>
157bool parse_num(std::string_view sv, T& res,
int base = 10){
162 std::enable_if_t<!from_chars_available_v<T>,
bool> =
true,
163 std::enable_if_t<std::is_same_v<T, double>,
bool> =
true>
169 std::enable_if_t<!from_chars_available_v<T>,
bool> =
true,
170 std::enable_if_t<std::is_same_v<T, float>,
bool> =
true>
171bool parse_num(std::string_view sv, T& res){
bool parse_num_fallback_impl(std::string_view sv, T &res, Args... args)
std::string_view sv_trim_whitespace(std::string_view sv)
bool sv_contains(std::string_view haystack, std::string_view needle)
std::string_view tokenize(std::string_view &str, char delim, char quot='\0')
Tokenizer for string_view.
bool parse_num(std::string_view sv, T &res, int base=10)
constexpr bool from_chars_available_v
bool sv_is_prefix(std::string_view haystack, std::string_view needle)
std::string_view sv_trim_whitespace_back(std::string_view sv)
std::string_view sv_trim_whitespace_front(std::string_view sv)