Skip to content

Commit 7dddb74

Browse files
committed
Merge branch 'a'
2 parents 0ed1cdf + eab4be4 commit 7dddb74

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

tests/version_tools_tests.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,70 @@ TEST_CASE("parse") {
77
CHECK(vers.major == 1);
88
CHECK(vers.minor == 2);
99
CHECK(vers.revision == 16);
10+
CHECK(vers.is_normal);
1011
}
1112

1213
{
1314
auto vers = VersionUtil::Version("9.1");
1415
CHECK(vers.major == 9);
1516
CHECK(vers.minor == 1);
1617
CHECK(vers.revision == 0);
18+
CHECK(vers.is_normal);
1719
}
1820

1921
{
2022
auto vers = VersionUtil::Version("2.0.99");
2123
CHECK(vers.major == 2);
2224
CHECK(vers.minor == 0);
2325
CHECK(vers.revision == 99);
26+
CHECK(vers.is_normal);
2427
}
2528

2629
{
2730
auto vers = VersionUtil::Version("209");
2831
CHECK(vers.major == 209);
2932
CHECK(vers.minor == 0);
3033
CHECK(vers.revision == 0);
34+
CHECK(vers.is_normal);
3135
}
3236

3337
{
3438
auto vers = VersionUtil::Version("garbage");
3539
CHECK(vers.major == 0);
3640
CHECK(vers.minor == 0);
3741
CHECK(vers.revision == 0);
42+
CHECK(vers.is_normal);
3843
}
3944

4045
{
4146
auto vers = VersionUtil::Version("67.BAD.123");
4247
CHECK(vers.major == 67);
4348
CHECK(vers.minor == 0);
4449
CHECK(vers.revision == 123);
50+
CHECK(vers.is_normal);
4551
}
4652

4753
{
4854
auto vers = VersionUtil::Version("77.-22.33");
4955
CHECK(vers.major == 77);
5056
CHECK(vers.minor == 0);
5157
CHECK(vers.revision == 33);
58+
CHECK(vers.is_normal);
5259
}
5360
{
5461
auto vers = VersionUtil::Version("1.2.3-dev");
5562
CHECK(vers.major == 1);
5663
CHECK(vers.minor == 2);
5764
CHECK(vers.revision == 3);
65+
CHECK_FALSE(vers.is_normal);
66+
}
67+
{
68+
auto vers = VersionUtil::Version("1.2.3");
69+
CHECK(vers.is_normal);
70+
}
71+
{
72+
auto vers = VersionUtil::Version("1.2.3-");
73+
CHECK_FALSE(vers.is_normal);
5874
}
5975
}
6076

util/version_tools.hh

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
2-
#include <cstdlib>
32
#include <cstdint>
3+
#include <cstdlib>
44
#include <string_view>
55

66
namespace VersionUtil
@@ -10,10 +10,11 @@ struct Version {
1010
uint8_t major{};
1111
uint8_t minor{};
1212
uint8_t revision{};
13+
bool is_normal{true}; // i.e. not a pre-release
1314

1415
void set_field(unsigned index, unsigned val) {
1516
//sanity check:
16-
if (val > 9999)
17+
if (val > 255)
1718
return;
1819

1920
if (index == 0)
@@ -29,7 +30,8 @@ struct Version {
2930
Version(uint8_t maj, uint8_t min, uint8_t rev)
3031
: major{maj}
3132
, minor{min}
32-
, revision{rev} {
33+
, revision{rev}
34+
, is_normal{true} {
3335
}
3436

3537
Version(std::string_view vers) {
@@ -47,8 +49,11 @@ struct Version {
4749
auto num = strtol(token.data(), nullptr, 10);
4850
set_field(i++, num);
4951

50-
if (pos == std::string_view::npos)
52+
if (pos == std::string_view::npos) {
53+
// "normal" means not a pre-release, meaning there's no dash after the last number
54+
is_normal = vers.find_first_of('-') == vers.npos;
5155
break;
56+
}
5257
}
5358
}
5459

@@ -58,11 +63,13 @@ struct Version {
5863
}
5964

6065
auto operator<=>(Version const &other) const {
61-
if (major == other.major && minor == other.minor && revision == other.revision)
66+
if (major == other.major && minor == other.minor && revision == other.revision && is_normal == other.is_normal)
6267
return std::strong_ordering::equal;
6368

6469
if ((major < other.major) || (major == other.major && minor < other.minor) ||
65-
(major == other.major && minor == other.minor && revision < other.revision))
70+
(major == other.major && minor == other.minor && revision < other.revision) ||
71+
(major == other.major && minor == other.minor && revision == other.revision && !is_normal &&
72+
other.is_normal))
6673
return std::strong_ordering::less;
6774

6875
return std::strong_ordering::greater;

0 commit comments

Comments
 (0)