//  Copyright (c) 2017 Couchbase, Inc.
//
// 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
//
// 		http://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.

package vellum

const maxCommon = 1<<6 - 1

func encodeCommon(in byte) byte {
	val := byte((int(commonInputs[in]) + 1) % 256)
	if val > maxCommon {
		return 0
	}
	return val
}

func decodeCommon(in byte) byte {
	return commonInputsInv[in-1]
}

var commonInputs = []byte{
	84,  // '\x00'
	85,  // '\x01'
	86,  // '\x02'
	87,  // '\x03'
	88,  // '\x04'
	89,  // '\x05'
	90,  // '\x06'
	91,  // '\x07'
	92,  // '\x08'
	93,  // '\t'
	94,  // '\n'
	95,  // '\x0b'
	96,  // '\x0c'
	97,  // '\r'
	98,  // '\x0e'
	99,  // '\x0f'
	100, // '\x10'
	101, // '\x11'
	102, // '\x12'
	103, // '\x13'
	104, // '\x14'
	105, // '\x15'
	106, // '\x16'
	107, // '\x17'
	108, // '\x18'
	109, // '\x19'
	110, // '\x1a'
	111, // '\x1b'
	112, // '\x1c'
	113, // '\x1d'
	114, // '\x1e'
	115, // '\x1f'
	116, // ' '
	80,  // '!'
	117, // '"'
	118, // '#'
	79,  // '$'
	39,  // '%'
	30,  // '&'
	81,  // "'"
	75,  // '('
	74,  // ')'
	82,  // '*'
	57,  // '+'
	66,  // ','
	16,  // '-'
	12,  // '.'
	2,   // '/'
	19,  // '0'
	20,  // '1'
	21,  // '2'
	27,  // '3'
	32,  // '4'
	29,  // '5'
	35,  // '6'
	36,  // '7'
	37,  // '8'
	34,  // '9'
	24,  // ':'
	73,  // ';'
	119, // '<'
	23,  // '='
	120, // '>'
	40,  // '?'
	83,  // '@'
	44,  // 'A'
	48,  // 'B'
	42,  // 'C'
	43,  // 'D'
	49,  // 'E'
	46,  // 'F'
	62,  // 'G'
	61,  // 'H'
	47,  // 'I'
	69,  // 'J'
	68,  // 'K'
	58,  // 'L'
	56,  // 'M'
	55,  // 'N'
	59,  // 'O'
	51,  // 'P'
	72,  // 'Q'
	54,  // 'R'
	45,  // 'S'
	52,  // 'T'
	64,  // 'U'
	65,  // 'V'
	63,  // 'W'
	71,  // 'X'
	67,  // 'Y'
	70,  // 'Z'
	77,  // '['
	121, // '\\'
	78,  // ']'
	122, // '^'
	31,  // '_'
	123, // '`'
	4,   // 'a'
	25,  // 'b'
	9,   // 'c'
	17,  // 'd'
	1,   // 'e'
	26,  // 'f'
	22,  // 'g'
	13,  // 'h'
	7,   // 'i'
	50,  // 'j'
	38,  // 'k'
	14,  // 'l'
	15,  // 'm'
	10,  // 'n'
	3,   // 'o'
	8,   // 'p'
	60,  // 'q'
	6,   // 'r'
	5,   // 's'
	0,   // 't'
	18,  // 'u'
	33,  // 'v'
	11,  // 'w'
	41,  // 'x'
	28,  // 'y'
	53,  // 'z'
	124, // '{'
	125, // '|'
	126, // '}'
	76,  // '~'
	127, // '\x7f'
	128, // '\x80'
	129, // '\x81'
	130, // '\x82'
	131, // '\x83'
	132, // '\x84'
	133, // '\x85'
	134, // '\x86'
	135, // '\x87'
	136, // '\x88'
	137, // '\x89'
	138, // '\x8a'
	139, // '\x8b'
	140, // '\x8c'
	141, // '\x8d'
	142, // '\x8e'
	143, // '\x8f'
	144, // '\x90'
	145, // '\x91'
	146, // '\x92'
	147, // '\x93'
	148, // '\x94'
	149, // '\x95'
	150, // '\x96'
	151, // '\x97'
	152, // '\x98'
	153, // '\x99'
	154, // '\x9a'
	155, // '\x9b'
	156, // '\x9c'
	157, // '\x9d'
	158, // '\x9e'
	159, // '\x9f'
	160, // '\xa0'
	161, // '¡'
	162, // '¢'
	163, // '£'
	164, // '¤'
	165, // '¥'
	166, // '¦'
	167, // '§'
	168, // '¨'
	169, // '©'
	170, // 'ª'
	171, // '«'
	172, // '¬'
	173, // '\xad'
	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, // 'ÿ'
}

