25#ifndef JAU_VERSIONNUMBER_HPP_
26#define JAU_VERSIONNUMBER_HPP_
61 constexpr static const bool DBG_OUT =
false;
63 constexpr static const uint16_t
HAS_MAJOR = 1U << 0;
64 constexpr static const uint16_t
HAS_MINOR = 1U << 1;
65 constexpr static const uint16_t
HAS_SUB = 1U << 2;
69 int gitCommits, uint64_t gitSSHA,
bool gitDirty,
70 uint16_t _state) noexcept
83 constexpr VersionNumber(
int majorRev,
int minorRev,
int subMinorRev,
int gitCommits, uint64_t gitSSHA,
bool gitDirty) noexcept
85 gitCommits, gitSSHA, gitDirty,
94 constexpr VersionNumber(
int majorRev,
int minorRev,
int subMinorRev) noexcept
127 constexpr int sub() const noexcept {
return m_sub; }
141 return std::strong_ordering::greater;
142 }
else if (
m_major < vo.m_major ) {
143 return std::strong_ordering::less;
144 }
else if (
m_minor > vo.m_minor ) {
145 return std::strong_ordering::greater;
146 }
else if (
m_minor < vo.m_minor ) {
147 return std::strong_ordering::less;
148 }
else if (
m_sub > vo.m_sub ) {
149 return std::strong_ordering::greater;
150 }
else if (
m_sub < vo.m_sub ) {
151 return std::strong_ordering::less;
155 return std::strong_ordering::greater;
157 return std::strong_ordering::less;
159 return std::strong_ordering::greater;
161 return std::strong_ordering::less;
163 return std::strong_ordering::greater;
165 return std::strong_ordering::less;
168 return std::strong_ordering::equal;
171 constexpr std::size_t
hash() const noexcept {
173 std::size_t h = 31 +
major();
174 h = ((h << 5) - h) +
minor();
175 h = ((h << 5) - h) +
sub();
177 return (h << 1) + (
git_dirty() ? 1 : 0 );
181 std::string res = std::to_string(
m_major) +
"." + std::to_string(
m_minor) +
"." + std::to_string(
m_sub);
183 res.append(
", git[post ").append(std::to_string(
m_git_commits))
198 return out << v.toString();
216 std::string m_version_str;
220 int gitCommits, uint64_t gitSSHA,
bool gitDirty,
221 uint16_t _state, ssize_t strEnd, std::string _version_str) noexcept
222 :
VersionNumber(majorRev, minorRev, subMinorRev, gitCommits, gitSSHA, gitDirty, _state),
223 m_strEnd(strEnd), m_version_str(std::move(_version_str)) { }
229 return std::regex( R
"(\D*(\d+)[^\)" + delim + R"(\s]*(?:\)" + delim + R"(\D*(\d+)[^\)" + delim + R"(\s]*(?:\)" + delim + R"(\D*(\d+))?)?)");
235 return std::regex( R
"(\D*(\d+)[^\)" + delim + R"(\s]*(?:\)" + delim + R"(\D*(\d+)[^\)" + delim + R"(\s]*(?:\)" + delim + R"(\D*(\d+)(?:\-(\d+)\-g([0-9a-f]+)(\-dirty)?)?)?)?)");
281 if ( std::regex_search(
versionString, match, versionPattern) ) {
282 m_strEnd = match.position() + match.length();
285 std::cout <<
"XXX: match pos " << match.position() <<
", len " << match.length() <<
", sz " << match.size() << std::endl;
286 for (
size_t i = 0; i < match.size(); ++i ) {
287 const std::string& s = match[i];
288 std::cout <<
"- [" << i <<
"]: '" << s <<
"', len " << s.length() << std::endl;
291 if ( match.size() >= 2 && match[1].length() > 0 ) {
294 if ( match.size() >= 3 && match[2].length() > 0 ) {
297 if ( match.size() >= 4 && match[3].length() > 0 ) {
298 m_sub = std::stoi(match[3]);
300 if ( match.size() >= 5 && match[4].length() > 0 ) {
304 std::cout <<
"XXX: git commits " <<
m_git_commits << std::endl;
306 if ( match.size() >= 6 && match[5].length() > 0 ) {
314 if ( match.size() >= 7 && match[6].length() > 0 ) {
317 std::cout <<
"XXX: git dirty " <<
m_git_dirty << std::endl;
366 constexpr bool hasString() const noexcept {
return m_version_str.length() > 0; }
368 constexpr const std::string&
versionString() const noexcept {
return m_version_str; }
377 std::string res = std::to_string(
m_major) +
"." + std::to_string(
m_minor) +
"." + std::to_string(
m_sub);
379 res.append(
", git[post ").append(std::to_string(
m_git_commits))
390 res.append(
" (").append(m_version_str).append(
")");
397 return out << v.toString();
403 template<>
struct hash<
jau::util::VersionNumber>
Simple version number class containing a version number either being defined explicit or derived from...
static std::regex getGitPattern(const std::string &delim)
VersionNumberString(VersionNumberString &&) noexcept=default
constexpr bool hasString() const noexcept
Returns true if constructed with a version-string, otherwise false.
static std::regex getNonGitPattern(const std::string &delim)
VersionNumberString(const std::string &versionString) noexcept
String derived version number instantiation.
static const std::regex & getDefaultPattern() noexcept
std::string toString() const noexcept
constexpr const std::string & versionString() const noexcept
Returns the used version-string, empty if not constructed with such.
VersionNumberString(const std::string &versionString, const std::string &delim) noexcept
String derived version number instantiation.
constexpr VersionNumberString() noexcept
Default ctor for zero version.
VersionNumberString(const VersionNumberString &) noexcept=default
constexpr VersionNumberString(int majorRev, int minorRev, int subMinorRev, int gitCommits, uint64_t gitSSHA, bool gitDirty, uint16_t _state, ssize_t strEnd, std::string _version_str) noexcept
constexpr ssize_t endOfStringMatch() const noexcept
If constructed with version-string, returns the string offset after the last matching character,...
Simple version number class containing a version number either being defined explicit or derived from...
std::string toString() const noexcept
constexpr bool hasMajor() const noexcept
Returns true, if the major component is defined explicitly, otherwise false.
constexpr VersionNumber() noexcept
Default ctor for zero version.
constexpr uint64_t git_ssha() const noexcept
static constexpr const uint16_t HAS_MINOR
static constexpr const uint16_t HAS_SUB
constexpr int major() const noexcept
constexpr VersionNumber(int majorRev, int minorRev, int subMinorRev) noexcept
Explicit version number instantiation, with all components defined explicitly excluding git.
static constexpr const uint16_t HAS_MAJOR
constexpr VersionNumber(int majorRev, int minorRev, int subMinorRev, int gitCommits, uint64_t gitSSHA, bool gitDirty, uint16_t _state) noexcept
constexpr std::size_t hash() const noexcept
static constexpr const uint16_t HAS_GIT_INFO
constexpr bool isZero() const noexcept
Returns true, if all version components are zero, otherwise false.
constexpr bool hasMinor() const noexcept
Returns true, if the optional minor component is defined explicitly, otherwise false.
constexpr VersionNumber(int majorRev, int minorRev, int subMinorRev, int gitCommits, uint64_t gitSSHA, bool gitDirty) noexcept
Explicit version number instantiation, with all components defined explicitly including git.
static constexpr const bool DBG_OUT
constexpr bool operator==(const VersionNumber &vo) const noexcept
Two way comparison operator.
constexpr int sub() const noexcept
constexpr bool hasGitInfo() const noexcept
Returns true, if the optional git information is defined explicitly, otherwise false.
constexpr int git_commits() const noexcept
constexpr int minor() const noexcept
constexpr bool git_dirty() const noexcept
constexpr VersionNumber(VersionNumber &&) noexcept=default
constexpr bool hasSub() const noexcept
Returns true, if the optional sub component is defined explicitly, otherwise false.
constexpr std::strong_ordering operator<=>(const VersionNumber &vo) const noexcept
Three way std::strong_ordering comparison operator.
constexpr VersionNumber(const VersionNumber &) noexcept=default
@ little
Identifier for little endian, equivalent to endian::little.
SizeBoolPair fromHexString(std::vector< uint8_t > &out, const uint8_t hexstr[], const size_t hexstr_len, const lb_endian_t byteOrder=lb_endian_t::big, const Bool checkPrefix=Bool::True) noexcept
Converts a given hexadecimal string representation into a byte vector, lsb-first.
std::string toHexString(const void *data, const nsize_t length, const lb_endian_t byteOrder=lb_endian_t::big, const LoUpCase capitalization=LoUpCase::lower, const PrefixOpt prefix=PrefixOpt::prefix) noexcept
Produce a hexadecimal string representation of the given lsb-first byte values.
std::ostream & operator<<(std::ostream &out, const VersionNumber &v) noexcept
__pack(...): Produces MSVC, clang and gcc compatible lead-in and -out macros.
std::size_t operator()(const jau::util::VersionNumber &v) const noexcept