feature. See also
. The project being documented here (as the example) is the Zig library itself.
BitcodeReader.Abbrev
const Abbrev = struct
File
Code
const Abbrev = struct {
operands: []const Operand,
const Builtin = enum(u2) {
end_block,
enter_subblock,
define_abbrev,
unabbrev_record,
const first_record_id: u32 = std.math.maxInt(u32) - @typeInfo(Builtin).@"enum".field_names.len + 1;
fn toRecordId(builtin: Builtin) u32 {
return first_record_id + @backingInt(builtin);
}
};
const Operand = union(enum) {
literal: u64,
encoding: union(Encoding) {
fixed: u7,
vbr: u6,
array: u3,
char6,
blob: u3,
},
align_32_bits,
block_len,
abbrev_op,
const literal_id = std.math.maxInt(u64);
const Encoding = enum(u3) {
fixed = 1,
vbr = 2,
array = 3,
char6 = 4,
blob = 5,
_,
};
};
const Store = struct {
abbrevs: std.ArrayList(Abbrev),
fn deinit(store: *Store, allocator: std.mem.Allocator) void {
for (store.abbrevs.items) |abbrev| allocator.free(abbrev.operands);
store.abbrevs.deinit(allocator);
store.* = undefined;
}
fn addAbbrev(store: *Store, allocator: std.mem.Allocator, abbrev: Abbrev) !void {
try store.ensureUnusedCapacity(allocator, 1);
store.addAbbrevAssumeCapacity(abbrev);
}
fn addAbbrevAssumeCapacity(store: *Store, allocator: std.mem.Allocator, abbrev: Abbrev) !void {
store.abbrevs.appendAssumeCapacity(.{
.operands = try allocator.dupe(Abbrev.Operand, abbrev.operands),
});
}
fn addOwnedAbbrev(store: *Store, allocator: std.mem.Allocator, abbrev: Abbrev) !void {
try store.abbrevs.ensureUnusedCapacity(allocator, 1);
store.addOwnedAbbrevAssumeCapacity(abbrev);
}
fn addOwnedAbbrevAssumeCapacity(store: *Store, abbrev: Abbrev) void {
store.abbrevs.appendAssumeCapacity(abbrev);
}
};
}