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 };