| ... | @@ -10,8 +10,8 @@ const Decompress = @This(); | ... | @@ -10,8 +10,8 @@ const Decompress = @This(); |
| 10 | const Token = @import("Token.zig"); | 10 | const Token = @import("Token.zig"); |
| 11 | | 11 | |
| 12 | input: *Reader, | 12 | input: *Reader, |
| 13 | next_bits: usize, | 13 | next_bits: Bits, |
| 14 | remaining_bits: std.math.Log2Int(usize), | 14 | remaining_bits: std.math.Log2Int(Bits), |
| 15 | | 15 | |
| 16 | reader: Reader, | 16 | reader: Reader, |
| 17 | | 17 | |
| ... | @@ -25,6 +25,9 @@ state: State, | ... | @@ -25,6 +25,9 @@ state: State, |
| 25 | | 25 | |
| 26 | err: ?Error, | 26 | err: ?Error, |
| 27 | | 27 | |
| | 28 | /// TODO: change this to usize |
| | 29 | const Bits = u64; |
| | 30 | |
| 28 | const BlockType = enum(u2) { | 31 | const BlockType = enum(u2) { |
| 29 | stored = 0, | 32 | stored = 0, |
| 30 | fixed = 1, | 33 | fixed = 1, |
| ... | @@ -498,14 +501,14 @@ fn takeBits(d: *Decompress, comptime U: type) !U { | ... | @@ -498,14 +501,14 @@ fn takeBits(d: *Decompress, comptime U: type) !U { |
| 498 | return u; | 501 | return u; |
| 499 | } | 502 | } |
| 500 | const in = d.input; | 503 | const in = d.input; |
| 501 | const next_int = in.takeInt(usize, .little) catch |err| switch (err) { | 504 | const next_int = in.takeInt(Bits, .little) catch |err| switch (err) { |
| 502 | error.ReadFailed => return error.ReadFailed, | 505 | error.ReadFailed => return error.ReadFailed, |
| 503 | error.EndOfStream => return takeBitsEnding(d, U), | 506 | error.EndOfStream => return takeBitsEnding(d, U), |
| 504 | }; | 507 | }; |
| 505 | const needed_bits = @bitSizeOf(U) - remaining_bits; | 508 | const needed_bits = @bitSizeOf(U) - remaining_bits; |
| 506 | const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); | 509 | const u: U = @intCast(((next_int & ((@as(Bits, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); |
| 507 | d.next_bits = next_int >> needed_bits; | 510 | d.next_bits = next_int >> needed_bits; |
| 508 | d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits)); | 511 | d.remaining_bits = @intCast(@bitSizeOf(Bits) - @as(usize, needed_bits)); |
| 509 | return u; | 512 | return u; |
| 510 | } | 513 | } |
| 511 | | 514 | |
| ... | @@ -514,14 +517,14 @@ fn takeBitsEnding(d: *Decompress, comptime U: type) !U { | ... | @@ -514,14 +517,14 @@ fn takeBitsEnding(d: *Decompress, comptime U: type) !U { |
| 514 | const next_bits = d.next_bits; | 517 | const next_bits = d.next_bits; |
| 515 | const in = d.input; | 518 | const in = d.input; |
| 516 | const n = in.bufferedLen(); | 519 | const n = in.bufferedLen(); |
| 517 | assert(n < @sizeOf(usize)); | 520 | assert(n < @sizeOf(Bits)); |
| 518 | const needed_bits = @bitSizeOf(U) - remaining_bits; | 521 | const needed_bits = @bitSizeOf(U) - remaining_bits; |
| 519 | if (n * 8 < needed_bits) return error.EndOfStream; | 522 | if (n * 8 < needed_bits) return error.EndOfStream; |
| 520 | const next_int = in.takeVarInt(usize, .little, n) catch |err| switch (err) { | 523 | const next_int = in.takeVarInt(Bits, .little, n) catch |err| switch (err) { |
| 521 | error.ReadFailed => return error.ReadFailed, | 524 | error.ReadFailed => return error.ReadFailed, |
| 522 | error.EndOfStream => unreachable, | 525 | error.EndOfStream => unreachable, |
| 523 | }; | 526 | }; |
| 524 | const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); | 527 | const u: U = @intCast(((next_int & ((@as(Bits, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); |
| 525 | d.next_bits = next_int >> needed_bits; | 528 | d.next_bits = next_int >> needed_bits; |
| 526 | d.remaining_bits = @intCast(n * 8 - @as(usize, needed_bits)); | 529 | d.remaining_bits = @intCast(n * 8 - @as(usize, needed_bits)); |
| 527 | return u; | 530 | return u; |
| ... | @@ -532,37 +535,37 @@ fn peekBits(d: *Decompress, comptime U: type) !U { | ... | @@ -532,37 +535,37 @@ fn peekBits(d: *Decompress, comptime U: type) !U { |
| 532 | const next_bits = d.next_bits; | 535 | const next_bits = d.next_bits; |
| 533 | if (remaining_bits >= @bitSizeOf(U)) return @truncate(next_bits); | 536 | if (remaining_bits >= @bitSizeOf(U)) return @truncate(next_bits); |
| 534 | const in = d.input; | 537 | const in = d.input; |
| 535 | const next_int = in.peekInt(usize, .little) catch |err| switch (err) { | 538 | const next_int = in.peekInt(Bits, .little) catch |err| switch (err) { |
| 536 | error.ReadFailed => return error.ReadFailed, | 539 | error.ReadFailed => return error.ReadFailed, |
| 537 | error.EndOfStream => return peekBitsEnding(d, U), | 540 | error.EndOfStream => return peekBitsEnding(d, U), |
| 538 | }; | 541 | }; |
| 539 | const needed_bits = @bitSizeOf(U) - remaining_bits; | 542 | const needed_bits = @bitSizeOf(U) - remaining_bits; |
| 540 | return @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); | 543 | return @intCast(((next_int & ((@as(Bits, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); |
| 541 | } | 544 | } |
| 542 | | 545 | |
| 543 | fn peekBitsEnding(d: *Decompress, comptime U: type) !U { | 546 | fn peekBitsEnding(d: *Decompress, comptime U: type) !U { |
| 544 | const remaining_bits = d.remaining_bits; | 547 | const remaining_bits = d.remaining_bits; |
| 545 | const next_bits = d.next_bits; | 548 | const next_bits = d.next_bits; |
| 546 | const in = d.input; | 549 | const in = d.input; |
| 547 | var u: usize = 0; | 550 | var u: Bits = 0; |
| 548 | var remaining_needed_bits = @bitSizeOf(U) - remaining_bits; | 551 | var remaining_needed_bits = @bitSizeOf(U) - remaining_bits; |
| 549 | var i: usize = 0; | 552 | var i: usize = 0; |
| 550 | while (remaining_needed_bits >= 8) { | 553 | while (remaining_needed_bits >= 8) { |
| 551 | const byte = try specialPeek(in, next_bits, i); | 554 | const byte = try specialPeek(in, next_bits, i); |
| 552 | u |= @as(usize, byte) << @intCast(i * 8); | 555 | u |= @as(Bits, byte) << @intCast(i * 8); |
| 553 | remaining_needed_bits -= 8; | 556 | remaining_needed_bits -= 8; |
| 554 | i += 1; | 557 | i += 1; |
| 555 | } | 558 | } |
| 556 | if (remaining_needed_bits != 0) { | 559 | if (remaining_needed_bits != 0) { |
| 557 | const byte = try specialPeek(in, next_bits, i); | 560 | const byte = try specialPeek(in, next_bits, i); |
| 558 | u |= @as(usize, byte) << @intCast((i * 8) + remaining_needed_bits); | 561 | u |= @as(Bits, byte) << @intCast((i * 8) + remaining_needed_bits); |
| 559 | } | 562 | } |
| 560 | return @truncate((u << remaining_bits) | next_bits); | 563 | return @truncate((u << remaining_bits) | next_bits); |
| 561 | } | 564 | } |
| 562 | | 565 | |
| 563 | /// If there is any unconsumed data, handles EndOfStream by pretending there | 566 | /// If there is any unconsumed data, handles EndOfStream by pretending there |
| 564 | /// are zeroes afterwards. | 567 | /// are zeroes afterwards. |
| 565 | fn specialPeek(in: *Reader, next_bits: usize, i: usize) Reader.Error!u8 { | 568 | fn specialPeek(in: *Reader, next_bits: Bits, i: usize) Reader.Error!u8 { |
| 566 | const peeked = in.peek(i + 1) catch |err| switch (err) { | 569 | const peeked = in.peek(i + 1) catch |err| switch (err) { |
| 567 | error.ReadFailed => return error.ReadFailed, | 570 | error.ReadFailed => return error.ReadFailed, |
| 568 | error.EndOfStream => if (next_bits == 0 and i == 0) return error.EndOfStream else return 0, | 571 | error.EndOfStream => if (next_bits == 0 and i == 0) return error.EndOfStream else return 0, |
| ... | @@ -578,13 +581,13 @@ fn tossBits(d: *Decompress, n: u4) !void { | ... | @@ -578,13 +581,13 @@ fn tossBits(d: *Decompress, n: u4) !void { |
| 578 | d.remaining_bits = remaining_bits - n; | 581 | d.remaining_bits = remaining_bits - n; |
| 579 | } else { | 582 | } else { |
| 580 | const in = d.input; | 583 | const in = d.input; |
| 581 | const next_int = in.takeInt(usize, .little) catch |err| switch (err) { | 584 | const next_int = in.takeInt(Bits, .little) catch |err| switch (err) { |
| 582 | error.ReadFailed => return error.ReadFailed, | 585 | error.ReadFailed => return error.ReadFailed, |
| 583 | error.EndOfStream => return tossBitsEnding(d, n), | 586 | error.EndOfStream => return tossBitsEnding(d, n), |
| 584 | }; | 587 | }; |
| 585 | const needed_bits = n - remaining_bits; | 588 | const needed_bits = n - remaining_bits; |
| 586 | d.next_bits = next_int >> needed_bits; | 589 | d.next_bits = next_int >> needed_bits; |
| 587 | d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits)); | 590 | d.remaining_bits = @intCast(@bitSizeOf(Bits) - @as(usize, needed_bits)); |
| 588 | } | 591 | } |
| 589 | } | 592 | } |
| 590 | | 593 | |
| ... | @@ -593,9 +596,9 @@ fn tossBitsEnding(d: *Decompress, n: u4) !void { | ... | @@ -593,9 +596,9 @@ fn tossBitsEnding(d: *Decompress, n: u4) !void { |
| 593 | const in = d.input; | 596 | const in = d.input; |
| 594 | const buffered_n = in.bufferedLen(); | 597 | const buffered_n = in.bufferedLen(); |
| 595 | if (buffered_n == 0) return error.EndOfStream; | 598 | if (buffered_n == 0) return error.EndOfStream; |
| 596 | assert(buffered_n < @sizeOf(usize)); | 599 | assert(buffered_n < @sizeOf(Bits)); |
| 597 | const needed_bits = n - remaining_bits; | 600 | const needed_bits = n - remaining_bits; |
| 598 | const next_int = in.takeVarInt(usize, .little, buffered_n) catch |err| switch (err) { | 601 | const next_int = in.takeVarInt(Bits, .little, buffered_n) catch |err| switch (err) { |
| 599 | error.ReadFailed => return error.ReadFailed, | 602 | error.ReadFailed => return error.ReadFailed, |
| 600 | error.EndOfStream => unreachable, | 603 | error.EndOfStream => unreachable, |
| 601 | }; | 604 | }; |