diff --git a/source/mijin/util/string.hpp b/source/mijin/util/string.hpp index 680cb0a..df7646f 100644 --- a/source/mijin/util/string.hpp +++ b/source/mijin/util/string.hpp @@ -5,8 +5,11 @@ #define MIJIN_UTIL_STRING_HPP_INCLUDED 1 #include +#include #include #include +#include +#include #include "./iterators.hpp" @@ -49,8 +52,19 @@ template return oss.str(); } +namespace detail +{ +template +std::vector> splitImpl(std::basic_string_view stringView, + std::basic_string_view seperator) +{ + return std::views::split(stringView, seperator) + | std::views::transform([](auto val) { return std::string_view(val); }) + | std::ranges::to(); +} + template -[[nodiscard]] bool equalsIgnoreCase(std::basic_string_view stringA, std::basic_string_view stringB) noexcept +bool equalsIgnoreCaseImpl(std::basic_string_view stringA, std::basic_string_view stringB) noexcept { if (stringA.size() != stringB.size()) { @@ -68,6 +82,45 @@ template return true; } +template +static const TChar SPACE = TChar(' '); +} + +template +[[nodiscard]] auto split(TLeft&& left, TRight&& right) +{ + return detail::splitImpl(std::basic_string_view(std::forward(left)), std::basic_string_view(std::forward(right))); +} + +template +std::basic_string_view trimPrefix(std::basic_string_view stringView, + std::basic_string_view charsToTrim = {&detail::SPACE, &detail::SPACE + 1}) +{ + stringView.remove_prefix(std::min(stringView.find_first_not_of(charsToTrim), stringView.size())); + return stringView; +} + +template +std::basic_string_view trimSuffix(std::basic_string_view stringView, + std::basic_string_view charsToTrim = {&detail::SPACE, &detail::SPACE + 1}) +{ + stringView.remove_suffix(stringView.size() - std::min(stringView.find_last_not_of(charsToTrim) + 1, stringView.size())); + return stringView; +} + +template +std::basic_string_view trim(std::basic_string_view stringView, + std::basic_string_view charsToTrim = {&detail::SPACE, &detail::SPACE + 1}) +{ + return trimPrefix(trimSuffix(stringView, charsToTrim), charsToTrim); +} + +template +[[nodiscard]] bool equalsIgnoreCase(TLeft&& left, TRight&& right) noexcept +{ + return detail::equalsIgnoreCaseImpl(std::string_view(left), std::string_view(right)); +} + namespace pipe { struct Join