lib/zen/src/theme/capacity.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const plan = @import("plan.zig");
3
4 pub const Limits = plan.Limits;
5
6 pub const Capacity = struct {
7 limits: Limits,
8 output_offset: usize,
9 storage_bytes: usize,
10
11 pub fn derive(limits: Limits) Capacity {
12 return .{
13 .limits = limits,
14 .output_offset = 0,
15 .storage_bytes = limits.max_output_bytes,
16 };
17 }
18 };
19
20 pub const default_capacity = Capacity.derive(plan.default_limits);
21
22 fn independent(limits: Limits) Capacity {
23 const output_offset = 0;
24 return .{
25 .limits = limits,
26 .output_offset = output_offset,
27 .storage_bytes = output_offset + limits.max_output_bytes,
28 };
29 }
30
31 test "theme render capacity matches an independent byte model" {
32 comptime {
33 @stardustClaim(
34 @import("alloc_phase").capacity.witness(@import("./root.zig").RenderStorage, "zen_theme_render_capacity"),
35 null,
36 null,
37 null,
38 null,
39 null,
40 null,
41 );
42 }
43
44 const limits = Limits{ .max_output_bytes = 583 };
45 try std.testing.expectEqual(independent(limits), Capacity.derive(limits));
46 try std.testing.expectEqual(@as(usize, 583), Capacity.derive(limits).storage_bytes);
47 try std.testing.expectEqual(Capacity.derive(plan.default_limits), default_capacity);
48 try std.testing.expectEqual(
49 plan.default_limits.max_output_bytes,
50 Capacity.derive(plan.default_limits).storage_bytes,
51 );
52 }
53
54 test "theme render capacity handles empty output" {
55 const capacity = Capacity.derive(.{ .max_output_bytes = 0 });
56 try std.testing.expectEqual(@as(usize, 0), capacity.output_offset);
57 try std.testing.expectEqual(@as(usize, 0), capacity.storage_bytes);
58 }