const std = @import("std"); const Self = @This(); pub const Precision = enum(u1) { b8 = 0, b16 = 1, }; const Header = packed struct(u8) { identifier: u4, precision: u4, }; precision: Precision, identifier: u2, elements: union(Precision) { b8: [64]u8, b16: [64]u16, }, pub fn read(reader: *std.Io.Reader) !Self { const header: Header = @bitCast(try reader.takeByte()); var self: Self = undefined; self.identifier = @truncate(header.identifier); self.precision = @enumFromInt(@as(u1, @truncate(header.precision))); switch (self.precision) { .b8 => { self.elements = .{ .b8 = undefined }; for (&self.elements.b8) |*element| { element.* = try reader.takeByte(); } }, .b16 => { self.elements = .{ .b16 = undefined }; for (&self.elements.b16) |*element| { element.* = try reader.takeInt(u16, .big); } }, } return self; } pub fn size_in_file(self: Self) usize { return 65 + 64 * @as(usize, @intFromEnum(self.precision)); }