// Code generated by protoc-gen-gogo.
// source: android.googlesource.com/platform/tools/gpu/api/snippets/snippets.proto
// DO NOT EDIT!

/*
Package snippets is a generated protocol buffer package.

It is generated from these files:
	android.googlesource.com/platform/tools/gpu/api/snippets/snippets.proto

It has these top-level messages:
*/
package snippets

import proto "github.com/gogo/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package

// ObservationType specifies whether the observation was a read or a write.
type ObservationType int32

const (
	ObservationType_Read  ObservationType = 0
	ObservationType_Write ObservationType = 1
)

var ObservationType_name = map[int32]string{
	0: "Read",
	1: "Write",
}
var ObservationType_value = map[string]int32{
	"Read":  0,
	"Write": 1,
}

func (x ObservationType) String() string {
	return proto.EnumName(ObservationType_name, int32(x))
}
func (ObservationType) EnumDescriptor() ([]byte, []int) { return fileDescriptorSnippets, []int{0} }

// PartKind represents the different ways that a part can be embedded in a container.
type PartKind int32

const (
	PartKind_Key   PartKind = 0
	PartKind_Elem  PartKind = 1
	PartKind_Range PartKind = 2
)

var PartKind_name = map[int32]string{
	0: "Key",
	1: "Elem",
	2: "Range",
}
var PartKind_value = map[string]int32{
	"Key":   0,
	"Elem":  1,
	"Range": 2,
}

func (x PartKind) String() string {
	return proto.EnumName(PartKind_name, int32(x))
}
func (PartKind) EnumDescriptor() ([]byte, []int) { return fileDescriptorSnippets, []int{1} }

type SymbolCategory int32

const (
	SymbolCategory_Global    SymbolCategory = 0
	SymbolCategory_Local     SymbolCategory = 1
	SymbolCategory_Parameter SymbolCategory = 2
)

var SymbolCategory_name = map[int32]string{
	0: "Global",
	1: "Local",
	2: "Parameter",
}
var SymbolCategory_value = map[string]int32{
	"Global":    0,
	"Local":     1,
	"Parameter": 2,
}

func (x SymbolCategory) String() string {
	return proto.EnumName(SymbolCategory_name, int32(x))
}
func (SymbolCategory) EnumDescriptor() ([]byte, []int) { return fileDescriptorSnippets, []int{2} }

func init() {
	proto.RegisterEnum("snippets.ObservationType", ObservationType_name, ObservationType_value)
	proto.RegisterEnum("snippets.PartKind", PartKind_name, PartKind_value)
	proto.RegisterEnum("snippets.SymbolCategory", SymbolCategory_name, SymbolCategory_value)
}

func init() {
	proto.RegisterFile("android.googlesource.com/platform/tools/gpu/api/snippets/snippets.proto", fileDescriptorSnippets)
}

var fileDescriptorSnippets = []byte{
	// 251 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x3c, 0xcf, 0x41, 0x4b, 0x33, 0x31,
	0x10, 0x06, 0xe0, 0xb6, 0xdf, 0x67, 0x6d, 0x03, 0xd6, 0x90, 0x1f, 0x21, 0xb2, 0x87, 0xec, 0x41,
	0x10, 0xcf, 0x15, 0x29, 0x58, 0xc1, 0xa5, 0x15, 0x3c, 0xcf, 0x6e, 0xa6, 0x21, 0x90, 0xec, 0x84,
	0xc9, 0x54, 0xdc, 0x7f, 0x2f, 0x5b, 0x5b, 0x4f, 0xf3, 0x0e, 0xbc, 0x0c, 0xf3, 0xa8, 0x0d, 0xf4,
	0x8e, 0x29, 0x38, 0xeb, 0x89, 0x7c, 0xc4, 0x42, 0x47, 0xee, 0xd0, 0x76, 0x94, 0xea, 0x1c, 0x41,
	0x0e, 0xc4, 0xa9, 0x16, 0xa2, 0x58, 0x6a, 0x9f, 0x8f, 0x35, 0xe4, 0x50, 0x97, 0x3e, 0xe4, 0x8c,
	0x52, 0xfe, 0x82, 0xcd, 0x4c, 0x42, 0x66, 0x71, 0xd9, 0xab, 0x3b, 0x75, 0xfb, 0xde, 0x16, 0xe4,
	0x2f, 0x90, 0x40, 0xfd, 0xc7, 0x90, 0xd1, 0x2c, 0xd4, 0xff, 0x1d, 0x82, 0xd3, 0x13, 0xb3, 0x54,
	0x57, 0x9f, 0x1c, 0x04, 0xf5, 0xb4, 0xba, 0x57, 0x8b, 0x06, 0x58, 0xb6, 0xa1, 0x77, 0xe6, 0x5a,
	0xfd, 0xdb, 0xe2, 0xa0, 0x27, 0x63, 0xf3, 0x25, 0x62, 0xd2, 0xd3, 0xb1, 0xb9, 0x83, 0xde, 0xa3,
	0x9e, 0x55, 0x8f, 0x6a, 0xb5, 0x1f, 0x52, 0x4b, 0xf1, 0x19, 0x04, 0x3d, 0xf1, 0x60, 0x94, 0x9a,
	0x6f, 0x22, 0xb5, 0x10, 0x7f, 0x4f, 0xbe, 0x51, 0x07, 0x51, 0x4f, 0xcd, 0x8d, 0x5a, 0x36, 0xc0,
	0x90, 0x50, 0x90, 0xf5, 0x6c, 0xfd, 0xaa, 0x9e, 0x3a, 0x4a, 0xf6, 0x42, 0x3c, 0x41, 0x6c, 0x70,
	0x08, 0x16, 0x5d, 0x10, 0xe2, 0x62, 0xfd, 0xe1, 0x5b, 0x18, 0x3a, 0xb4, 0xe3, 0xbf, 0x61, 0x9c,
	0x67, 0xc5, 0x7a, 0xb5, 0x3f, 0xa7, 0x66, 0xe4, 0x95, 0x76, 0x7e, 0x62, 0x3e, 0xfc, 0x04, 0x00,
	0x00, 0xff, 0xff, 0xd2, 0xde, 0x0c, 0x82, 0x31, 0x01, 0x00, 0x00,
}
