////////////////////////////////////////////////////////////////////////////////
// Do not modify!
// Generated by codergen
////////////////////////////////////////////////////////////////////////////////

package parse

import (
	"fmt"

	"android.googlesource.com/platform/tools/gpu/binary/schema"
)

var ConstantValues schema.Constants

const _NumberKind_name = "NotNumericDecimalOctalHexadecimalFloatingScientific"

var _NumberKind_map = map[NumberKind]string{}

func init() {
	_NumberKind_map[0] = _NumberKind_name[0:10]
	_NumberKind_map[1] = _NumberKind_name[10:17]
	_NumberKind_map[2] = _NumberKind_name[17:22]
	_NumberKind_map[3] = _NumberKind_name[22:33]
	_NumberKind_map[4] = _NumberKind_name[33:41]
	_NumberKind_map[5] = _NumberKind_name[41:51]

	ConstantValues = append(ConstantValues, schema.ConstantSet{
		Type: &schema.Primitive{Name: "NumberKind", Method: schema.Uint8},
		Entries: []schema.Constant{
			{Name: _NumberKind_name[0:10], Value: uint8(0)},
			{Name: _NumberKind_name[10:17], Value: uint8(1)},
			{Name: _NumberKind_name[17:22], Value: uint8(2)},
			{Name: _NumberKind_name[22:33], Value: uint8(3)},
			{Name: _NumberKind_name[33:41], Value: uint8(4)},
			{Name: _NumberKind_name[41:51], Value: uint8(5)},
		},
	})
}

func (v NumberKind) String() string {
	if s, ok := _NumberKind_map[v]; ok {
		return s
	}
	return fmt.Sprintf("NumberKind(%d)", v)
}

func (v *NumberKind) Parse(s string) error {
	for k, t := range _NumberKind_map {
		if s == t {
			*v = k
			return nil
		}
	}
	return fmt.Errorf("%s not in NumberKind", s)
}

const _SkipMode_name = "SkipPrefixSkipSuffix"

var _SkipMode_map = map[SkipMode]string{}

func init() {
	_SkipMode_map[0] = _SkipMode_name[0:10]
	_SkipMode_map[1] = _SkipMode_name[10:20]

	ConstantValues = append(ConstantValues, schema.ConstantSet{
		Type: &schema.Primitive{Name: "SkipMode", Method: schema.Int32},
		Entries: []schema.Constant{
			{Name: _SkipMode_name[0:10], Value: int32(0)},
			{Name: _SkipMode_name[10:20], Value: int32(1)},
		},
	})
}

func (v SkipMode) String() string {
	if s, ok := _SkipMode_map[v]; ok {
		return s
	}
	return fmt.Sprintf("SkipMode(%d)", v)
}

func (v *SkipMode) Parse(s string) error {
	for k, t := range _SkipMode_map {
		if s == t {
			*v = k
			return nil
		}
	}
	return fmt.Errorf("%s not in SkipMode", s)
}
