[+] AuCodepointsStartsWithEqualIgnoreCase
[+] AuCodepointsEndsWithEqualIgnoreCase [+] AuCodepointsReverseIterate [+] AuCodepointsReverseIterateSubStrPrefixView [+] AuCodepointsReverseIterateSubStrSuffixView [+] AuROString::stl_remove_suffix [+] AuROString::stl_remove_prefix
This commit is contained in:
parent
76bf394f73
commit
3ce4184836
@ -19,7 +19,8 @@
|
|||||||
AuCodepointsContains,
|
AuCodepointsContains,
|
||||||
AuCodepointsReplaceAll, AuCodepointsSplitString (views),
|
AuCodepointsReplaceAll, AuCodepointsSplitString (views),
|
||||||
AuCodepointsFindPreviousValidByteOffsetFromOffset, AuCodepointsFindPreviousValidByteOffsetFromByteOffset
|
AuCodepointsFindPreviousValidByteOffsetFromOffset, AuCodepointsFindPreviousValidByteOffsetFromByteOffset
|
||||||
AuCodepointsIsEqualIgnoreCase
|
AuCodepointsIsEqualIgnoreCase, AuCodepointsStartsWithEqualIgnoreCase, AuCodepointsEndsWithEqualIgnoreCase,
|
||||||
|
AuCodepointsReverseIterate, AuCodepointsReverseIterateSubStrPrefixView, AuCodepointsReverseIterateSubStrSuffixView
|
||||||
|
|
||||||
For translating between locales (including utf8-32), defer to AuLocale (Aurora::Locale) in the Aurora Runtime.
|
For translating between locales (including utf8-32), defer to AuLocale (Aurora::Locale) in the Aurora Runtime.
|
||||||
***/
|
***/
|
||||||
@ -1307,6 +1308,168 @@ static CodepointOffset_t AuCodepointsFindCodepointOffset(const AuROString &in,
|
|||||||
return AuROString::npos;
|
return AuROString::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool AuCodepointsStartsWithEqualIgnoreCase(const AuROString &inA,
|
||||||
|
const AuROString &inB)
|
||||||
|
{
|
||||||
|
if (inA.size() < inB.size())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inA.empty() ||
|
||||||
|
inB.empty())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *pItr = inA.data();
|
||||||
|
const char *pItr2 = inB.data();
|
||||||
|
const char *pEnd = pItr + inB.length();
|
||||||
|
|
||||||
|
while (pItr < pEnd)
|
||||||
|
{
|
||||||
|
AuUInt32 c {};
|
||||||
|
|
||||||
|
if ((c = *pItr) <= 0x7FU)
|
||||||
|
{
|
||||||
|
if (AuToLower(c) != AuToLower(*pItr2))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
++pItr2;
|
||||||
|
++pItr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AuUInt32 nby {};
|
||||||
|
|
||||||
|
if ((*pItr & 0xC0U) != 0xC0U)
|
||||||
|
{
|
||||||
|
return AuMemcmp(pItr, pItr2, pEnd - pItr) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (AuUInt8 b = *pItr; (b & 0x80U) != 0; b <<= 1, ++nby)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nby > kAuCodepointUTF8MaxBytes)
|
||||||
|
{
|
||||||
|
return AuMemcmp(pItr, pItr2, pEnd - pItr) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AuUInt(pEnd - pItr) < AuUInt(nby))
|
||||||
|
{
|
||||||
|
return AuMemcmp(pItr, pItr2, pEnd - pItr) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AuMemcmp(pItr, pItr2, nby) != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pItr += nby;
|
||||||
|
pItr2 += nby;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool AuCodepointsEndsWithEqualIgnoreCase(const AuROString &inA,
|
||||||
|
const AuROString &inB)
|
||||||
|
{
|
||||||
|
if (inA.size() < inB.size())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inA.empty() ||
|
||||||
|
inB.empty())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuUInt uOffset { inA.Size() };
|
||||||
|
AuUInt uOffset2 { inB.Size() };
|
||||||
|
|
||||||
|
while (uOffset && uOffset2)
|
||||||
|
{
|
||||||
|
AuUInt32 c {};
|
||||||
|
|
||||||
|
auto uLastValid = AuCodepointsFindPreviousValidByteOffsetFromByteOffset(inB, uOffset2);
|
||||||
|
if (uLastValid == AuROString::npos)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto nby = uOffset2 - uLastValid;
|
||||||
|
|
||||||
|
if (AuSInt(uOffset) - AuSInt(nby) < 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto pItr = inA.data() + uOffset - nby;
|
||||||
|
auto pItr2 = inB.data() + uOffset2 - nby;
|
||||||
|
|
||||||
|
if ((c = *pItr) <= 0x7FU)
|
||||||
|
{
|
||||||
|
if (AuToLower(c) != AuToLower(*pItr2))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uOffset -= 1;
|
||||||
|
uOffset2 -= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (AuMemcmp(pItr, pItr2, nby) != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uOffset -= nby;
|
||||||
|
uOffset2 -= nby;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AuUInt AuCodepointsReverseIterate(const AuROString &string)
|
||||||
|
{
|
||||||
|
auto uLastValid = AuCodepointsFindPreviousValidByteOffsetFromByteOffset(string, string.Size());
|
||||||
|
if (uLastValid == AuROString::npos)
|
||||||
|
{
|
||||||
|
return AuROString::npos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Size() - uLastValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AuROString AuCodepointsReverseIterateSubStrPrefixView(const AuROString &string)
|
||||||
|
{
|
||||||
|
auto uOffset = AuCodepointsReverseIterate(string);
|
||||||
|
if (uOffset == AuROString::npos)
|
||||||
|
{
|
||||||
|
return AuROString {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.RemoveSuffix(uOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static AuROString AuCodepointsReverseIterateSubStrSuffixView(const AuROString &string)
|
||||||
|
{
|
||||||
|
auto uLastValid = AuCodepointsFindPreviousValidByteOffsetFromByteOffset(string, string.Size());
|
||||||
|
if (uLastValid == AuROString::npos)
|
||||||
|
{
|
||||||
|
return AuROString {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.RemovePrefix(uLastValid);
|
||||||
|
}
|
||||||
|
|
||||||
static bool AuCodepointsContains(const AuROString &value, const AuROString &subpattern, CodepointOffset_t uStartPosition = {})
|
static bool AuCodepointsContains(const AuROString &value, const AuROString &subpattern, CodepointOffset_t uStartPosition = {})
|
||||||
{
|
{
|
||||||
return AuCodepointsFindCodepointOffset(value, subpattern, uStartPosition) != AuROString::npos;
|
return AuCodepointsFindCodepointOffset(value, subpattern, uStartPosition) != AuROString::npos;
|
||||||
|
@ -155,7 +155,31 @@ struct AuROString
|
|||||||
return AuROString { this->pPointer + pos1, count1 };
|
return AuROString { this->pPointer + pos1, count1 };
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr AuROString remove_suffix(size_type n)
|
inline constexpr void stl_remove_suffix(size_type n)
|
||||||
|
{
|
||||||
|
if (this->uLength < n)
|
||||||
|
{
|
||||||
|
*this = AuROString { };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*this = AuROString { this->pPointer, this->uLength - n };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline constexpr void stl_remove_prefix(size_type n)
|
||||||
|
{
|
||||||
|
if (this->uLength < n)
|
||||||
|
{
|
||||||
|
*this = AuROString { };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*this = AuROString { this->pPointer + n, this->uLength - n };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline constexpr AuROString remove_suffix(size_type n) const
|
||||||
{
|
{
|
||||||
if (this->uLength < n)
|
if (this->uLength < n)
|
||||||
{
|
{
|
||||||
@ -165,7 +189,7 @@ struct AuROString
|
|||||||
return AuROString { this->pPointer, this->uLength - n };
|
return AuROString { this->pPointer, this->uLength - n };
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr AuROString remove_prefix(size_type n)
|
inline constexpr AuROString remove_prefix(size_type n) const
|
||||||
{
|
{
|
||||||
if (this->uLength < n)
|
if (this->uLength < n)
|
||||||
{
|
{
|
||||||
@ -175,12 +199,12 @@ struct AuROString
|
|||||||
return AuROString { this->pPointer + n, this->uLength - n };
|
return AuROString { this->pPointer + n, this->uLength - n };
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr AuROString RemoveSuffix(size_type n)
|
inline constexpr AuROString RemoveSuffix(size_type n) const
|
||||||
{
|
{
|
||||||
return remove_suffix(n);
|
return remove_suffix(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr AuROString RemovePrefix(size_type n)
|
inline constexpr AuROString RemovePrefix(size_type n) const
|
||||||
{
|
{
|
||||||
return remove_prefix(n);
|
return remove_prefix(n);
|
||||||
}
|
}
|
||||||
@ -520,6 +544,11 @@ struct AuROString
|
|||||||
return this->substr(pos1, count1);
|
return this->substr(pos1, count1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline constexpr AuROString SubStr(size_type pos1, size_type count1 = npos) const noexcept
|
||||||
|
{
|
||||||
|
return this->substr(pos1, count1);
|
||||||
|
}
|
||||||
|
|
||||||
inline constexpr int Compare(basic_string_view v) const noexcept
|
inline constexpr int Compare(basic_string_view v) const noexcept
|
||||||
{
|
{
|
||||||
return this->compare(v);
|
return this->compare(v);
|
||||||
@ -1201,6 +1230,11 @@ struct AuRONString
|
|||||||
return this->substr(pos1, count1);
|
return this->substr(pos1, count1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline constexpr AuROString SubStr(size_type pos1, size_type count1 = npos) const noexcept
|
||||||
|
{
|
||||||
|
return this->substr(pos1, count1);
|
||||||
|
}
|
||||||
|
|
||||||
inline constexpr int Compare(AuROString v) const noexcept
|
inline constexpr int Compare(AuROString v) const noexcept
|
||||||
{
|
{
|
||||||
return this->compare(v);
|
return this->compare(v);
|
||||||
|
Loading…
Reference in New Issue
Block a user