lib/zen/src/diagram/document/capacity.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 
 3 const plan_mod = @import("plan.zig");
 4 
 5 pub const Limits = plan_mod.Limits;
 6 pub const DeriveError = error{CapacityOverflow};
 7 
 8 pub const Capacity = struct {
 9     limits: Limits,
10     line_scratch_bytes: usize,
11     document_bytes: usize,
12     storage_bytes: usize,
13 
14     pub fn derive(limits: Limits) DeriveError!Capacity {
15         return .{
16             .limits = limits,
17             .line_scratch_bytes = limits.max_line_scratch_bytes,
18             .document_bytes = limits.max_document_bytes,
19             .storage_bytes = try added(
20                 limits.max_line_scratch_bytes,
21                 limits.max_document_bytes,
22             ),
23         };
24     }
25 };
26 
27 fn added(left: usize, right: usize) DeriveError!usize {
28     return std.math.add(usize, left, right) catch error.CapacityOverflow;
29 }
30 
31 fn independent(limits: Limits) DeriveError!Capacity {
32     const storage_bytes = @as(u128, limits.max_line_scratch_bytes) +
33         limits.max_document_bytes;
34     if (storage_bytes > std.math.maxInt(usize)) return error.CapacityOverflow;
35     return .{
36         .limits = limits,
37         .line_scratch_bytes = limits.max_line_scratch_bytes,
38         .document_bytes = limits.max_document_bytes,
39         .storage_bytes = @intCast(storage_bytes),
40     };
41 }
42 
43 test "diagram Document capacity matches an independent byte model" {
44     comptime {
45         @stardustClaim(
46             @import("alloc_phase").capacity.witness(@import("./root.zig").Storage, "zen_diagram_document_capacity"),
47             null,
48             null,
49             null,
50             null,
51             null,
52             null,
53         );
54     }
55 
56     const limits = Limits{
57         .max_line_scratch_bytes = 7_744,
58         .max_document_bytes = 4_594,
59     };
60     const capacity = try Capacity.derive(limits);
61     try std.testing.expectEqual(try independent(limits), capacity);
62     try std.testing.expectEqual(@as(usize, 12_338), capacity.storage_bytes);
63 }
64 
65 test "diagram Document capacity handles zero and rejects overflow" {
66     try std.testing.expectEqual(@as(usize, 0), (try Capacity.derive(.{
67         .max_line_scratch_bytes = 0,
68         .max_document_bytes = 0,
69     })).storage_bytes);
70     try std.testing.expectError(error.CapacityOverflow, Capacity.derive(.{
71         .max_line_scratch_bytes = std.math.maxInt(usize),
72         .max_document_bytes = 1,
73     }));
74 }