var commonInputsInv = []byte{
	't',
	'e',
	'/',
	'o',
	'a',
	's',
	'r',
	'i',
	'p',
	'c',
	'n',
	'w',
	'.',
	'h',
	'l',
	'm',
	'-',
	'd',
	'u',
	'0',
	'1',
	'2',
	'g',
	'=',
	':',
	'b',
	'f',
	'3',
	'y',
	'5',
	'&',
	'_',
	'4',
	'v',
	'9',
	'6',
	'7',
	'8',
	'k',
	'%',
	'?',
	'x',
	'C',
	'D',
	'A',
	'S',
	'F',
	'I',
	'B',
	'E',
	'j',
	'P',
	'T',
	'z',
	'R',
	'N',
	'M',
	'+',
	'L',
	'O',
	'q',
	'H',
	'G',
	'W',
	'U',
	'V',
	',',
	'Y',
	'K',
	'J',
	'Z',
	'X',
	'Q',
	';',
	')',
	'(',
	'~',
	'[',
	']',
	'$',
	'!',
	'\'',
	'*',
	'@',
	'\x00',
	'\x01',
	'\x02',
	'\x03',
	'\x04',
	'\x05',
	'\x06',
	'\x07',
	'\x08',
	'\t',
	'\n',
	'\x0b',
	'\x0c',
	'\r',
	'\x0e',
	'\x0f',
	'\x10',
	'\x11',
	'\x12',
	'\x13',
	'\x14',
	'\x15',
	'\x16',
	'\x17',
	'\x18',
	'\x19',
	'\x1a',
	'\x1b',
	'\x1c',
	'\x1d',
	'\x1e',
	'\x1f',
	' ',
	'"',
	'#',
	'<',
	'>',
	'\\',
	'^',
	'`',
	'{',
	'|',
	'}',
	'\x7f',
	'\x80',
	'\x81',
	'\x82',
	'\x83',
	'\x84',
	'\x85',
	'\x86',
	'\x87',
	'\x88',
	'\x89',
	'\x8a',
	'\x8b',
	'\x8c',
	'\x8d',
	'\x8e',
	'\x8f',
	'\x90',
	'\x91',
	'\x92',
	'\x93',
	'\x94',
	'\x95',
	'\x96',
	'\x97',
	'\x98',
	'\x99',
	'\x9a',
	'\x9b',
	'\x9c',
	'\x9d',
	'\x9e',
	'\x9f',
	'\xa0',
	'\xa1',
	'\xa2',
	'\xa3',
	'\xa4',
	'\xa5',
	'\xa6',
	'\xa7',
	'\xa8',
	'\xa9',
	'\xaa',
	'\xab',
	'\xac',
	'\xad',
	'\xae',
	'\xaf',
	'\xb0',
	'\xb1',
	'\xb2',
	'\xb3',
	'\xb4',
	'\xb5',
	'\xb6',
	'\xb7',
	'\xb8',
	'\xb9',
	'\xba',
	'\xbb',
	'\xbc',
	'\xbd',
	'\xbe',
	'\xbf',
	'\xc0',
	'\xc1',
	'\xc2',
	'\xc3',
	'\xc4',
	'\xc5',
	'\xc6',
	'\xc7',
	'\xc8',
	'\xc9',
	'\xca',
	'\xcb',
	'\xcc',
	'\xcd',
	'\xce',
	'\xcf',
	'\xd0',
	'\xd1',
	'\xd2',
	'\xd3',
	'\xd4',
	'\xd5',
	'\xd6',
	'\xd7',
	'\xd8',
	'\xd9',
	'\xda',
	'\xdb',
	'\xdc',
	'\xdd',
	'\xde',
	'\xdf',
	'\xe0',
	'\xe1',
	'\xe2',
	'\xe3',
	'\xe4',
	'\xe5',
	'\xe6',
	'\xe7',
	'\xe8',
	'\xe9',
	'\xea',
	'\xeb',
	'\xec',
	'\xed',
	'\xee',
	'\xef',
	'\xf0',
	'\xf1',
	'\xf2',
	'\xf3',
	'\xf4',
	'\xf5',
	'\xf6',
	'\xf7',
	'\xf8',
	'\xf9',
	'\xfa',
	'\xfb',
	'\xfc',
	'\xfd',
	'\xfe',
	'\xff',
}
