#pragma once #include <QString> #include <QList> #include "multimc_logic_export.h" class QUrl; struct MULTIMC_LOGIC_EXPORT Version { Version(const QString &str); Version() {} bool operator<(const Version &other) const; bool operator<=(const Version &other) const; bool operator>(const Version &other) const; bool operator>=(const Version &other) const; bool operator==(const Version &other) const; bool operator!=(const Version &other) const; QString toString() const { return m_string; } private: QString m_string; struct Section { explicit Section(const QString &fullString) { m_fullString = fullString; int cutoff = m_fullString.size(); for(int i = 0; i < m_fullString.size(); i++) { if(!m_fullString[i].isDigit()) { cutoff = i; break; } } auto numPart = m_fullString.leftRef(cutoff); if(numPart.size()) { numValid = true; m_numPart = numPart.toInt(); } auto stringPart = m_fullString.midRef(cutoff); if(stringPart.size()) { m_stringPart = stringPart.toString(); } } explicit Section() {} bool numValid = false; int m_numPart = 0; QString m_stringPart; QString m_fullString; inline bool operator!=(const Section &other) const { if(numValid && other.numValid) { return m_numPart != other.m_numPart || m_stringPart != other.m_stringPart; } else { return m_fullString != other.m_fullString; } } inline bool operator<(const Section &other) const { if(numValid && other.numValid) { if(m_numPart < other.m_numPart) return true; if(m_numPart == other.m_numPart && m_stringPart < other.m_stringPart) return true; return false; } else { return m_fullString < other.m_fullString; } } inline bool operator>(const Section &other) const { if(numValid && other.numValid) { if(m_numPart > other.m_numPart) return true; if(m_numPart == other.m_numPart && m_stringPart > other.m_stringPart) return true; return false; } else { return m_fullString > other.m_fullString; } } }; QList<Section> m_sections; void parse(); };