// Copyright 2022 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

pri func decoder.flush_fast!(dst: base.io_writer) {
	var flush_pointer       : base.u32[..= 1_048575]
	var flush_repeat_count  : base.u32[..= 255]
	var flush_prev          : base.u8
	var block_checksum_have : base.u32
	var block_size          : base.u32

	var entry : base.u32
	var curr  : base.u8

	flush_pointer = this.flush_pointer
	flush_repeat_count = this.flush_repeat_count
	flush_prev = this.flush_prev
	block_checksum_have = this.block_checksum_have
	block_size = this.block_size

	while (block_size > 0) and (args.dst.length() >= 255) {
		if flush_repeat_count < 4 {
			entry = this.bwt[flush_pointer]
			curr = (entry & 0xFF) as base.u8
			flush_pointer = entry >> 12
			if curr == flush_prev {
				flush_repeat_count += 1
			} else {
				flush_repeat_count = 1
			}
			block_checksum_have =
				REV_CRC32_TABLE[((block_checksum_have >> 24) as base.u8) ^ curr] ^
				(block_checksum_have ~mod<< 8)
			args.dst.write_u8_fast!(a: curr)
			flush_prev = curr
			block_size -= 1

		} else {
			entry = this.bwt[flush_pointer]
			curr = (entry & 0xFF) as base.u8
			flush_pointer = entry >> 12
			flush_repeat_count = curr as base.u32
			while flush_repeat_count > 0,
				inv block_size > 0,
			{
				block_checksum_have =
					REV_CRC32_TABLE[((block_checksum_have >> 24) as base.u8) ^ flush_prev] ^
					(block_checksum_have ~mod<< 8)
				if args.dst.length() > 0 {
					args.dst.write_u8_fast!(a: flush_prev)
				}
				flush_repeat_count -= 1
			} endwhile
			flush_repeat_count = 0
			flush_prev = curr
			block_size -= 1
		}
	} endwhile

	this.flush_pointer = flush_pointer
	this.flush_repeat_count = flush_repeat_count
	this.flush_prev = flush_prev
	this.block_checksum_have = block_checksum_have
	if block_size <= 900000 {
		this.block_size = block_size
	}
}
