summaryrefslogtreecommitdiffstats
path: root/api/logic/Version.h
blob: 7aa2ebe8505310a0cb82bb1d75dafb7da4c2c478 (plain)
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
102
103
104
105
106
107
#pragma once

#include <QString>
#include <QList>

#include "multimc_logic_export.h"

class QUrl;

class MULTIMC_LOGIC_EXPORT Version
{
public:
	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();
};