1#ifndef RITSUKO_PARSE_VERSION_HPP
2#define RITSUKO_PARSE_VERSION_HPP
25 Version(
int ma,
int mi,
int pa) {
58 bool eq(
int maj,
int min,
int pat)
const {
68 bool ne(
int maj,
int min,
int pat)
const {
69 return !
eq(maj, min, pat);
78 bool le(
int maj,
int min,
int pat)
const {
94 bool lt(
int maj,
int min,
int pat)
const {
110 bool ge(
int maj,
int min,
int pat)
const {
111 return !
lt(maj, min, pat);
120 bool gt(
int maj,
int min,
int pat)
const {
121 return !
le(maj, min, pat);
177inline void throw_version_error(
const char* version_string,
size_t size,
const char* reason) {
178 std::string message(version_string, version_string + size);
179 message =
"invalid version string '" + message +
"' ";
181 throw std::runtime_error(message.c_str());
195 int major = 0, minor = 0, patch = 0;
196 size_t i = 0, end = size;
200 throw std::runtime_error(
"version string is empty");
202 if (version_string[i] ==
'0') {
204 if (i < end && version_string[i] !=
'.') {
205 throw_version_error(version_string, size,
"has leading zeros in its major version");
208 while (i < end && version_string[i] !=
'.') {
209 if (!std::isdigit(version_string[i])) {
210 throw_version_error(version_string, size,
"contains non-digit characters");
213 major += version_string[i] -
'0';
220 throw_version_error(version_string, size,
"is missing a minor version");
224 throw_version_error(version_string, size,
"is missing a minor version");
227 if (version_string[i] !=
'0') {
228 while (i < end && version_string[i] !=
'.') {
229 if (!std::isdigit(version_string[i])) {
230 throw_version_error(version_string, size,
"contains non-digit characters");
233 minor += version_string[i] -
'0';
239 if (i < end && version_string[i] !=
'.') {
240 throw_version_error(version_string, size,
"has leading zeros in its minor version");
246 throw_version_error(version_string, size,
"should not have a patch version");
248 return Version(major, minor, 0);
253 throw_version_error(version_string, size,
"is missing a patch version");
257 throw_version_error(version_string, size,
"is missing a patch version");
260 if (version_string[i] ==
'0' && i + 1 < end) {
261 throw_version_error(version_string, size,
"has leading zeros in its patch version");
264 if (!std::isdigit(version_string[i])) {
265 throw_version_error(version_string, size,
"contains non-digit characters");
268 patch += version_string[i] -
'0';
272 return Version(major, minor, patch);
Assorted helper functions for parsing and validation.
Definition choose_missing_placeholder.hpp:15
Version parse_version_string(const char *version_string, size_t size, bool skip_patch=false)
Definition parse_version_string.hpp:194
Version number.
Definition parse_version_string.hpp:19
bool eq(int maj, int min, int pat) const
Definition parse_version_string.hpp:58
bool operator>(const Version &rhs) const
Definition parse_version_string.hpp:161
bool operator>=(const Version &rhs) const
Definition parse_version_string.hpp:169
bool ne(int maj, int min, int pat) const
Definition parse_version_string.hpp:68
int major
Definition parse_version_string.hpp:39
bool ge(int maj, int min, int pat) const
Definition parse_version_string.hpp:110
bool operator<=(const Version &rhs) const
Definition parse_version_string.hpp:153
bool operator==(const Version &rhs) const
Definition parse_version_string.hpp:129
bool lt(int maj, int min, int pat) const
Definition parse_version_string.hpp:94
int minor
Definition parse_version_string.hpp:44
bool gt(int maj, int min, int pat) const
Definition parse_version_string.hpp:120
bool le(int maj, int min, int pat) const
Definition parse_version_string.hpp:78
int patch
Definition parse_version_string.hpp:49
bool operator<(const Version &rhs) const
Definition parse_version_string.hpp:145
bool operator!=(const Version &rhs) const
Definition parse_version_string.hpp:137