File: CModVersion.cpp

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (101 lines) | stat: -rw-r--r-- 2,458 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 * CModVersion.cpp, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */

#include "StdInc.h"
#include "CModVersion.h"

VCMI_LIB_NAMESPACE_BEGIN

CModVersion CModVersion::GameVersion()
{
	return CModVersion(VCMI_VERSION_MAJOR, VCMI_VERSION_MINOR, VCMI_VERSION_PATCH);
}

CModVersion CModVersion::fromString(std::string from)
{
	int major = Any;
	int minor = Any;
	int patch = Any;
	try
	{
		auto pointPos = from.find('.');
		major = std::stoi(from.substr(0, pointPos));
		if(pointPos != std::string::npos)
		{
			from = from.substr(pointPos + 1);
			pointPos = from.find('.');
			minor = std::stoi(from.substr(0, pointPos));
			if(pointPos != std::string::npos)
				patch = std::stoi(from.substr(pointPos + 1));
		}
	}
	catch(const std::invalid_argument &)
	{
		return CModVersion();
	}
	return CModVersion(major, minor, patch);
}

std::string CModVersion::toString() const
{
	std::string res;
	if(major != Any)
	{
		res += std::to_string(major);
		if(minor != Any)
		{
			res += '.' + std::to_string(minor);
			if(patch != Any)
				res += '.' + std::to_string(patch);
		}
	}
	return res;
}

bool CModVersion::operator ==(const CModVersion & other) const
{
	return major == other.major && minor == other.minor && patch == other.patch;
}

bool CModVersion::operator !=(const CModVersion & other) const
{
	return major != other.major || minor != other.minor || patch != other.patch;
}

bool CModVersion::compatible(const CModVersion & other, bool checkMinor, bool checkPatch) const
{
	bool doCheckMinor = checkMinor && minor != Any && other.minor != Any;
	bool doCheckPatch = checkPatch && patch != Any && other.patch != Any;
	
	assert(!doCheckPatch || (doCheckPatch && doCheckMinor));
		
	return  (major == other.major &&
			(!doCheckMinor || minor >= other.minor) &&
			(!doCheckPatch || minor > other.minor || (minor == other.minor && patch >= other.patch)));
}

bool CModVersion::isNull() const
{
	return major == Any;
}

bool operator < (const CModVersion & lesser, const CModVersion & greater)
{
	//specific is "greater" than non-specific, that's why do not check for Any value
	if(lesser.major == greater.major)
	{
		if(lesser.minor == greater.minor)
			return lesser.patch < greater.patch;
		return lesser.minor < greater.minor;
	}
	return lesser.major < greater.major;
}

VCMI_LIB_NAMESPACE_END