#pragma once #include #include #include template struct default_trim_arg { }; template<> struct default_trim_arg { static inline constexpr std::string_view value = " \t\r\n"; }; template<> struct default_trim_arg { static inline constexpr std::wstring_view value = L" \t\r\n"; }; template inline std::basic_string_view left_trim(std::basic_string_view s, const std::basic_string_view chars_to_trim = default_trim_arg::value) { s.remove_prefix(std::min(s.find_first_not_of(chars_to_trim), size(s))); return s; } template inline std::basic_string_view right_trim(std::basic_string_view s, const std::basic_string_view chars_to_trim = default_trim_arg::value) { s.remove_suffix(std::min(size(s) - s.find_last_not_of(chars_to_trim) - 1, size(s))); return s; } template inline std::basic_string_view trim(std::basic_string_view s, const std::basic_string_view chars_to_trim = default_trim_arg::value) { return left_trim(right_trim(s, chars_to_trim), chars_to_trim); } template inline void replace_chars(std::basic_string& s, const std::basic_string_view chars_to_replace, const CharT replacement_char) { for (const CharT c : chars_to_replace) { std::replace(begin(s), end(s), c, replacement_char); } }