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 }