lib/choir/src/backends/artifact/model/payload/owner.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const payload = @import("root.zig");
3
4 const Allocator = std.mem.Allocator;
5
6 pub const Payload = struct {
7 allocator: Allocator,
8 debug_records: std.ArrayListUnmanaged(payload.DebugRecord) = .empty,
9 buffers: std.ArrayListUnmanaged(payload.ArtifactBuffer) = .empty,
10 text_dumps: std.ArrayListUnmanaged(payload.TextDump) = .empty,
11
12 pub fn init(allocator: Allocator) Payload {
13 return .{ .allocator = allocator };
14 }
15
16 pub fn addDebugRecord(self: *Payload, record: payload.DebugRecord) Allocator.Error!void {
17 try self.debug_records.ensureTotalCapacity(self.allocator, self.debug_records.items.len + 1);
18 const owned = try record.dupe(self.allocator);
19 self.debug_records.appendAssumeCapacity(owned);
20 }
21
22 pub fn addBuffer(self: *Payload, buffer: payload.ArtifactBuffer) Allocator.Error!void {
23 try self.buffers.ensureTotalCapacity(self.allocator, self.buffers.items.len + 1);
24 const owned = try buffer.dupe(self.allocator);
25 self.buffers.appendAssumeCapacity(owned);
26 }
27
28 pub fn addTextDump(self: *Payload, dump: payload.TextDump) Allocator.Error!void {
29 try self.text_dumps.ensureTotalCapacity(self.allocator, self.text_dumps.items.len + 1);
30 const owned = try dump.dupe(self.allocator);
31 self.text_dumps.appendAssumeCapacity(owned);
32 }
33
34 pub fn cloneInto(self: Payload, target: *Payload) Allocator.Error!void {
35 for (self.debug_records.items) |record| try target.addDebugRecord(record);
36 for (self.buffers.items) |buffer| try target.addBuffer(buffer);
37 for (self.text_dumps.items) |dump| try target.addTextDump(dump);
38 }
39
40 pub fn deinit(self: *Payload) void {
41 for (self.debug_records.items) |record| record.deinit(self.allocator);
42 self.debug_records.deinit(self.allocator);
43 for (self.buffers.items) |buffer| buffer.deinit(self.allocator);
44 self.buffers.deinit(self.allocator);
45 for (self.text_dumps.items) |dump| dump.deinit(self.allocator);
46 self.text_dumps.deinit(self.allocator);
47 self.* = undefined;
48 }
49
50 pub fn eql(self: Payload, other: Payload) bool {
51 if (self.debug_records.items.len != other.debug_records.items.len or
52 self.buffers.items.len != other.buffers.items.len or
53 self.text_dumps.items.len != other.text_dumps.items.len)
54 {
55 return false;
56 }
57 for (self.debug_records.items, other.debug_records.items) |left, right| {
58 if (!left.eql(right)) return false;
59 }
60 for (self.buffers.items, other.buffers.items) |left, right| {
61 if (!left.eql(right)) return false;
62 }
63 for (self.text_dumps.items, other.text_dumps.items) |left, right| {
64 if (!left.eql(right)) return false;
65 }
66 return true;
67 }
68 };