3#include "mc/_HeaderOutputPredefine.h"
4#include "mc/deps/core/sem_ver/SemVersionAnyVersionType.h"
7#include "mc/deps/core/string/StaticOptimizedString.h"
23 SemVersionBase() : mMajor(0), mMinor(0), mPatch(0), mValidVersion(
false), mAnyVersion(
false) {}
32 explicit SemVersionBase(uint16 major, uint16 minor, uint16 patch, T preRelease, T buildMeta)
38 mPreRelease(preRelease),
39 mBuildMeta(buildMeta) {}
41 MCAPI std::string asString()
const;
44template <
typename StringTypeLhs,
typename StringTypeRhs>
46 if (lhs.mAnyVersion && rhs.mAnyVersion) {
50 if (lhs.mAnyVersion || rhs.mAnyVersion) {
54 if (lhs.mMajor != rhs.mMajor || lhs.mMinor != rhs.mMinor || lhs.mPatch != rhs.mPatch) {
58 if (lhs.mPreRelease.length() != rhs.mPreRelease.length()) {
62 if (std::memcmp(&lhs.mPreRelease, &rhs.mPreRelease, rhs.mPreRelease.length()) != 0) {
68template <
typename StringTypeLhs,
typename StringTypeRhs>
73template <
typename StringTypeLhs,
typename StringTypeRhs>
75 if (lhs.mAnyVersion) {
79 if (rhs.mAnyVersion) {
83 if (lhs.mMajor != rhs.mMajor) {
84 return lhs.mMajor < rhs.mMajor;
87 if (lhs.mMinor != rhs.mMinor) {
88 return lhs.mMinor < rhs.mMinor;
91 if (lhs.mPatch != rhs.mPatch) {
92 return lhs.mPatch < rhs.mPatch;
95 if (lhs.mPreRelease.length() == 0 && rhs.mPreRelease.length() != 0) {
99 if (lhs.mPreRelease.length() != 0 && rhs.mPreRelease.length() == 0) {
103 auto versionSplit = [](std::string_view str,
char const delim =
'.') -> std::vector<std::string> {
104 std::vector<std::string> result;
107 while ((end = str.find(delim, start)) != std::string_view::npos) {
109 result.emplace_back(str.substr(start, end - start));
113 if (start < str.size()) {
114 result.emplace_back(str.substr(start));
119 std::vector<std::string> lhsParts = versionSplit(lhs.mPreRelease);
120 std::vector<std::string> rhsParts = versionSplit(rhs.mPreRelease);
122 for (
size_t i = 0; i < std::min(lhsParts.size(), rhsParts.size()); ++i) {
123 bool lhsNumeric = std::ranges::all_of(lhsParts[i], ::isdigit);
124 bool rhsNumeric = std::ranges::all_of(rhsParts[i], ::isdigit);
126 if (lhsNumeric && rhsNumeric) {
127 if (std::stoi(lhsParts[i]) != std::stoi(rhsParts[i])) {
128 return std::stoi(lhsParts[i]) < std::stoi(rhsParts[i]);
130 }
else if (lhsNumeric) {
132 }
else if (rhsNumeric) {
135 if (lhsParts[i] != rhsParts[i]) {
136 return lhsParts[i] < rhsParts[i];
140 return lhsParts.size() < rhsParts.size();
143template <
typename StringTypeLhs,
typename StringTypeRhs>
145 return lhs == rhs || lhs < rhs;
Definition SemVersionBase.h:13
Definition SemVersionAnyVersionType.h:5