#pragma once
#include "BuildSettings.h"
#include "FlagSet.h"
OPENMPT_NAMESPACE_BEGIN
class Version
{
private:
uint32 m_Version;
public:
enum class Field
{
Major,
Minor,
Patch,
Test,
};
public:
static Version Current() noexcept;
public:
MPT_CONSTEXPR11_FUN Version() noexcept
: m_Version(0)
{}
explicit MPT_CONSTEXPR11_FUN Version(uint32 version) noexcept
: m_Version(version)
{}
explicit MPT_CONSTEXPR11_FUN Version(uint8 v1, uint8 v2, uint8 v3, uint8 v4) noexcept
: m_Version((static_cast<uint32>(v1) << 24) | (static_cast<uint32>(v2) << 16) | (static_cast<uint32>(v3) << 8) | (static_cast<uint32>(v4) << 0))
{}
public:
mpt::ustring ToUString() const;
static Version Parse(const mpt::ustring &s);
public:
explicit MPT_CONSTEXPR11_FUN operator bool () const noexcept
{
return m_Version != 0;
}
MPT_CONSTEXPR11_FUN bool operator ! () const noexcept
{
return m_Version == 0;
}
MPT_CONSTEXPR11_FUN uint32 GetRawVersion() const noexcept
{
return m_Version;
}
MPT_FORCEINLINE Version Masked(uint32 mask) const noexcept
{
return Version(m_Version & mask);
}
MPT_CONSTEXPR11_FUN uint8 GetField(Field field) const noexcept
{
return
(field == Field::Major) ? static_cast<uint8>((m_Version >> 24) & 0xffu) :
(field == Field::Minor) ? static_cast<uint8>((m_Version >> 16) & 0xffu) :
(field == Field::Patch) ? static_cast<uint8>((m_Version >> 8) & 0xffu) :
(field == Field::Test ) ? static_cast<uint8>((m_Version >> 0) & 0xffu) :
0u;
}
Version WithoutTestNumber() const noexcept;
Version WithoutPatchOrTestNumbers() const noexcept;
public:
mpt::ustring GetOpenMPTVersionString() const;
bool IsTestVersion() const noexcept;
};
MPT_CONSTEXPR11_FUN bool operator == (const Version &a, const Version &b) noexcept
{
return a.GetRawVersion() == b.GetRawVersion();
}
MPT_CONSTEXPR11_FUN bool operator != (const Version &a, const Version &b) noexcept
{
return a.GetRawVersion() != b.GetRawVersion();
}
MPT_CONSTEXPR11_FUN bool operator <= (const Version &a, const Version &b) noexcept
{
return a.GetRawVersion() <= b.GetRawVersion();
}
MPT_CONSTEXPR11_FUN bool operator >= (const Version &a, const Version &b) noexcept
{
return a.GetRawVersion() >= b.GetRawVersion();
}
MPT_CONSTEXPR11_FUN bool operator < (const Version &a, const Version &b) noexcept
{
return a.GetRawVersion() < b.GetRawVersion();
}
MPT_CONSTEXPR11_FUN bool operator > (const Version &a, const Version &b) noexcept
{
return a.GetRawVersion() > b.GetRawVersion();
}
#define MPT_MAKE_VERSION_NUMERIC_HELPER(prefix,v0,v1,v2,v3) Version( prefix ## v0 , prefix ## v1 , prefix ## v2 , prefix ## v3 )
#define MAKE_VERSION_NUMERIC(v0,v1,v2,v3) MPT_MAKE_VERSION_NUMERIC_HELPER(0x, v0, v1, v2, v3)
class SourceInfo
{
private:
mpt::ustring m_Url; int m_Revision; bool m_IsDirty; bool m_HasMixedRevisions; bool m_IsPackage; mpt::ustring m_Date; private:
SourceInfo();
public:
static SourceInfo Current();
public:
const mpt::ustring & Url() const { return m_Url; }
int Revision() const { return m_Revision; }
bool IsDirty() const { return m_IsDirty; }
bool HasMixedRevisions() const { return m_HasMixedRevisions; }
bool IsPackage() const { return m_IsPackage; }
const mpt::ustring & Date() const { return m_Date; }
public:
mpt::ustring GetUrlWithRevision() const; mpt::ustring GetStateString() const; };
namespace Build
{
bool IsReleasedBuild();
bool IsDebugBuild();
mpt::ustring GetBuildDateString();
mpt::ustring GetBuildFeaturesString();
mpt::ustring GetBuildCompilerString();
enum Strings
{
StringsNone = 0,
StringVersion = 1<<0, StringRevision = 1<<2, StringBitness = 1<<3, StringSourceInfo = 1<<4, StringBuildFlags = 1<<5, StringBuildFeatures = 1<<6, };
MPT_DECLARE_ENUM(Strings)
mpt::ustring GetVersionString(FlagSet<Build::Strings> strings);
mpt::ustring GetVersionStringPure();
mpt::ustring GetVersionStringSimple();
mpt::ustring GetVersionStringExtended();
enum class Url
{
Website,
Download,
Forum,
Bugtracker,
Updates,
TopPicks,
};
mpt::ustring GetURL(Build::Url key);
mpt::ustring GetFullCreditsString();
mpt::ustring GetLicenseString();
}
OPENMPT_NAMESPACE_END