Files
evcharger-app/evcharger-app/versionutils.cpp
T
2026-08-17 11:20:06 +02:00

76 lines
1.9 KiB
C++

#include "versionutils.h"
namespace
{
bool isVersionSeparator(QChar character)
{
return character == u'.' || character == u',' || character == u'-' || character == u'+';
}
}
int VersionUtils::compareVersions(const QString &left, const QString &right) const
{
return compareVersion(left, right);
}
qsizetype VersionUtils::separatorIndex(QStringView version)
{
for (qsizetype index = 0; index < version.size(); ++index)
{
if (isVersionSeparator(version[index]))
return index;
}
return -1;
}
int VersionUtils::compareVersionPart(QStringView left, QStringView right)
{
while (!left.isEmpty() && left.front() == u'0')
left = left.sliced(1);
while (!right.isEmpty() && right.front() == u'0')
right = right.sliced(1);
if (left.size() < right.size())
return -1;
if (left.size() > right.size())
return 1;
const int comparison = left.compare(right, Qt::CaseSensitive);
if (comparison < 0)
return -1;
if (comparison > 0)
return 1;
return 0;
}
int VersionUtils::compareVersion(QStringView left, QStringView right)
{
while (true)
{
const qsizetype leftIndex = separatorIndex(left);
const qsizetype rightIndex = separatorIndex(right);
const QStringView leftPart = left.first(leftIndex < 0 ? left.size() : leftIndex);
const QStringView rightPart = right.first(rightIndex < 0 ? right.size() : rightIndex);
if (const int result = compareVersionPart(leftPart, rightPart); result != 0)
return result;
if (leftIndex < 0 && rightIndex < 0)
return 0;
if (leftIndex >= 0)
left = left.sliced(leftIndex + 1);
else
return rightIndex < 0 ? 1 : -1;
if (rightIndex >= 0)
right = right.sliced(rightIndex + 1);
else
return leftIndex < 0 ? -1 : 1;
}
}