summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/Version.cpp
diff options
context:
space:
mode:
authorMehmet Samet Duman <yongdohyun@projecttick.org>2026-04-02 18:51:45 +0300
committerMehmet Samet Duman <yongdohyun@projecttick.org>2026-04-02 18:51:45 +0300
commitd3261e64152397db2dca4d691a990c6bc2a6f4dd (patch)
treefac2f7be638651181a72453d714f0f96675c2b8b /archived/projt-launcher/launcher/Version.cpp
parent31b9a8949ed0a288143e23bf739f2eb64fdc63be (diff)
downloadProject-Tick-d3261e64152397db2dca4d691a990c6bc2a6f4dd.tar.gz
Project-Tick-d3261e64152397db2dca4d691a990c6bc2a6f4dd.zip
NOISSUE add archived projects
Signed-off-by: Mehmet Samet Duman <yongdohyun@projecttick.org>
Diffstat (limited to 'archived/projt-launcher/launcher/Version.cpp')
-rw-r--r--archived/projt-launcher/launcher/Version.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/archived/projt-launcher/launcher/Version.cpp b/archived/projt-launcher/launcher/Version.cpp
new file mode 100644
index 0000000000..30047aa455
--- /dev/null
+++ b/archived/projt-launcher/launcher/Version.cpp
@@ -0,0 +1,156 @@
+// SPDX-License-Identifier: GPL-3.0-only
+// SPDX-FileCopyrightText: 2026 Project Tick
+// SPDX-FileContributor: Project Tick Team
+/*
+ * ProjT Launcher - Minecraft Launcher
+ * Copyright (C) 2026 Project Tick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include "Version.h"
+
+#include <QDebug>
+#include <QRegularExpressionMatch>
+#include <QUrl>
+
+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
+{
+ VERSION_OPERATOR(sec1 < sec2)
+
+ return false;
+}
+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
+{
+ return !(*this <= other);
+}
+bool Version::operator>=(const Version& other) const
+{
+ return !(*this < other);
+}
+
+void Version::parse()
+{
+ m_sections.clear();
+ QString currentSection;
+
+ if (m_string.isEmpty())
+ return;
+
+ auto classChange = [&currentSection](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;
+ }
+
+ if (!currentSection.isEmpty())
+ m_sections.append(Section(currentSection));
+}
+
+/// qDebug print support for the Version class
+QDebug operator<<(QDebug debug, const Version& v)
+{
+ QDebugStateSaver saver(debug);
+
+ debug.nospace() << "Version{ string: " << v.toString() << ", sections: [ ";
+
+ bool first = true;
+ for (auto s : v.m_sections)
+ {
+ if (!first)
+ debug.nospace() << ", ";
+ debug.nospace() << s.m_fullString;
+ first = false;
+ }
+
+ debug.nospace() << " ]"
+ << " }";
+
+ return debug;
+}