lib/pluck/src/state/callstack.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const pluck = @import("../root.zig");
 3 
 4 const Bdd = pluck.bdd.Bdd;
 5 
 6 pub const CallstackKey = struct {
 7     callstack: []const i32,
 8     prob: f64,
 9 };
10 
11 pub const CallstackHashContext = struct {
12     pub fn hash(_: @This(), key: CallstackKey) u64 {
13         var h = std.hash.Wyhash.init(0);
14         h.update(std.mem.sliceAsBytes(key.callstack));
15         h.update(std.mem.asBytes(&key.prob));
16         return h.final();
17     }
18 
19     pub fn eql(_: @This(), a: CallstackKey, b: CallstackKey) bool {
20         if (a.prob != b.prob) return false;
21         return std.mem.eql(i32, a.callstack, b.callstack);
22     }
23 };
24 
25 pub fn compareCallstacks(a: []const i32, b: []const i32) std.math.Order {
26     const min_len = @min(a.len, b.len);
27     for (0..min_len) |i| {
28         if (a[i] < b[i]) return .lt;
29         if (a[i] > b[i]) return .gt;
30     }
31     if (a.len < b.len) return .lt;
32     if (a.len > b.len) return .gt;
33     return .eq;
34 }