aboutsummaryrefslogtreecommitdiff
path: root/launcher/Version.cpp
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2023-01-20 11:11:35 -0300
committerflow <flowlnlnln@gmail.com>2023-01-21 18:47:47 -0300
commit445f9e5f717bf1ad9b764704b320bbec237a7682 (patch)
tree2f18d4410fb7b2b7227f55047435f43f18e53a95 /launcher/Version.cpp
parentbcebb1920ff5df4f2a311984b296bfd8d5969997 (diff)
downloadPrismLauncher-445f9e5f717bf1ad9b764704b320bbec237a7682.tar.gz
PrismLauncher-445f9e5f717bf1ad9b764704b320bbec237a7682.tar.bz2
PrismLauncher-445f9e5f717bf1ad9b764704b320bbec237a7682.zip
feat+fix(Version): make comparsion FlexVer-compatible
... and fixes a minor issue in the parsing. This changes the expected behavior of Versions in one significant way: Now, Versions like 1.2 or 1.5 evaluate to LESS THAN 1.2.0 and 1.5.0 respectively. This makes sense for sorting versions, since one expects the versions without patch release to 'contain' the ones with, so the ones without should be evaluated uniformily with the ones with the patch. Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/Version.cpp')
-rw-r--r--launcher/Version.cpp92
1 files changed, 59 insertions, 33 deletions
diff --git a/launcher/Version.cpp b/launcher/Version.cpp
index 9307aab3..e4311f31 100644
--- a/launcher/Version.cpp
+++ b/launcher/Version.cpp
@@ -10,49 +10,63 @@ Version::Version(QString str) : m_string(std::move(str))
parse();
}
+#define VERSION_OPERATOR(return_on_different) \
+ bool exclude_our_sections = false; \
+ bool exclude_their_sections = false; \
+ \
+ const auto size = qMax(m_sections.size(), other.m_sections.size()); \
+ for (int i = 0; i < size; ++i) { \
+ Section sec1 = (i >= m_sections.size()) ? Section() : m_sections.at(i); \
+ Section sec2 = (i >= other.m_sections.size()) ? Section() : other.m_sections.at(i); \
+ \
+ { /* Don't include appendixes in the comparison */ \
+ if (sec1.isAppendix()) \
+ exclude_our_sections = true; \
+ if (sec2.isAppendix()) \
+ exclude_their_sections = true; \
+ \
+ if (exclude_our_sections) { \
+ sec1 = Section(); \
+ if (sec2.m_isNull) \
+ break; \
+ } \
+ \
+ if (exclude_their_sections) { \
+ sec2 = Section(); \
+ if (sec1.m_isNull) \
+ break; \
+ } \
+ } \
+ \
+ if (sec1 != sec2) \
+ return return_on_different; \
+ }
+
bool Version::operator<(const Version& other) const
{
- const auto size = qMax(m_sections.size(), other.m_sections.size());
- for (int i = 0; i < size; ++i) {
- const Section sec1 =
- (i >= m_sections.size()) ? Section("") : m_sections.at(i);
- const Section sec2 =
- (i >= other.m_sections.size()) ? Section("") : other.m_sections.at(i);
-
- if (sec1 != sec2)
- return sec1 < sec2;
- }
+ VERSION_OPERATOR(sec1 < sec2)
return false;
}
bool Version::operator==(const Version& other) const
{
- const auto size = qMax(m_sections.size(), other.m_sections.size());
- for (int i = 0; i < size; ++i) {
- const Section sec1 =
- (i >= m_sections.size()) ? Section("") : m_sections.at(i);
- const Section sec2 =
- (i >= other.m_sections.size()) ? Section("") : other.m_sections.at(i);
-
- if (sec1 != sec2)
- return false;
- }
+ VERSION_OPERATOR(false)
return true;
}
-bool Version::operator!=(const Version &other) const
+bool Version::operator!=(const Version& other) const
{
return !operator==(other);
}
-bool Version::operator<=(const Version &other) const
+bool Version::operator<=(const Version& other) const
{
return *this < other || *this == other;
}
-bool Version::operator>(const Version &other) const
+bool Version::operator>(const Version& other) const
{
return !(*this <= other);
}
-bool Version::operator>=(const Version &other) const
+bool Version::operator>=(const Version& other) const
{
return !(*this < other);
}
@@ -62,26 +76,38 @@ void Version::parse()
m_sections.clear();
QString currentSection;
- auto classChange = [](QChar lastChar, QChar currentChar) {
- return !lastChar.isNull() && ((!lastChar.isDigit() && currentChar.isDigit()) || (lastChar.isDigit() && !currentChar.isDigit()));
+ if (m_string.isEmpty())
+ return;
+
+ auto classChange = [&](QChar lastChar, QChar currentChar) {
+ if (lastChar.isNull())
+ return false;
+ if (lastChar.isDigit() != currentChar.isDigit())
+ return true;
+
+ const QList<QChar> s_separators{ '.', '-', '+' };
+ if (s_separators.contains(currentChar) && currentSection.at(0) != currentChar)
+ return true;
+
+ return false;
};
- for (int i = 0; i < m_string.size(); ++i) {
+ currentSection += m_string.at(0);
+ for (int i = 1; i < m_string.size(); ++i) {
const auto& current_char = m_string.at(i);
- if ((i > 0 && classChange(m_string.at(i - 1), current_char)) || current_char == '.' || current_char == '-' || current_char == '+') {
- if (!currentSection.isEmpty()) {
+ if (classChange(m_string.at(i - 1), current_char)) {
+ if (!currentSection.isEmpty())
m_sections.append(Section(currentSection));
- }
currentSection = "";
}
+
currentSection += current_char;
}
- if (!currentSection.isEmpty()) {
+
+ if (!currentSection.isEmpty())
m_sections.append(Section(currentSection));
- }
}
-
/// qDebug print support for the Version class
QDebug operator<<(QDebug debug, const Version& v)
{