// generated by stringer -output binres_string.go -type ResType,DataType; DO NOT EDIT

package binres

import "fmt"

const (
	_ResType_name_0 = "ResNullResStringPoolResTableResXML"
	_ResType_name_1 = "ResXMLStartNamespaceResXMLEndNamespaceResXMLStartElementResXMLEndElementResXMLCharData"
	_ResType_name_2 = "ResXMLResourceMap"
	_ResType_name_3 = "ResTablePackageResTableTypeResTableTypeSpec"
)

var (
	_ResType_index_0 = [...]uint8{7, 20, 28, 34}
	_ResType_index_1 = [...]uint8{20, 38, 56, 72, 86}
	_ResType_index_2 = [...]uint8{17}
	_ResType_index_3 = [...]uint8{15, 27, 43}
)

func (i ResType) String() string {
	switch {
	case 0 <= i && i <= 3:
		lo := uint8(0)
		if i > 0 {
			lo = _ResType_index_0[i-1]
		}
		return _ResType_name_0[lo:_ResType_index_0[i]]
	case 256 <= i && i <= 260:
		i -= 256
		lo := uint8(0)
		if i > 0 {
			lo = _ResType_index_1[i-1]
		}
		return _ResType_name_1[lo:_ResType_index_1[i]]
	case i == 384:
		return _ResType_name_2
	case 512 <= i && i <= 514:
		i -= 512
		lo := uint8(0)
		if i > 0 {
			lo = _ResType_index_3[i-1]
		}
		return _ResType_name_3[lo:_ResType_index_3[i]]
	default:
		return fmt.Sprintf("ResType(%d)", i)
	}
}

const (
	_DataType_name_0 = "DataNullDataReferenceDataAttributeDataStringDataFloatDataDimensionDataFractionDataDynamicReference"
	_DataType_name_1 = "DataIntDecDataIntHexDataIntBool"
	_DataType_name_2 = "DataIntColorARGB8DataIntColorRGB8DataIntColorARGB4DataIntColorRGB4"
)

var (
	_DataType_index_0 = [...]uint8{8, 21, 34, 44, 53, 66, 78, 98}
	_DataType_index_1 = [...]uint8{10, 20, 31}
	_DataType_index_2 = [...]uint8{17, 33, 50, 66}
)

func (i DataType) String() string {
	switch {
	case 0 <= i && i <= 7:
		lo := uint8(0)
		if i > 0 {
			lo = _DataType_index_0[i-1]
		}
		return _DataType_name_0[lo:_DataType_index_0[i]]
	case 16 <= i && i <= 18:
		i -= 16
		lo := uint8(0)
		if i > 0 {
			lo = _DataType_index_1[i-1]
		}
		return _DataType_name_1[lo:_DataType_index_1[i]]
	case 28 <= i && i <= 31:
		i -= 28
		lo := uint8(0)
		if i > 0 {
			lo = _DataType_index_2[i-1]
		}
		return _DataType_name_2[lo:_DataType_index_2[i]]
	default:
		return fmt.Sprintf("DataType(%d)", i)
	}
}
