mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-23 18:18:00 +02:00
Reverse Method upgraded
This commit is contained in:
parent
31e811d4d8
commit
cbb4e8b738
2 changed files with 81 additions and 44 deletions
|
@ -3025,53 +3025,30 @@ namespace System
|
||||||
return sIdStringLiterals[id];
|
return sIdStringLiterals[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reverse(String strBuffer)
|
public void Reverse() {
|
||||||
{
|
if (mLength < 1)
|
||||||
int_strsize originalLength = this.mLength;
|
return;
|
||||||
char8* originalPtr = this.Ptr;
|
|
||||||
|
|
||||||
if (originalLength <= 1)
|
int start = 0, end = mLength - 1;
|
||||||
{
|
|
||||||
strBuffer.Set(.(originalPtr, originalLength));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char8* tempBuffer = new:this char8[originalLength]* (?);
|
while (start < end) {
|
||||||
defer delete tempBuffer;
|
(Ptr[start], Ptr[end]) = (Ptr[end], Ptr[start]);
|
||||||
|
start++;
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
|
||||||
int_strsize writeIdx = 0;
|
int charStartByteIndex = 0;
|
||||||
int_strsize readPos = originalLength;
|
for (var currentByteIndex = 0; currentByteIndex < mLength - 1; currentByteIndex++) {
|
||||||
|
if ((Ptr[currentByteIndex] & (.)0xC0) != (.)0x80) {
|
||||||
while (readPos > 0) {
|
int i = charStartByteIndex, j = currentByteIndex;
|
||||||
int_strsize currentReadIdx = readPos - 1;
|
while (i < j) {
|
||||||
int_strsize startIdx = currentReadIdx;
|
(Ptr[i], mPtrOrBuffer[j]) = (Ptr[j], Ptr[i]);
|
||||||
char8 c = originalPtr[startIdx];
|
i++;
|
||||||
int8 len = 1;
|
j--;
|
||||||
|
}
|
||||||
if (c >= (.)0x80) {
|
charStartByteIndex = currentByteIndex + 1;
|
||||||
while (startIdx > 0 && ((uint8)originalPtr[startIdx] & 0xC0) == 0x80)
|
}
|
||||||
startIdx--;
|
}
|
||||||
|
|
||||||
var (decodedC32, decodedLen) = UTF8.Decode(originalPtr + startIdx, originalLength - startIdx);
|
|
||||||
|
|
||||||
if (decodedLen <= 0) {
|
|
||||||
len = 1;
|
|
||||||
startIdx = currentReadIdx;
|
|
||||||
} else {
|
|
||||||
len = decodedLen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Internal.MemCpy(tempBuffer + writeIdx, originalPtr + startIdx, len);
|
|
||||||
|
|
||||||
writeIdx += len;
|
|
||||||
readPos = startIdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
Runtime.Assert(writeIdx == originalLength);
|
|
||||||
|
|
||||||
strBuffer.Clear();
|
|
||||||
strBuffer.Reserve(originalLength);
|
|
||||||
strBuffer.Append(tempBuffer, originalLength);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct RawEnumerator : IRefEnumerator<char8*>, IEnumerator<char8>
|
public struct RawEnumerator : IRefEnumerator<char8*>, IEnumerator<char8>
|
||||||
|
|
60
tatus
Normal file
60
tatus
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
[1mdiff --git a/BeefLibs/corlib/src/String.bf b/BeefLibs/corlib/src/String.bf[m
|
||||||
|
[1mindex 088cfa81..92f9e7fb 100644[m
|
||||||
|
[1m--- a/BeefLibs/corlib/src/String.bf[m
|
||||||
|
[1m+++ b/BeefLibs/corlib/src/String.bf[m
|
||||||
|
[36m@@ -3025,6 +3025,55 @@[m [mnamespace System[m
|
||||||
|
return sIdStringLiterals[id];[m
|
||||||
|
}[m
|
||||||
|
[m
|
||||||
|
[32m+[m [32mpublic void Reverse(String strBuffer)[m
|
||||||
|
[32m+[m [32m{[m
|
||||||
|
[32m+[m [32m int_strsize originalLength = this.mLength;[m
|
||||||
|
[32m+[m [32m char8* originalPtr = this.Ptr;[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m if (originalLength <= 1)[m
|
||||||
|
[32m+[m [32m {[m
|
||||||
|
[32m+[m [32m strBuffer.Set(.(originalPtr, originalLength));[m
|
||||||
|
[32m+[m [32m return;[m
|
||||||
|
[32m+[m [32m }[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m char8* tempBuffer = new:this char8[originalLength]* (?);[m
|
||||||
|
[32m+[m [32m defer delete tempBuffer;[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m int_strsize writeIdx = 0;[m
|
||||||
|
[32m+[m [32m int_strsize readPos = originalLength;[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m while (readPos > 0) {[m
|
||||||
|
[32m+[m [32m int_strsize currentReadIdx = readPos - 1;[m
|
||||||
|
[32m+[m [32m int_strsize startIdx = currentReadIdx;[m
|
||||||
|
[32m+[m [32m char8 c = originalPtr[startIdx];[m
|
||||||
|
[32m+[m [32m int8 len = 1;[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m if (c >= (.)0x80) {[m
|
||||||
|
[32m+[m [32m while (startIdx > 0 && ((uint8)originalPtr[startIdx] & 0xC0) == 0x80)[m
|
||||||
|
[32m+[m [32m startIdx--;[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m var (decodedC32, decodedLen) = UTF8.Decode(originalPtr + startIdx, originalLength - startIdx);[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m if (decodedLen <= 0) {[m
|
||||||
|
[32m+[m [32m len = 1;[m
|
||||||
|
[32m+[m [32m startIdx = currentReadIdx;[m
|
||||||
|
[32m+[m [32m } else {[m
|
||||||
|
[32m+[m [32m len = decodedLen;[m
|
||||||
|
[32m+[m [32m }[m
|
||||||
|
[32m+[m [32m }[m
|
||||||
|
[32m+[m [32m Internal.MemCpy(tempBuffer + writeIdx, originalPtr + startIdx, len);[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m writeIdx += len;[m
|
||||||
|
[32m+[m [32m readPos = startIdx;[m
|
||||||
|
[32m+[m [32m }[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m Runtime.Assert(writeIdx == originalLength);[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m strBuffer.Clear();[m
|
||||||
|
[32m+[m [32m strBuffer.Reserve(originalLength);[m
|
||||||
|
[32m+[m [32m strBuffer.Append(tempBuffer, originalLength);[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
[32m+[m
|
||||||
|
public struct RawEnumerator : IRefEnumerator<char8*>, IEnumerator<char8>[m
|
||||||
|
{[m
|
||||||
|
char8* mPtr;[m
|
Loading…
Add table
Add a link
Reference in a new issue