mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-10 16:07:09 -06:00
41 lines
1.1 KiB
C++
Executable File
41 lines
1.1 KiB
C++
Executable File
// SortUtils.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "SortUtils.h"
|
|
|
|
static int __cdecl CompareStrings(const void *a1, const void *a2)
|
|
{
|
|
const UString &s1 = *(*(*((const UString ***)a1)));
|
|
const UString &s2 = *(*(*((const UString ***)a2)));
|
|
return s1.CompareNoCase(s2);
|
|
}
|
|
|
|
void SortStringsToIndices(const UStringVector &strings, CIntVector &indices)
|
|
{
|
|
indices.Clear();
|
|
if (strings.IsEmpty())
|
|
return;
|
|
int numItems = strings.Size();
|
|
CPointerVector pointers;
|
|
pointers.Reserve(numItems);
|
|
indices.Reserve(numItems);
|
|
int i;
|
|
for(i = 0; i < numItems; i++)
|
|
pointers.Add((void *)&strings.CPointerVector::operator[](i));
|
|
void **stringsBase = (void **)pointers[0];
|
|
qsort(&pointers[0], numItems, sizeof(void *), CompareStrings);
|
|
for(i = 0; i < numItems; i++)
|
|
indices.Add((void **)pointers[i] - stringsBase);
|
|
}
|
|
|
|
void SortStrings(const UStringVector &src, UStringVector &dest)
|
|
{
|
|
CIntVector indices;
|
|
SortStringsToIndices(src, indices);
|
|
dest.Clear();
|
|
dest.Reserve(indices.Size());
|
|
for (int i = 0; i < indices.Size(); i++)
|
|
dest.Add(src[indices[i]]);
|
|
}
|