Use new IdRenderer in vulkan/generator.zig

This commit is contained in:
Robin Voetter
2020-08-13 01:00:52 +02:00
parent 443d180f1e
commit d87868c510
2 changed files with 26 additions and 15 deletions

View File

@@ -3,7 +3,7 @@ const reg = @import("registry.zig");
const xml = @import("../xml.zig"); const xml = @import("../xml.zig");
const renderRegistry = @import("render.zig").render; const renderRegistry = @import("render.zig").render;
const parseXml = @import("parse.zig").parseXml; const parseXml = @import("parse.zig").parseXml;
const util = @import("util.zig"); const IdRenderer = @import("../id_render.zig").IdRenderer;
const mem = std.mem; const mem = std.mem;
const Allocator = mem.Allocator; const Allocator = mem.Allocator;
const FeatureLevel = reg.FeatureLevel; const FeatureLevel = reg.FeatureLevel;
@@ -114,12 +114,14 @@ const TagFixerUpper = struct {
gpa: *Allocator, gpa: *Allocator,
registry: *reg.Registry, registry: *reg.Registry,
names: std.StringHashMap(NameInfo), names: std.StringHashMap(NameInfo),
id_renderer: *const IdRenderer,
fn init(gpa: *Allocator, registry: *reg.Registry) TagFixerUpper { fn init(gpa: *Allocator, registry: *reg.Registry, id_renderer: *const IdRenderer) TagFixerUpper {
return .{ return .{
.gpa = gpa, .gpa = gpa,
.registry = registry, .registry = registry,
.names = std.StringHashMap(NameInfo).init(gpa), .names = std.StringHashMap(NameInfo).init(gpa),
.id_renderer = id_renderer,
}; };
} }
@@ -128,7 +130,7 @@ const TagFixerUpper = struct {
} }
fn insertName(self: *TagFixerUpper, name: []const u8) !void { fn insertName(self: *TagFixerUpper, name: []const u8) !void {
const tagless = util.stripAuthorTag(name, self.registry.tags); const tagless = self.id_renderer.stripAuthorTag(name);
const is_tagged = tagless.len != name.len; const is_tagged = tagless.len != name.len;
const result = try self.names.getOrPut(tagless); const result = try self.names.getOrPut(tagless);
@@ -162,7 +164,7 @@ const TagFixerUpper = struct {
} }
fn fixName(self: *TagFixerUpper, name: *[]const u8) !void { fn fixName(self: *TagFixerUpper, name: *[]const u8) !void {
const tagless = util.stripAuthorTag(name.*, self.registry.tags); const tagless = self.id_renderer.stripAuthorTag(name.*);
const info = self.names.get(tagless) orelse return error.InvalidRegistry; const info = self.names.get(tagless) orelse return error.InvalidRegistry;
if (info.tagless_name_exists) { if (info.tagless_name_exists) {
name.* = tagless; name.* = tagless;
@@ -235,17 +237,24 @@ pub const Generator = struct {
gpa: *Allocator, gpa: *Allocator,
reg_arena: std.heap.ArenaAllocator, reg_arena: std.heap.ArenaAllocator,
registry: reg.Registry, registry: reg.Registry,
id_renderer: IdRenderer,
fn init(allocator: *Allocator, spec: *xml.Element) !Generator { fn init(allocator: *Allocator, spec: *xml.Element) !Generator {
const result = try parseXml(allocator, spec); const result = try parseXml(allocator, spec);
const tags = try allocator.alloc([]const u8, result.registry.tags.len);
for (tags) |*tag, i| tag.* = result.registry.tags[i].name;
return Generator{ return Generator{
.gpa = allocator, .gpa = allocator,
.reg_arena = result.arena, .reg_arena = result.arena,
.registry = result.registry, .registry = result.registry,
.id_renderer = IdRenderer.init(allocator, tags),
}; };
} }
fn deinit(self: Generator) void { fn deinit(self: Generator) void {
self.gpa.free(self.id_renderer.tags);
self.reg_arena.deinit(); self.reg_arena.deinit();
} }
@@ -261,12 +270,12 @@ pub const Generator = struct {
} }
fn stripFlagBits(self: Generator, name: []const u8) []const u8 { fn stripFlagBits(self: Generator, name: []const u8) []const u8 {
const tagless = util.stripAuthorTag(name, self.registry.tags); const tagless = self.id_renderer.stripAuthorTag(name);
return tagless[0 .. tagless.len - "FlagBits".len]; return tagless[0 .. tagless.len - "FlagBits".len];
} }
fn stripFlags(self: Generator, name: []const u8) []const u8 { fn stripFlags(self: Generator, name: []const u8) []const u8 {
const tagless = util.stripAuthorTag(name, self.registry.tags); const tagless = self.id_renderer.stripAuthorTag(name);
return tagless[0 .. tagless.len - "Flags".len]; return tagless[0 .. tagless.len - "Flags".len];
} }
@@ -306,13 +315,13 @@ pub const Generator = struct {
} }
fn fixupTags(self: *Generator) !void { fn fixupTags(self: *Generator) !void {
var fixer_upper = TagFixerUpper.init(self.gpa, &self.registry); var fixer_upper = TagFixerUpper.init(self.gpa, &self.registry, &self.id_renderer);
defer fixer_upper.deinit(); defer fixer_upper.deinit();
try fixer_upper.fixup(); try fixer_upper.fixup();
} }
fn render(self: *Generator, out_stream: anytype) !void { fn render(self: *Generator, writer: anytype) !void {
try renderRegistry(out_stream, &self.reg_arena.allocator, &self.registry); try renderRegistry(writer, &self.reg_arena.allocator, &self.registry, &self.id_renderer);
} }
}; };

View File

@@ -4,6 +4,8 @@ const id_render = @import("../id_render.zig");
const cparse = @import("c_parse.zig"); const cparse = @import("c_parse.zig");
const mem = std.mem; const mem = std.mem;
const Allocator = mem.Allocator; const Allocator = mem.Allocator;
const CaseStyle = id_render.CaseStyle;
const IdRenderer = id_render.IdRenderer;
const preamble = const preamble =
\\ \\
@@ -167,9 +169,9 @@ fn Renderer(comptime WriterType: type) type {
writer: WriterType, writer: WriterType,
allocator: *Allocator, allocator: *Allocator,
registry: *const reg.Registry, registry: *const reg.Registry,
id_renderer: id_render.IdRenderer, id_renderer: *IdRenderer,
fn init(writer: WriterType, allocator: *Allocator, registry: *const reg.Registry) !Self { fn init(writer: WriterType, allocator: *Allocator, registry: *const reg.Registry, id_renderer: *IdRenderer) !Self {
const tags = try allocator.alloc([]const u8, registry.tags.len); const tags = try allocator.alloc([]const u8, registry.tags.len);
for (tags) |*tag, i| tag.* = registry.tags[i].name; for (tags) |*tag, i| tag.* = registry.tags[i].name;
@@ -177,7 +179,7 @@ fn Renderer(comptime WriterType: type) type {
.writer = writer, .writer = writer,
.allocator = allocator, .allocator = allocator,
.registry = registry, .registry = registry,
.id_renderer = id_render.IdRenderer.init(allocator, tags), .id_renderer = id_renderer,
}; };
} }
@@ -190,7 +192,7 @@ fn Renderer(comptime WriterType: type) type {
try self.id_renderer.render(self.writer, id); try self.id_renderer.render(self.writer, id);
} }
fn writeIdentifierWithCase(self: *Self, case: id_render.CaseStyle, id: []const u8) !void { fn writeIdentifierWithCase(self: *Self, case: CaseStyle, id: []const u8) !void {
try self.id_renderer.renderWithCase(self.writer, case, id); try self.id_renderer.renderWithCase(self.writer, case, id);
} }
@@ -1097,8 +1099,8 @@ fn Renderer(comptime WriterType: type) type {
}; };
} }
pub fn render(writer: anytype, allocator: *Allocator, registry: *const reg.Registry) !void { pub fn render(writer: anytype, allocator: *Allocator, registry: *const reg.Registry, id_renderer: *IdRenderer) !void {
var renderer = try Renderer(@TypeOf(writer)).init(writer, allocator, registry); var renderer = try Renderer(@TypeOf(writer)).init(writer, allocator, registry, id_renderer);
defer renderer.deinit(); defer renderer.deinit();
try renderer.render(); try renderer.render();
} }