Core/StringExt: Add TrimLeftCount and TrimRightCount

This commit is contained in:
SirLynix 2024-01-26 15:11:31 +01:00
parent 22a047b3b1
commit f10671ac2a
4 changed files with 85 additions and 0 deletions

View File

@ -94,6 +94,9 @@ namespace Nz
NAZARA_CORE_API std::string_view TrimLeft(std::string_view str, char32_t c, CaseIndependent, UnicodeAware);
NAZARA_CORE_API std::string_view TrimLeft(std::string_view str, Unicode::Category category, UnicodeAware);
inline std::string_view TrimLeftCount(std::string_view str, std::size_t n);
NAZARA_CORE_API std::string_view TrimLeftCount(std::string_view str, std::size_t n, UnicodeAware);
NAZARA_CORE_API std::string_view TrimRight(std::string_view str);
inline std::string_view TrimRight(std::string_view str, char c);
inline std::string_view TrimRight(std::string_view str, char c, CaseIndependent);
@ -102,6 +105,10 @@ namespace Nz
NAZARA_CORE_API std::string_view TrimRight(std::string_view str, char32_t c, UnicodeAware);
NAZARA_CORE_API std::string_view TrimRight(std::string_view str, char32_t c, CaseIndependent, UnicodeAware);
NAZARA_CORE_API std::string_view TrimRight(std::string_view str, Unicode::Category category, UnicodeAware);
inline std::string_view TrimRightCount(std::string_view str, std::size_t n);
NAZARA_CORE_API std::string_view TrimRightCount(std::string_view str, std::size_t n, UnicodeAware);
}
#include <Nazara/Core/StringExt.inl>

View File

@ -301,6 +301,11 @@ namespace Nz
return str;
}
inline std::string_view TrimLeftCount(std::string_view str, std::size_t n)
{
return str.substr(std::min(n, str.size()));
}
inline std::string_view TrimRight(std::string_view str, char c)
{
while (!str.empty() && str.back() == c)
@ -326,6 +331,11 @@ namespace Nz
return str;
}
inline std::string_view TrimRightCount(std::string_view str, std::size_t n)
{
return str.substr(0, (str.size() > n) ? str.size() - n : 0);
}
}
#include <Nazara/Core/DebugOff.hpp>

View File

@ -645,6 +645,20 @@ namespace Nz
return std::string_view(it.base(), end.base() - it.base());
}
std::string_view TrimLeftCount(std::string_view str, std::size_t n, UnicodeAware)
{
utf8::unchecked::iterator<const char*> it(str.data());
utf8::unchecked::iterator<const char*> end(str.data() + str.size());
while (it != end && n > 0)
{
++it;
--n;
}
return std::string_view(it.base(), end.base() - it.base());
}
std::string_view TrimRight(std::string_view str)
{
NAZARA_USE_ANONYMOUS_NAMESPACE
@ -742,4 +756,22 @@ namespace Nz
return std::string_view(start.base(), it.base() - start.base());
}
std::string_view TrimRightCount(std::string_view str, std::size_t n, UnicodeAware)
{
if (str.empty())
return str;
const char* begin = str.data();
const char* ptr = begin + str.size();
for (std::size_t i = 0; i < n; ++i)
{
if (ptr == begin)
return {};
utf8::prior(ptr, begin);
}
return std::string_view(begin, ptr - begin);
}
}

View File

@ -123,6 +123,42 @@ SCENARIO("String", "[CORE][STRING]")
CHECK(Nz::Substring(str, 1, 10, Nz::UnicodeAware{}) == "\u00E9\u00E7\u0153\u00C2\u5B98");
}
WHEN("Trimming N characters by the left")
{
std::string_view str = "Nazara Engine";
CHECK(Nz::TrimLeftCount(str, 0) == str);
CHECK(Nz::TrimLeftCount(str, 1) == "azara Engine");
CHECK(Nz::TrimLeftCount(str, 7) == "Engine");
CHECK(Nz::TrimLeftCount(str, 20) == "");
}
WHEN("Trimming N characters by the left - UTF-8 version")
{
std::string_view str = "\u00E0\u00E9\u00E7\u0153\u00C2\u5B98";
CHECK(Nz::TrimLeftCount(str, 0, Nz::UnicodeAware{}) == str);
CHECK(Nz::TrimLeftCount(str, 1, Nz::UnicodeAware{}) == "\u00E9\u00E7\u0153\u00C2\u5B98");
CHECK(Nz::TrimLeftCount(str, 5, Nz::UnicodeAware{}) == "\u5B98");
CHECK(Nz::TrimLeftCount(str, 20, Nz::UnicodeAware{}) == "");
}
WHEN("Trimming N characters by the right")
{
std::string_view str = "Nazara Engine";
CHECK(Nz::TrimRightCount(str, 0) == str);
CHECK(Nz::TrimRightCount(str, 1) == "Nazara Engin");
CHECK(Nz::TrimRightCount(str, 7) == "Nazara");
CHECK(Nz::TrimRightCount(str, 20) == "");
}
WHEN("Trimming N characters by the right - UTF-8 version")
{
std::string_view str = "\u00E0\u00E9\u00E7\u0153\u00C2\u5B98";
CHECK(Nz::TrimRightCount(str, 0, Nz::UnicodeAware{}) == str);
CHECK(Nz::TrimRightCount(str, 1, Nz::UnicodeAware{}) == "\u00E0\u00E9\u00E7\u0153\u00C2");
CHECK(Nz::TrimRightCount(str, 5, Nz::UnicodeAware{}) == "\u00E0");
CHECK(Nz::TrimRightCount(str, 20, Nz::UnicodeAware{}) == "");
}
WHEN("Checking if string starts with")
{
CHECK(Nz::StartsWith("Nazara Engine", ""));