This commit is contained in:
Даниил Заикин
2026-06-17 20:44:53 +03:00
parent 9d153773c2
commit b133e7c656
1880 changed files with 244545 additions and 0 deletions
@@ -0,0 +1,149 @@
using System.Collections.Generic;
namespace QFSW.QC.Comparators
{
public class AlphanumComparator : IComparer<string>
{
private const int MaxStackSize = 512;
public unsafe int Compare(string x, string y)
{
if (x == null) { return 0; }
if (y == null) { return 0; }
int len1 = x.Length;
int len2 = y.Length;
if (len1 + len2 + 2 <= MaxStackSize)
{
char* buffer1 = stackalloc char[len1 + 1];
char* buffer2 = stackalloc char[len2 + 1];
return Compare(x, buffer1, len1, y, buffer2, len2);
}
else
{
char[] buffer1 = new char[len1 + 1];
char[] buffer2 = new char[len2 + 1];
fixed (char* ptr1 = buffer1)
fixed (char* ptr2 = buffer2)
{
return Compare(x, ptr1, len1, y, ptr2, len2);
}
}
}
public unsafe int Compare(string x, char* buffer1, int len1, string y, char* buffer2, int len2)
{
int marker1 = 0;
int marker2 = 0;
while (marker1 < len1 && marker2 < len2)
{
char ch1 = x[marker1];
char ch2 = y[marker2];
int loc1 = 0;
int loc2 = 0;
do
{
buffer1[loc1++] = ch1;
marker1++;
if (marker1 < len1)
{
ch1 = x[marker1];
}
else
{
break;
}
} while (char.IsDigit(ch1) == char.IsDigit(buffer1[0]));
do
{
buffer2[loc2++] = ch2;
marker2++;
if (marker2 < len2)
{
ch2 = y[marker2];
}
else
{
break;
}
} while (char.IsDigit(ch2) == char.IsDigit(buffer2[0]));
//null terminate buffers
buffer1[loc1] = buffer2[loc2] = (char)0;
int result;
if (char.IsDigit(buffer1[0]) && char.IsDigit(buffer2[0]))
{
int chunk1 = ParseInt(buffer1);
int chunk2 = ParseInt(buffer2);
result = chunk1 - chunk2;
}
else
{
result = CompareStrings(buffer1, buffer2);
}
if (result != 0)
{
return result;
}
}
return len1 - len2;
}
private unsafe int ParseInt(char* buffer)
{
int acc = 0;
while (*buffer != 0)
{
acc *= 10;
acc += *buffer++ - '0';
}
return acc;
}
private unsafe int CompareStrings(char* buffer1, char* buffer2)
{
int index = 0;
while (buffer1[index] != 0 && buffer2[index] != 0)
{
char c1 = buffer1[index];
char c2 = buffer2[index++];
if (c1 > c2)
{
return 1;
}
else if (c1 < c2)
{
return -1;
}
}
if (buffer1[index] != 0)
{
return 1;
}
else if (buffer2[index] != 0)
{
return -1;
}
else
{
return 0;
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6f5a6b857ac27fa44b0213d2a5f85538
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: