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

package memory

import (
	"fmt"

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

func init() {
	registry.Add((*Range)(nil).Class())
}

var (
	binaryIDRange = binary.ID{0x01, 0xb1, 0x05, 0xd5, 0x0b, 0xba, 0x21, 0x01, 0x69, 0x0e, 0xaf, 0x02, 0x39, 0xba, 0x67, 0xa0, 0x6b, 0x64, 0xc1, 0x7f}
)

type binaryClassRange struct{}

func (*Range) Class() binary.Class {
	return (*binaryClassRange)(nil)
}
func doEncodeRange(e binary.Encoder, o *Range) error {
	if err := e.Uint64(uint64(o.Base)); err != nil {
		return err
	}
	if err := e.Uint64(o.Size); err != nil {
		return err
	}
	return nil
}
func doDecodeRange(d binary.Decoder, o *Range) error {
	if obj, err := d.Uint64(); err != nil {
		return err
	} else {
		o.Base = Pointer(obj)
	}
	if obj, err := d.Uint64(); err != nil {
		return err
	} else {
		o.Size = uint64(obj)
	}
	return nil
}
func doSkipRange(d binary.Decoder) error {
	if _, err := d.Uint64(); err != nil {
		return err
	}
	if _, err := d.Uint64(); err != nil {
		return err
	}
	return nil
}
func (*binaryClassRange) ID() binary.ID      { return binaryIDRange }
func (*binaryClassRange) New() binary.Object { return &Range{} }
func (*binaryClassRange) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodeRange(e, obj.(*Range))
}
func (*binaryClassRange) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &Range{}
	return obj, doDecodeRange(d, obj)
}
func (*binaryClassRange) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodeRange(d, obj.(*Range))
}
func (*binaryClassRange) Skip(d binary.Decoder) error { return doSkipRange(d) }
func (*binaryClassRange) Schema() *schema.Class       { return schemaRange }

var schemaRange = &schema.Class{
	TypeID: binaryIDRange,
	Name:   "Range",
	Fields: []schema.Field{
		{Declared: "Base", Type: &schema.Primitive{Name: "Pointer", Method: schema.Uint64}},
		{Declared: "Size", Type: &schema.Primitive{Name: "uint64", Method: schema.Uint64}},
	},
}

const _PoolID_name = "ApplicationPool"

var _PoolID_map = map[PoolID]string{
	0: _PoolID_name[0:15],
}

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

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