var data = {lines:[ {"lineNum":" 1","line":"const std = @import(\"../std.zig\");"}, {"lineNum":" 2","line":"const builtin = std.builtin;"}, {"lineNum":" 3","line":"const io = std.io;"}, {"lineNum":" 4","line":"const testing = std.testing;"}, {"lineNum":" 5","line":"const assert = std.debug.assert;"}, {"lineNum":" 6","line":"const trait = std.meta.trait;"}, {"lineNum":" 7","line":"const meta = std.meta;"}, {"lineNum":" 8","line":"const math = std.math;"}, {"lineNum":" 9","line":""}, {"lineNum":" 10","line":"/// Creates a stream which allows for writing bit fields to another stream"}, {"lineNum":" 11","line":"pub fn BitOutStream(endian: builtin.Endian, comptime OutStreamType: type) type {"}, {"lineNum":" 12","line":" return struct {"}, {"lineNum":" 13","line":" out_stream: OutStreamType,"}, {"lineNum":" 14","line":" bit_buffer: u8,"}, {"lineNum":" 15","line":" bit_count: u4,"}, {"lineNum":" 16","line":""}, {"lineNum":" 17","line":" pub const Error = OutStreamType.Error;"}, {"lineNum":" 18","line":" pub const OutStream = io.OutStream(*Self, Error, write);"}, {"lineNum":" 19","line":""}, {"lineNum":" 20","line":" const Self = @This();"}, {"lineNum":" 21","line":" const u8_bit_count = comptime meta.bitCount(u8);"}, {"lineNum":" 22","line":" const u4_bit_count = comptime meta.bitCount(u4);"}, {"lineNum":" 23","line":""}, {"lineNum":" 24","line":" pub fn init(out_stream: OutStreamType) Self {","class":"lineCov","hits":"3","order":"13922","possible_hits":"3",}, {"lineNum":" 25","line":" return Self{","class":"lineCov","hits":"3","order":"13926","possible_hits":"3",}, {"lineNum":" 26","line":" .out_stream = out_stream,","class":"lineCov","hits":"3","order":"13923","possible_hits":"3",}, {"lineNum":" 27","line":" .bit_buffer = 0,","class":"lineCov","hits":"3","order":"13924","possible_hits":"3",}, {"lineNum":" 28","line":" .bit_count = 0,","class":"lineCov","hits":"3","order":"13925","possible_hits":"3",}, {"lineNum":" 29","line":" };"}, {"lineNum":" 30","line":" }"}, {"lineNum":" 31","line":""}, {"lineNum":" 32","line":" /// Write the specified number of bits to the stream from the least significant bits of"}, {"lineNum":" 33","line":" /// the specified unsigned int value. Bits will only be written to the stream when there"}, {"lineNum":" 34","line":" /// are enough to fill a byte."}, {"lineNum":" 35","line":" pub fn writeBits(self: *Self, value: var, bits: usize) Error!void {","class":"linePartCov","hits":"71","order":"13928","possible_hits":"80",}, {"lineNum":" 36","line":" if (bits == 0) return;","class":"lineCov","hits":"40","order":"13929","possible_hits":"40",}, {"lineNum":" 37","line":""}, {"lineNum":" 38","line":" const U = @TypeOf(value);"}, {"lineNum":" 39","line":" comptime assert(trait.isUnsignedInt(U));"}, {"lineNum":" 40","line":""}, {"lineNum":" 41","line":" //by extending the buffer to a minimum of u8 we can cover a number of edge cases"}, {"lineNum":" 42","line":" // related to shifting and casting."}, {"lineNum":" 43","line":" const u_bit_count = comptime meta.bitCount(U);"}, {"lineNum":" 44","line":" const buf_bit_count = bc: {"}, {"lineNum":" 45","line":" assert(u_bit_count >= bits);","class":"linePartCov","hits":"38","order":"13930","possible_hits":"40",}, {"lineNum":" 46","line":" break :bc if (u_bit_count <= u8_bit_count) u8_bit_count else u_bit_count;"}, {"lineNum":" 47","line":" };"}, {"lineNum":" 48","line":" const Buf = std.meta.Int(false, buf_bit_count);"}, {"lineNum":" 49","line":" const BufShift = math.Log2Int(Buf);"}, {"lineNum":" 50","line":""}, {"lineNum":" 51","line":" const buf_value = @intCast(Buf, value);","class":"lineCov","hits":"38","order":"13931","possible_hits":"38",}, {"lineNum":" 52","line":""}, {"lineNum":" 53","line":" const high_byte_shift = @intCast(BufShift, buf_bit_count - u8_bit_count);"}, {"lineNum":" 54","line":" var in_buffer = switch (endian) {","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 55","line":" .Big => buf_value << @intCast(BufShift, buf_bit_count - bits),","class":"linePartCov","hits":"16","order":"13932","possible_hits":"46",}, {"lineNum":" 56","line":" .Little => buf_value,","class":"lineCov","hits":"22","order":"13979","possible_hits":"22",}, {"lineNum":" 57","line":" };"}, {"lineNum":" 58","line":" var in_bits = bits;","class":"linePartCov","hits":"38","order":"13933","possible_hits":"40",}, {"lineNum":" 59","line":""}, {"lineNum":" 60","line":" if (self.bit_count > 0) {","class":"linePartCov","hits":"64","order":"13934","possible_hits":"80",}, {"lineNum":" 61","line":" const bits_remaining = u8_bit_count - self.bit_count;","class":"linePartCov","hits":"35","order":"13941","possible_hits":"80",}, {"lineNum":" 62","line":" const n = @intCast(u3, if (bits_remaining > bits) bits else bits_remaining);","class":"linePartCov","hits":"50","order":"13942","possible_hits":"120",}, {"lineNum":" 63","line":" switch (endian) {"}, {"lineNum":" 64","line":" .Big => {"}, {"lineNum":" 65","line":" const shift = @intCast(BufShift, high_byte_shift + self.bit_count);","class":"linePartCov","hits":"15","order":"13943","possible_hits":"42",}, {"lineNum":" 66","line":" const v = @intCast(u8, in_buffer >> shift);","class":"linePartCov","hits":"15","order":"13944","possible_hits":"26",}, {"lineNum":" 67","line":" self.bit_buffer |= v;","class":"linePartCov","hits":"15","order":"13945","possible_hits":"17",}, {"lineNum":" 68","line":" in_buffer <<= n;","class":"linePartCov","hits":"15","order":"13946","possible_hits":"22",}, {"lineNum":" 69","line":" },"}, {"lineNum":" 70","line":" .Little => {"}, {"lineNum":" 71","line":" const v = @truncate(u8, in_buffer) << @intCast(u3, self.bit_count);","class":"linePartCov","hits":"40","order":"13982","possible_hits":"69",}, {"lineNum":" 72","line":" self.bit_buffer |= v;","class":"linePartCov","hits":"20","order":"13983","possible_hits":"23",}, {"lineNum":" 73","line":" in_buffer >>= n;","class":"linePartCov","hits":"20","order":"13984","possible_hits":"29",}, {"lineNum":" 74","line":" },"}, {"lineNum":" 75","line":" }"}, {"lineNum":" 76","line":" self.bit_count += n;","class":"linePartCov","hits":"35","order":"13947","possible_hits":"69",}, {"lineNum":" 77","line":" in_bits -= n;","class":"linePartCov","hits":"35","order":"13948","possible_hits":"40",}, {"lineNum":" 78","line":""}, {"lineNum":" 79","line":" //if we didn\'t fill the buffer, it\'s because bits < bits_remaining;"}, {"lineNum":" 80","line":" if (self.bit_count != u8_bit_count) return;","class":"linePartCov","hits":"50","order":"13949","possible_hits":"80",}, {"lineNum":" 81","line":" try self.out_stream.writeByte(self.bit_buffer);","class":"linePartCov","hits":"26","order":"13952","possible_hits":"40",}, {"lineNum":" 82","line":" self.bit_buffer = 0;","class":"linePartCov","hits":"26","order":"13953","possible_hits":"40",}, {"lineNum":" 83","line":" self.bit_count = 0;","class":"linePartCov","hits":"26","order":"13954","possible_hits":"40",}, {"lineNum":" 84","line":" }"}, {"lineNum":" 85","line":" //at this point we know bit_buffer is empty"}, {"lineNum":" 86","line":""}, {"lineNum":" 87","line":" //copy bytes until we can\'t fill one anymore, then leave the rest in bit_buffer"}, {"lineNum":" 88","line":" while (in_bits >= u8_bit_count) {","class":"linePartCov","hits":"47","order":"13935","possible_hits":"80",}, {"lineNum":" 89","line":" switch (endian) {"}, {"lineNum":" 90","line":" .Big => {"}, {"lineNum":" 91","line":" const v = @intCast(u8, in_buffer >> high_byte_shift);","class":"linePartCov","hits":"12","order":"13960","possible_hits":"35",}, {"lineNum":" 92","line":" try self.out_stream.writeByte(v);","class":"linePartCov","hits":"8","order":"13961","possible_hits":"26",}, {"lineNum":" 93","line":" in_buffer <<= @intCast(u3, u8_bit_count - 1);","class":"linePartCov","hits":"8","order":"13962","possible_hits":"22",}, {"lineNum":" 94","line":" in_buffer <<= 1;","class":"linePartCov","hits":"8","order":"13963","possible_hits":"17",}, {"lineNum":" 95","line":" },"}, {"lineNum":" 96","line":" .Little => {"}, {"lineNum":" 97","line":" const v = @truncate(u8, in_buffer);","class":"linePartCov","hits":"8","order":"13992","possible_hits":"23",}, {"lineNum":" 98","line":" try self.out_stream.writeByte(v);","class":"linePartCov","hits":"8","order":"13993","possible_hits":"23",}, {"lineNum":" 99","line":" in_buffer >>= @intCast(u3, u8_bit_count - 1);","class":"linePartCov","hits":"8","order":"13994","possible_hits":"29",}, {"lineNum":" 100","line":" in_buffer >>= 1;","class":"linePartCov","hits":"8","order":"13995","possible_hits":"23",}, {"lineNum":" 101","line":" },"}, {"lineNum":" 102","line":" }"}, {"lineNum":" 103","line":" in_bits -= u8_bit_count;","class":"linePartCov","hits":"16","order":"13964","possible_hits":"69",}, {"lineNum":" 104","line":" }"}, {"lineNum":" 105","line":""}, {"lineNum":" 106","line":" if (in_bits > 0) {","class":"linePartCov","hits":"70","order":"13936","possible_hits":"120",}, {"lineNum":" 107","line":" self.bit_count = @intCast(u4, in_bits);","class":"linePartCov","hits":"52","order":"13937","possible_hits":"120",}, {"lineNum":" 108","line":" self.bit_buffer = switch (endian) {","class":"linePartCov","hits":"26","order":"13938","possible_hits":"40",}, {"lineNum":" 109","line":" .Big => @truncate(u8, in_buffer >> high_byte_shift),","class":"linePartCov","hits":"12","order":"13939","possible_hits":"22",}, {"lineNum":" 110","line":" .Little => @truncate(u8, in_buffer),","class":"linePartCov","hits":"14","order":"13980","possible_hits":"23",}, {"lineNum":" 111","line":" };"}, {"lineNum":" 112","line":" }"}, {"lineNum":" 113","line":" }"}, {"lineNum":" 114","line":""}, {"lineNum":" 115","line":" /// Flush any remaining bits to the stream."}, {"lineNum":" 116","line":" pub fn flushBits(self: *Self) Error!void {","class":"linePartCov","hits":"5","order":"13966","possible_hits":"6",}, {"lineNum":" 117","line":" if (self.bit_count == 0) return;","class":"lineCov","hits":"3","order":"13967","possible_hits":"3",}, {"lineNum":" 118","line":" try self.out_stream.writeByte(self.bit_buffer);","class":"linePartCov","hits":"2","order":"13968","possible_hits":"3",}, {"lineNum":" 119","line":" self.bit_buffer = 0;","class":"linePartCov","hits":"2","order":"13969","possible_hits":"3",}, {"lineNum":" 120","line":" self.bit_count = 0;","class":"linePartCov","hits":"2","order":"13970","possible_hits":"3",}, {"lineNum":" 121","line":" }"}, {"lineNum":" 122","line":""}, {"lineNum":" 123","line":" pub fn write(self: *Self, buffer: []const u8) Error!usize {"}, {"lineNum":" 124","line":" // TODO: I\'m not sure this is a good idea, maybe flushBits should be forced"}, {"lineNum":" 125","line":" if (self.bit_count > 0) {"}, {"lineNum":" 126","line":" for (buffer) |b, i|"}, {"lineNum":" 127","line":" try self.writeBits(b, u8_bit_count);"}, {"lineNum":" 128","line":" return buffer.len;"}, {"lineNum":" 129","line":" }"}, {"lineNum":" 130","line":""}, {"lineNum":" 131","line":" return self.out_stream.write(buffer);"}, {"lineNum":" 132","line":" }"}, {"lineNum":" 133","line":""}, {"lineNum":" 134","line":" pub fn outStream(self: *Self) OutStream {"}, {"lineNum":" 135","line":" return .{ .context = self };"}, {"lineNum":" 136","line":" }"}, {"lineNum":" 137","line":" };"}, {"lineNum":" 138","line":"}"}, {"lineNum":" 139","line":""}, {"lineNum":" 140","line":"pub fn bitOutStream(","class":"lineCov","hits":"3","order":"13920","possible_hits":"3",}, {"lineNum":" 141","line":" comptime endian: builtin.Endian,"}, {"lineNum":" 142","line":" underlying_stream: var,"}, {"lineNum":" 143","line":") BitOutStream(endian, @TypeOf(underlying_stream)) {"}, {"lineNum":" 144","line":" return BitOutStream(endian, @TypeOf(underlying_stream)).init(underlying_stream);","class":"lineCov","hits":"3","order":"13921","possible_hits":"3",}, {"lineNum":" 145","line":"}"}, {"lineNum":" 146","line":""}, {"lineNum":" 147","line":"test \"api coverage\" {","class":"lineCov","hits":"2","order":"13915","possible_hits":"2",}, {"lineNum":" 148","line":" var mem_be = [_]u8{0} ** 2;","class":"lineCov","hits":"1","order":"13916","possible_hits":"1",}, {"lineNum":" 149","line":" var mem_le = [_]u8{0} ** 2;","class":"lineCov","hits":"1","order":"13917","possible_hits":"1",}, {"lineNum":" 150","line":""}, {"lineNum":" 151","line":" var mem_out_be = io.fixedBufferStream(&mem_be);","class":"lineCov","hits":"1","order":"13918","possible_hits":"1",}, {"lineNum":" 152","line":" var bit_stream_be = bitOutStream(.Big, mem_out_be.outStream());","class":"lineCov","hits":"1","order":"13919","possible_hits":"1",}, {"lineNum":" 153","line":""}, {"lineNum":" 154","line":" try bit_stream_be.writeBits(@as(u2, 1), 1);","class":"lineCov","hits":"1","order":"13927","possible_hits":"1",}, {"lineNum":" 155","line":" try bit_stream_be.writeBits(@as(u5, 2), 2);","class":"lineCov","hits":"1","order":"13940","possible_hits":"1",}, {"lineNum":" 156","line":" try bit_stream_be.writeBits(@as(u128, 3), 3);","class":"lineCov","hits":"1","order":"13950","possible_hits":"1",}, {"lineNum":" 157","line":" try bit_stream_be.writeBits(@as(u8, 4), 4);","class":"lineCov","hits":"1","order":"13951","possible_hits":"1",}, {"lineNum":" 158","line":" try bit_stream_be.writeBits(@as(u9, 5), 5);","class":"lineCov","hits":"1","order":"13955","possible_hits":"1",}, {"lineNum":" 159","line":" try bit_stream_be.writeBits(@as(u1, 1), 1);","class":"lineCov","hits":"1","order":"13956","possible_hits":"1",}, {"lineNum":" 160","line":""}, {"lineNum":" 161","line":" testing.expect(mem_be[0] == 0b11001101 and mem_be[1] == 0b00001011);","class":"lineCov","hits":"1","order":"13957","possible_hits":"1",}, {"lineNum":" 162","line":""}, {"lineNum":" 163","line":" mem_out_be.pos = 0;","class":"lineCov","hits":"1","order":"13958","possible_hits":"1",}, {"lineNum":" 164","line":""}, {"lineNum":" 165","line":" try bit_stream_be.writeBits(@as(u15, 0b110011010000101), 15);","class":"lineCov","hits":"1","order":"13959","possible_hits":"1",}, {"lineNum":" 166","line":" try bit_stream_be.flushBits();","class":"lineCov","hits":"1","order":"13965","possible_hits":"1",}, {"lineNum":" 167","line":" testing.expect(mem_be[0] == 0b11001101 and mem_be[1] == 0b00001010);","class":"lineCov","hits":"1","order":"13971","possible_hits":"1",}, {"lineNum":" 168","line":""}, {"lineNum":" 169","line":" mem_out_be.pos = 0;","class":"lineCov","hits":"1","order":"13972","possible_hits":"1",}, {"lineNum":" 170","line":" try bit_stream_be.writeBits(@as(u32, 0b110011010000101), 16);","class":"lineCov","hits":"1","order":"13973","possible_hits":"1",}, {"lineNum":" 171","line":" testing.expect(mem_be[0] == 0b01100110 and mem_be[1] == 0b10000101);","class":"lineCov","hits":"1","order":"13974","possible_hits":"1",}, {"lineNum":" 172","line":""}, {"lineNum":" 173","line":" try bit_stream_be.writeBits(@as(u0, 0), 0);","class":"lineCov","hits":"1","order":"13975","possible_hits":"1",}, {"lineNum":" 174","line":""}, {"lineNum":" 175","line":" var mem_out_le = io.fixedBufferStream(&mem_le);","class":"lineCov","hits":"1","order":"13976","possible_hits":"1",}, {"lineNum":" 176","line":" var bit_stream_le = bitOutStream(.Little, mem_out_le.outStream());","class":"lineCov","hits":"1","order":"13977","possible_hits":"1",}, {"lineNum":" 177","line":""}, {"lineNum":" 178","line":" try bit_stream_le.writeBits(@as(u2, 1), 1);","class":"lineCov","hits":"1","order":"13978","possible_hits":"1",}, {"lineNum":" 179","line":" try bit_stream_le.writeBits(@as(u5, 2), 2);","class":"lineCov","hits":"1","order":"13981","possible_hits":"1",}, {"lineNum":" 180","line":" try bit_stream_le.writeBits(@as(u128, 3), 3);","class":"lineCov","hits":"1","order":"13985","possible_hits":"1",}, {"lineNum":" 181","line":" try bit_stream_le.writeBits(@as(u8, 4), 4);","class":"lineCov","hits":"1","order":"13986","possible_hits":"1",}, {"lineNum":" 182","line":" try bit_stream_le.writeBits(@as(u9, 5), 5);","class":"lineCov","hits":"1","order":"13987","possible_hits":"1",}, {"lineNum":" 183","line":" try bit_stream_le.writeBits(@as(u1, 1), 1);","class":"lineCov","hits":"1","order":"13988","possible_hits":"1",}, {"lineNum":" 184","line":""}, {"lineNum":" 185","line":" testing.expect(mem_le[0] == 0b00011101 and mem_le[1] == 0b10010101);","class":"lineCov","hits":"1","order":"13989","possible_hits":"1",}, {"lineNum":" 186","line":""}, {"lineNum":" 187","line":" mem_out_le.pos = 0;","class":"lineCov","hits":"1","order":"13990","possible_hits":"1",}, {"lineNum":" 188","line":" try bit_stream_le.writeBits(@as(u15, 0b110011010000101), 15);","class":"lineCov","hits":"1","order":"13991","possible_hits":"1",}, {"lineNum":" 189","line":" try bit_stream_le.flushBits();","class":"lineCov","hits":"1","order":"13996","possible_hits":"1",}, {"lineNum":" 190","line":" testing.expect(mem_le[0] == 0b10000101 and mem_le[1] == 0b01100110);","class":"lineCov","hits":"1","order":"13997","possible_hits":"1",}, {"lineNum":" 191","line":""}, {"lineNum":" 192","line":" mem_out_le.pos = 0;","class":"lineCov","hits":"1","order":"13998","possible_hits":"1",}, {"lineNum":" 193","line":" try bit_stream_le.writeBits(@as(u32, 0b1100110100001011), 16);","class":"lineCov","hits":"1","order":"13999","possible_hits":"1",}, {"lineNum":" 194","line":" testing.expect(mem_le[0] == 0b00001011 and mem_le[1] == 0b11001101);","class":"lineCov","hits":"1","order":"14000","possible_hits":"1",}, {"lineNum":" 195","line":""}, {"lineNum":" 196","line":" try bit_stream_le.writeBits(@as(u0, 0), 0);","class":"lineCov","hits":"1","order":"14001","possible_hits":"1",}, {"lineNum":" 197","line":"}"}, ]}; var percent_low = 25;var percent_high = 75; var header = { "command" : "test", "date" : "2020-05-19 01:29:25", "instrumented" : 88, "covered" : 87,}; var merged_data = [];