package zstr

func AppendInt64(dst []byte, v int64) []byte {
	if v == 0 {
		return append(dst, '0')
	}
	// math.MaxUint64 = 18446744073709551615 (len 20)
	i := 21 // + 1 sign
	out := growWindow(dst, 21)
	var u, r, q uint64
	if v < 0 {
		u = -uint64(v)
		for u >= 100 {
			q = u / 100
			r = (u - q*100) << 1
			i -= 2
			out[i+1] = decNumTable[r+1]
			out[i] = decNumTable[r]
			u = q
		}
		r = u << 1
		i--
		out[i] = decNumTable[r+1]
		if u >= 10 {
			i--
			out[i] = decNumTable[r]
		}
		i--
		out[i] = '-'
	} else {
		u = uint64(v)
		for u >= 100 {
			q = u / 100
			r = (u - q*100) << 1
			i -= 2
			out[i+1] = decNumTable[r+1]
			out[i] = decNumTable[r]
			u = q
		}
		r = u << 1
		i--
		out[i] = decNumTable[r+1]
		if u >= 10 {
			i--
			out[i] = decNumTable[r]
		}
	}
	return append(dst, out[i:]...)
}

func AppendUint64(dst []byte, v uint64) []byte {
	if v == 0 {
		return append(dst, '0')
	}
	// math.MaxUint64 = 18446744073709551615 (len 20)
	i := 20
	out := growWindow(dst, 20)
	var r, q uint64
	for v >= 100 {
		q = v / 100
		r = (v - q*100) << 1
		i -= 2
		out[i+1] = decNumTable[r+1]
		out[i] = decNumTable[r]
		v = q
	}

	r = v << 1
	i--
	out[i] = decNumTable[r+1]
	if v >= 10 {
		i--
		out[i] = decNumTable[r]
	}

	return append(dst, out[i:]...)
}

func AppendInt8(dst []byte, v int8) []byte {
	if v < 0 {
		return append(append(dst, '-'), decByte[uint8(-v)]...)
	}
	return append(dst, decByte[v]...)
}

func AppendUint8(dst []byte, v uint8) []byte {
	return append(dst, decByte[v]...)
}

//

const decNumTable = "00010203040506070809" +
	"10111213141516171819" +
	"20212223242526272829" +
	"30313233343536373839" +
	"40414243444546474849" +
	"50515253545556575859" +
	"60616263646566676869" +
	"70717273747576777879" +
	"80818283848586878889" +
	"90919293949596979899"

var decByte = [256]string{
	"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
	"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
	"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
	"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
	"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100",
	"101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "115",
	"116", "117", "118", "119", "120", "121", "122", "123", "124", "125", "126", "127", "128", "129", "130",
	"131", "132", "133", "134", "135", "136", "137", "138", "139", "140", "141", "142", "143", "144", "145",
	"146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159", "160",
	"161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172", "173", "174", "175",
	"176", "177", "178", "179", "180", "181", "182", "183", "184", "185", "186", "187", "188", "189", "190",
	"191", "192", "193", "194", "195", "196", "197", "198", "199", "200", "201", "202", "203", "204", "205",
	"206", "207", "208", "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220",
	"221", "222", "223", "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", "234", "235",
	"236", "237", "238", "239", "240", "241", "242", "243", "244", "245", "246", "247", "248", "249", "250",
	"251", "252", "253", "254", "255",
}
