aboutsummaryrefslogtreecommitdiff
path: root/src/eval/Element.zig
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2026-04-26 22:07:03 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2026-04-26 22:07:03 +0200
commit1ce415538f202bf1319ebb0ff6e76aa54f983343 (patch)
treede7febaf453855229581fdc2dbcc92fd2bd1bed3 /src/eval/Element.zig
parentdca42e27fe9c7d28c72bb6cb8e5cc4ec481572e8 (diff)
perf(parse): reduce realloc for figcaptions
Diffstat (limited to 'src/eval/Element.zig')
-rw-r--r--src/eval/Element.zig18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/eval/Element.zig b/src/eval/Element.zig
index a8b424d..355e971 100644
--- a/src/eval/Element.zig
+++ b/src/eval/Element.zig
@@ -113,6 +113,24 @@ pub fn Simple(comptime tag: []const u8) type {
destroy(self, alloc);
}
+ pub fn toTag(self: *Self, alloc: Allocator, comptime target: []const u8) !*Simple(target) {
+ const el = try Simple(target).init(alloc);
+ self.conv(alloc, &el.content);
+ return el;
+ }
+
+ pub fn toEmpty(self: *Self, alloc: Allocator) !*Empty {
+ const el = try Empty.init(alloc);
+ self.conv(alloc, &el.content);
+ return el;
+ }
+
+ fn conv(self: *Self, alloc: Allocator, arr: *std.ArrayList(Element)) void {
+ arr.deinit(alloc);
+ arr.* = self.content;
+ alloc.destroy(self);
+ }
+
fn destroy(context: *anyopaque, alloc: Allocator) void {
var self: *Self = @ptrCast(@alignCast(context));
for (self.content.items) |it| it.deinit(alloc);