Jelajahi Sumber

Reuse QVersionNumber

nordsoft 3 tahun lalu
induk
melakukan
dcfafac266
1 mengubah file dengan 30 tambahan dan 54 penghapusan
  1. 30 54
      launcher/modManager/cmodlist.cpp

+ 30 - 54
launcher/modManager/cmodlist.cpp

@@ -14,75 +14,51 @@
 #include "../../lib/filesystem/CFileInputStream.h"
 #include "../../lib/GameConstants.h"
 
-const int maxSections = 3; // versions consist from up to 3 sections, major.minor.patch
-
+namespace
+{
 bool isCompatible(const QString & verMin, const QString & verMax)
 {
-	QList<int> vcmiVersionList = {GameConstants::VCMI_VERSION_MAJOR,
-								  GameConstants::VCMI_VERSION_MINOR,
-								  GameConstants::VCMI_VERSION_PATCH};
-
-	if(!verMin.isEmpty())
+	const int maxSections = 3; // versions consist from up to 3 sections, major.minor.patch
+	QVersionNumber vcmiVersion(GameConstants::VCMI_VERSION_MAJOR,
+							   GameConstants::VCMI_VERSION_MINOR,
+							   GameConstants::VCMI_VERSION_PATCH);
+	
+	auto versionMin = QVersionNumber::fromString(verMin);
+	auto versionMax = QVersionNumber::fromString(verMax);
+	
+	auto buildVersion = [](QVersionNumber & ver)
 	{
-		QStringList verMinList = verMin.split(".");
-		assert(verMinList.size() == maxSections);
-		bool compatibleMin = true;
-		for(int i = 0; i < maxSections; i++)
+		if(ver.segmentCount() < maxSections)
 		{
-			if(verMinList[i].toInt() < vcmiVersionList[i])
-			{
-				break;
-			}
-			if(verMinList[i].toInt() > vcmiVersionList[i])
-			{
-				compatibleMin = false;
-				break;
-			}
+			auto segments = ver.segments();
+			for(int i = segments.size() - 1; i < maxSections; ++i)
+				segments.append(0);
+			ver = QVersionNumber(segments);
 		}
+	};
 
-		if(!compatibleMin)
+	if(!versionMin.isNull())
+	{
+		buildVersion(versionMin);
+		if(vcmiVersion < versionMin)
 			return false;
 	}
-
-	if(!verMax.isEmpty())
+	
+	if(!versionMax.isNull())
 	{
-		QStringList verMaxList = verMax.split(".");
-		assert(verMaxList.size() == maxSections);
-		for(int i = 0; i < maxSections; i++)
-		{
-			if(verMaxList[i].toInt() > vcmiVersionList[i])
-			{
-				return true;
-			}
-			if(verMaxList[i].toInt() < vcmiVersionList[i])
-			{
-				return false;
-			}
-		}
+		buildVersion(versionMax);
+		if(vcmiVersion > versionMax)
+			return false;
 	}
 	return true;
 }
+}
 
 bool CModEntry::compareVersions(QString lesser, QString greater)
 {
-	QStringList lesserList = lesser.split(".");
-	QStringList greaterList = greater.split(".");
-
-	assert(lesserList.size() <= maxSections);
-	assert(greaterList.size() <= maxSections);
-
-	for(int i = 0; i < maxSections; i++)
-	{
-		if(greaterList.size() <= i) // 1.1.1 > 1.1
-			return false;
-
-		if(lesserList.size() <= i) // 1.1 < 1.1.1
-			return true;
-
-		if(lesserList[i].toInt() != greaterList[i].toInt())
-			return lesserList[i].toInt() < greaterList[i].toInt(); // 1.1 < 1.2
-	}
-	return false;
+	auto versionLesser = QVersionNumber::fromString(lesser);
+	auto versionGreater = QVersionNumber::fromString(greater);
+	return versionLesser < versionGreater;
 }
 
 QString CModEntry::sizeToString(double size)