lib/choir/src/product/hashing/root.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const ir = @import("../../core/root.zig");
3
4 pub const capacity = @import("capacity.zig");
5 pub const index = @import("index.zig");
6 pub const numbering = @import("numbering.zig");
7 pub const stable = @import("stable.zig");
8 pub const walk = @import("walk.zig");
9
10 pub const maximum_operation_depth = capacity.maximum_operation_depth;
11 pub const maximum_attribute_depth = capacity.maximum_attribute_depth;
12 pub const StableHasher = stable.StableHasher;
13 pub const StableValueNumbering = numbering.StableValueNumbering;
14 pub const OperationFingerprintError = std.mem.Allocator.Error || capacity.InspectError || error{
15 CapacityOverflow,
16 DuplicateValueDefinition,
17 InputChanged,
18 };
19
20 pub fn operationFingerprint(
21 allocator: std.mem.Allocator,
22 operation: *ir.Operation,
23 ) OperationFingerprintError!u64 {
24 const limits = try StableHasher.Limits.inspect(operation);
25 var hasher = try StableHasher.init(allocator, limits);
26 defer hasher.deinit(allocator);
27 hasher.activate() catch |err| switch (err) {
28 error.AlreadyActive => unreachable,
29 error.InputChanged => return error.InputChanged,
30 };
31 return hasher.fingerprint();
32 }