If you’re building any kind of version management system in C++, such as a package manager or plugin system, then you’ll need to be able to manipulate, compare and print version strings. The Version
structure below extracted from pacm does exactly that:
#include <cstdio>
#include <string>
#include <iostream>
struct Version
{
int major = 0, minor = 0, revision = 0, build = 0;
Version(std::string version)
{
std::sscanf(version.c_str(), "%d.%d.%d.%d", &major, &minor, &revision, &build);
}
bool operator < (const Version& other)
{
if (major < other.major)
return true;
if (minor < other.minor)
return true;
if (revision < other.revision)
return true;
if (build < other.build)
return true;
return false;
}
bool operator == (const Version& other)
{
return major == other.major
&& minor == other.minor
&& revision == other.revision
&& build == other.build;
}
friend std::ostream& operator << (std::ostream& stream, const Version& ver)
{
stream << ver.major;
stream << '.';
stream << ver.minor;
stream << '.';
stream << ver.revision;
stream << '.';
stream << ver.build;
return stream;
}
};
Example usage:
void testVersionStringComparison()
{
assert((Version("3.7.8.0") == Version("3.7.8.0")) == true);
assert((Version("3.7.8.0") == Version("3.7.8")) == true);
assert((Version("3.7.8.0") < Version("3.7.8")) == false);
assert((Version("3.7.9") < Version("3.7.8")) == false);
assert((Version("3") < Version("3.7.9")) == true);
assert((Version("1.7.9") < Version("3.1")) == true);
std::cout << "Printing version (3.7.8.0): " << Version("3.7.8.0") << std::endl;
}