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 }