7 #ifndef IFM3D_DEVICE_SEMVER_H
8 #define IFM3D_DEVICE_SEMVER_H
10 #include <fmt/format.h>
11 #include <ifm3d/device/module_device.h>
24 const std::optional<std::string>& prerelease = std::nullopt,
25 const std::optional<std::string>& build_meta = std::nullopt)
29 prerelease(prerelease),
30 build_meta(build_meta)
37 std::optional<std::string> prerelease;
38 std::optional<std::string> build_meta;
41 operator<(
const SemVer& rhs)
const
45 return major_num < rhs.major_num ||
46 (major_num == rhs.major_num &&
47 (minor_num < rhs.minor_num ||
48 (minor_num == rhs.minor_num && (patch_num < rhs.patch_num))));
52 operator==(
const SemVer& rhs)
const
54 return ((major_num == rhs.major_num) && (minor_num == rhs.minor_num) &&
55 (patch_num == rhs.patch_num) && (prerelease == rhs.prerelease) &&
56 (build_meta == rhs.build_meta));
60 operator!=(
const SemVer& rhs)
const
62 return !(*
this == rhs);
66 operator>=(
const SemVer& rhs)
const
68 return !(*
this < rhs);
72 operator>(
const SemVer& rhs)
const
78 operator<=(
const SemVer& rhs)
const
80 return !(rhs < *
this);
83 [[nodiscard]] std::string
86 std::string version = std::to_string(major_num) +
"." +
87 std::to_string(minor_num) +
"." +
88 std::to_string(patch_num);
90 if (prerelease.has_value())
92 version +=
"-" + prerelease.value();
95 if (build_meta.has_value())
97 version +=
"+" + build_meta.value();
105 operator<<(std::ostream& os,
const SemVer& version)
107 return os << version.ToString();
110 static std::optional<SemVer> Parse(
const std::string& version_string);
115 struct fmt::formatter<ifm3d::SemVer> : fmt::formatter<std::string_view>
118 format(
const ifm3d::SemVer& version, format_context& ctx)
const
120 const auto value = version.ToString();
121 return fmt::formatter<std::string_view>::format(value, ctx);