package brotli

func utf8Position( uint,  uint,  uint) uint {
	if  < 128 {
		return 0 /* Next one is the 'Byte 1' again. */
	} else if  >= 192 { /* Next one is the 'Byte 2' of utf-8 encoding. */
		return brotli_min_size_t(1, )
	} else {
		/* Let's decide over the last byte if this ends the sequence. */
		if  < 0xE0 {
			return 0 /* Completed two or three byte coding. */ /* Next one is the 'Byte 3' of utf-8 encoding. */
		} else {
			return brotli_min_size_t(2, )
		}
	}
}

func decideMultiByteStatsLevel( uint,  uint,  uint,  []byte) uint {
	var  = [3]uint{0} /* should be 2, but 1 compresses better. */
	var  uint = 1
	var  uint = 0
	var  uint
	for  = 0;  < ; ++ {
		var  uint = uint([(+)&])
		[utf8Position(, , 2)]++
		 = 
	}

	if [2] < 500 {
		 = 1
	}

	if [1]+[2] < 25 {
		 = 0
	}

	return 
}

func estimateBitCostsForLiteralsUTF8( uint,  uint,  uint,  []byte,  []float32) {
	var  uint = decideMultiByteStatsLevel(, uint(), , )
	/* Bootstrap histograms. */
	var  = [3][256]uint{[256]uint{0}}
	var  uint = 495
	var  uint = brotli_min_size_t(, uint())
	var  = [3]uint{0}
	/* max_utf8 is 0 (normal ASCII single byte modeling),
	   1 (for 2-byte UTF-8 modeling), or 2 (for 3-byte UTF-8 modeling). */

	var  uint
	{
		var  uint = 0
		var  uint = 0
		for  = 0;  < ; ++ {
			var  uint = uint([(+)&])
			[][]++
			[]++
			 = utf8Position(, , )
			 = 
		}
	}

	/* Compute bit costs with sliding window. */
	for  = 0;  < ; ++ {
		if  >=  {
			var  uint
			var  uint
			if  < +1 {
				 = 0
			} else {
				 = uint([(+--1)&])
			}
			if  < +2 {
				 = 0
			} else {
				 = uint([(+--2)&])
			}
			/* Remove a byte in the past. */

			var  uint = utf8Position(, , )
			[][[(+-)&]]--
			[]--
		}

		if + <  {
			var  uint = uint([(++-1)&])
			var  uint = uint([(++-2)&])
			/* Add a byte in the future. */

			var  uint = utf8Position(, , )
			[][[(++)&]]++
			[]++
		}
		{
			var  uint
			var  uint
			if  < 1 {
				 = 0
			} else {
				 = uint([(+-1)&])
			}
			if  < 2 {
				 = 0
			} else {
				 = uint([(+-2)&])
			}
			var  uint = utf8Position(, , )
			var  uint = ( + ) & 
			var  uint = [][[]]
			var  float64
			if  == 0 {
				 = 1
			}

			 = fastLog2([]) - fastLog2()
			 += 0.02905
			if  < 1.0 {
				 *= 0.5
				 += 0.5
			}

			/* Make the first bytes more expensive -- seems to help, not sure why.
			   Perhaps because the entropy source is changing its properties
			   rapidly in the beginning of the file, perhaps because the beginning
			   of the data is a statistical "anomaly". */
			if  < 2000 {
				 += 0.7 - (float64(2000-) / 2000.0 * 0.35)
			}

			[] = float32()
		}
	}
}

func estimateBitCostsForLiterals( uint,  uint,  uint,  []byte,  []float32) {
	if isMostlyUTF8(, , , uint(), kMinUTF8Ratio) {
		estimateBitCostsForLiteralsUTF8(, uint(), , , )
		return
	} else {
		var  = [256]uint{0}
		var  uint = 2000
		var  uint = brotli_min_size_t(, uint())
		var  uint
		/* Bootstrap histogram. */
		for  = 0;  < ; ++ {
			[[(+)&]]++
		}

		/* Compute bit costs with sliding window. */
		for  = 0;  < ; ++ {
			var  uint
			if  >=  {
				/* Remove a byte in the past. */
				[[(+-)&]]--

				--
			}

			if + <  {
				/* Add a byte in the future. */
				[[(++)&]]++

				++
			}

			 = [[(+)&]]
			if  == 0 {
				 = 1
			}
			{
				var  float64 = fastLog2() - fastLog2()
				 += 0.029
				if  < 1.0 {
					 *= 0.5
					 += 0.5
				}

				[] = float32()
			}
		}
	}
}