// Copyright 2017 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.

// TODO: drop the '?' but still generate wuffs_adler32__hasher__initialize?
pub struct hasher? implements base.hasher_u32(
	state   : base.u32,
	started : base.bool,
)

pub func hasher.set_quirk_enabled!(quirk: base.u32, enabled: base.bool) {
}

pub func hasher.update_u32!(x: slice base.u8) base.u32 {
	if not this.started {
		this.started = true
		this.state = 1
		choose up = [
			up_arm_neon,
			up_x86_sse42]
	}
	this.up!(x: args.x)
	return this.state
}

pri func hasher.up!(x: slice base.u8),
	choosy,
{
	// The Adler-32 checksum's magic 65521 and 5552 numbers are discussed in
	// this package's README.md.

	var s1        : base.u32
	var s2        : base.u32
	var remaining : slice base.u8
	var p         : slice base.u8

	s1 = this.state.low_bits(n: 16)
	s2 = this.state.high_bits(n: 16)
	while args.x.length() > 0 {
		remaining = args.x[.. 0]
		if args.x.length() > 5552 {
			remaining = args.x[5552 ..]
			args.x = args.x[.. 5552]
		}

		// The SIMD versions of this function replace this simple iterate loop.
		iterate (p = args.x)(length: 1, advance: 1, unroll: 8) {
			s1 ~mod+= p[0] as base.u32
			s2 ~mod+= s1
		}

		s1 %= 65521
		s2 %= 65521
		args.x = remaining
	} endwhile
	this.state = ((s2 & 0xFFFF) << 16) | (s1 & 0xFFFF)
}
