-
-
Notifications
You must be signed in to change notification settings - Fork 566
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #751 from Edgars-Cirulis/develop
- Loading branch information
Showing
5 changed files
with
336 additions
and
130 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,85 +1,128 @@ | ||
#include "Version.h" | ||
|
||
#include <QStringList> | ||
#include <QUrl> | ||
#include <QDebug> | ||
#include <QRegularExpression> | ||
#include <QRegularExpressionMatch> | ||
#include <QUrl> | ||
|
||
Version::Version(const QString &str) : m_string(str) | ||
Version::Version(QString str) : m_string(std::move(str)) | ||
{ | ||
parse(); | ||
} | ||
|
||
bool Version::operator<(const Version &other) const | ||
{ | ||
const int size = qMax(m_sections.size(), other.m_sections.size()); | ||
for (int i = 0; i < size; ++i) | ||
{ | ||
const Section sec1 = (i >= m_sections.size()) ? Section("0") : m_sections.at(i); | ||
const Section sec2 = | ||
(i >= other.m_sections.size()) ? Section("0") : other.m_sections.at(i); | ||
if (sec1 != sec2) | ||
{ | ||
return sec1 < sec2; | ||
} | ||
#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 | ||
{ | ||
VERSION_OPERATOR(sec1 < sec2) | ||
|
||
return false; | ||
} | ||
bool Version::operator<=(const Version &other) const | ||
bool Version::operator==(const Version& other) const | ||
{ | ||
VERSION_OPERATOR(false) | ||
|
||
return true; | ||
} | ||
bool Version::operator!=(const Version& other) const | ||
{ | ||
return !operator==(other); | ||
} | ||
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 | ||
{ | ||
const int size = qMax(m_sections.size(), other.m_sections.size()); | ||
for (int i = 0; i < size; ++i) | ||
{ | ||
const Section sec1 = (i >= m_sections.size()) ? Section("0") : m_sections.at(i); | ||
const Section sec2 = | ||
(i >= other.m_sections.size()) ? Section("0") : other.m_sections.at(i); | ||
if (sec1 != sec2) | ||
{ | ||
return sec1 > sec2; | ||
} | ||
} | ||
|
||
return false; | ||
return !(*this <= other); | ||
} | ||
bool Version::operator>=(const Version &other) const | ||
bool Version::operator>=(const Version& other) const | ||
{ | ||
return *this > other || *this == other; | ||
return !(*this < other); | ||
} | ||
bool Version::operator==(const Version &other) const | ||
|
||
void Version::parse() | ||
{ | ||
const int size = qMax(m_sections.size(), other.m_sections.size()); | ||
for (int i = 0; i < size; ++i) | ||
{ | ||
const Section sec1 = (i >= m_sections.size()) ? Section("0") : m_sections.at(i); | ||
const Section sec2 = | ||
(i >= other.m_sections.size()) ? Section("0") : other.m_sections.at(i); | ||
if (sec1 != sec2) | ||
{ | ||
m_sections.clear(); | ||
QString currentSection; | ||
|
||
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; | ||
}; | ||
|
||
currentSection += m_string.at(0); | ||
for (int i = 1; i < m_string.size(); ++i) { | ||
const auto& current_char = m_string.at(i); | ||
if (classChange(m_string.at(i - 1), current_char)) { | ||
if (!currentSection.isEmpty()) | ||
m_sections.append(Section(currentSection)); | ||
currentSection = ""; | ||
} | ||
|
||
currentSection += current_char; | ||
} | ||
|
||
return true; | ||
} | ||
bool Version::operator!=(const Version &other) const | ||
{ | ||
return !operator==(other); | ||
if (!currentSection.isEmpty()) | ||
m_sections.append(Section(currentSection)); | ||
} | ||
|
||
void Version::parse() | ||
/// qDebug print support for the Version class | ||
QDebug operator<<(QDebug debug, const Version& v) | ||
{ | ||
m_sections.clear(); | ||
QDebugStateSaver saver(debug); | ||
|
||
// FIXME: this is bad. versions can contain a lot more separators... | ||
QStringList parts = m_string.split('.'); | ||
debug.nospace() << "Version{ string: " << v.toString() << ", sections: [ "; | ||
|
||
for (const auto& part : parts) | ||
{ | ||
m_sections.append(Section(part)); | ||
bool first = true; | ||
for (auto s : v.m_sections) { | ||
if (!first) debug.nospace() << ", "; | ||
debug.nospace() << s.m_fullString; | ||
first = false; | ||
} | ||
|
||
debug.nospace() << " ]" << " }"; | ||
|
||
return debug; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.