aboutsummaryrefslogtreecommitdiff
path: root/src/install/semver.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/install/semver.zig')
-rw-r--r--src/install/semver.zig31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/install/semver.zig b/src/install/semver.zig
index 880357a09..115c73568 100644
--- a/src/install/semver.zig
+++ b/src/install/semver.zig
@@ -9,6 +9,27 @@ pub const Version = struct {
extra_tags: []const Tag = &[_]Tag{},
raw: strings.StringOrTinyString = strings.StringOrTinyString.init(""),
+ pub fn hash(this: Version) u32 {
+ var hasher = std.hash.Wyhash.init(0);
+ const triplet = [3]u32{ this.major, this.minor, this.patch };
+
+ hasher.update(std.mem.sliceAsBytes(&triplet));
+ const pre = this.tag.pre.slice();
+ const build = this.tag.build.slice();
+
+ if (pre.len > 0) {
+ hasher.update("+");
+ hasher.update(pre);
+ }
+
+ if (build.len > 0) {
+ hasher.update("-");
+ hasher.update(build);
+ }
+
+ return @truncate(u32, hasher.final());
+ }
+
pub fn format(self: Version, comptime layout: []const u8, opts: std.fmt.FormatOptions, writer: anytype) !void {
try std.fmt.format(writer, "{d}.{d}.{d}", .{ self.major, self.minor, self.patch });
@@ -39,6 +60,16 @@ pub const Version = struct {
return lhs.major == rhs.major and lhs.minor == rhs.minor and lhs.patch == rhs.patch and rhs.tag.eql(lhs.tag);
}
+ pub const HashContext = struct {
+ pub fn hash(this: @This(), lhs: Version) u32 {
+ return lhs.hash();
+ }
+
+ pub fn eql(this: @This(), lhs: Version, rhs: Version) bool {
+ return lhs.eql(rhs);
+ }
+ };
+
pub fn order(lhs: Version, rhs: Version) std.math.Order {
if (lhs.major < rhs.major) return .lt;
if (lhs.major > rhs.major) return .gt;