From f6776d233d0ab2e8648fd9a95b5d328fa2cff15f Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Thu, 27 Mar 2025 12:18:52 +0100 Subject: [PATCH] Added startsWithIgnoreCase() and endsWithIgnoreCase() functions. --- source/mijin/util/string.hpp | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/source/mijin/util/string.hpp b/source/mijin/util/string.hpp index 5dab3cf..8a3704b 100644 --- a/source/mijin/util/string.hpp +++ b/source/mijin/util/string.hpp @@ -387,13 +387,36 @@ constexpr bool isHexadecimalChar(TChar chr) noexcept || (chr >= TChar('a') && chr <= TChar('f')); } +template +bool compareIgnoreCase(TChar left, TChar right) MIJIN_NOEXCEPT +{ + return std::tolower(left) == std::tolower(right); +} + [[nodiscard]] inline auto findIgnoreCase(std::string_view haystack, std::string_view needle) { - return std::ranges::search(haystack, needle, [](char left, char right) + return std::ranges::search(haystack, needle, &compareIgnoreCase); +} + +[[nodiscard]] +inline bool startsWithIgnoreCase(std::string_view string, std::string_view part) +{ + if (part.size() > part.size()) { - return std::tolower(left) == std::tolower(right); - }); + return false; + } + return std::ranges::equal(string.substr(0, part.size()), part, &compareIgnoreCase); +} + +[[nodiscard]] +inline bool endsWithIgnoreCase(std::string_view string, std::string_view part) +{ + if (part.size() > part.size()) + { + return false; + } + return std::ranges::equal(string.substr(string.size() - part.size()), part, &compareIgnoreCase); } namespace pipe