summaryrefslogtreecommitdiffstats
path: root/api/logic/Version.h
blob: c5d930815050f7b465fc7b852ab6839792e03918 (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();
};