forked from feedc0de/evcharger-app
76 lines
1.9 KiB
C++
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;
|
|
}
|
|
}
|