// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/mobile_device_type.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// 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.ProtoPackageIsVersion3 // please upgrade the proto package

// The type of mobile device.
type MobileDeviceTypeEnum_MobileDeviceType int32

const (
	// Not specified.
	MobileDeviceTypeEnum_UNSPECIFIED MobileDeviceTypeEnum_MobileDeviceType = 0
	// Used for return value only. Represents value unknown in this version.
	MobileDeviceTypeEnum_UNKNOWN MobileDeviceTypeEnum_MobileDeviceType = 1
	// Mobile phones.
	MobileDeviceTypeEnum_MOBILE MobileDeviceTypeEnum_MobileDeviceType = 2
	// Tablets.
	MobileDeviceTypeEnum_TABLET MobileDeviceTypeEnum_MobileDeviceType = 3
)

var MobileDeviceTypeEnum_MobileDeviceType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "MOBILE",
	3: "TABLET",
}

var MobileDeviceTypeEnum_MobileDeviceType_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"MOBILE":      2,
	"TABLET":      3,
}

func (x MobileDeviceTypeEnum_MobileDeviceType) String() string {
	return proto.EnumName(MobileDeviceTypeEnum_MobileDeviceType_name, int32(x))
}

func (MobileDeviceTypeEnum_MobileDeviceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1217305e9fde61b1, []int{0, 0}
}

// Container for enum describing the types of mobile device.
type MobileDeviceTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MobileDeviceTypeEnum) Reset()         { *m = MobileDeviceTypeEnum{} }
func (m *MobileDeviceTypeEnum) String() string { return proto.CompactTextString(m) }
func (*MobileDeviceTypeEnum) ProtoMessage()    {}
func (*MobileDeviceTypeEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_1217305e9fde61b1, []int{0}
}

func (m *MobileDeviceTypeEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MobileDeviceTypeEnum.Unmarshal(m, b)
}
func (m *MobileDeviceTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MobileDeviceTypeEnum.Marshal(b, m, deterministic)
}
func (m *MobileDeviceTypeEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MobileDeviceTypeEnum.Merge(m, src)
}
func (m *MobileDeviceTypeEnum) XXX_Size() int {
	return xxx_messageInfo_MobileDeviceTypeEnum.Size(m)
}
func (m *MobileDeviceTypeEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_MobileDeviceTypeEnum.DiscardUnknown(m)
}

var xxx_messageInfo_MobileDeviceTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.MobileDeviceTypeEnum_MobileDeviceType", MobileDeviceTypeEnum_MobileDeviceType_name, MobileDeviceTypeEnum_MobileDeviceType_value)
	proto.RegisterType((*MobileDeviceTypeEnum)(nil), "google.ads.googleads.v3.enums.MobileDeviceTypeEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/mobile_device_type.proto", fileDescriptor_1217305e9fde61b1)
}

var fileDescriptor_1217305e9fde61b1 = []byte{
	// 304 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
	0x18, 0x77, 0x1d, 0x4c, 0xc8, 0x0e, 0x96, 0xa2, 0x17, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0xc0,
	0x43, 0x3c, 0xa5, 0xae, 0xce, 0xe1, 0xd6, 0x0d, 0xdc, 0x2a, 0x48, 0x61, 0x76, 0x4b, 0x08, 0x85,
	0x36, 0x29, 0x4b, 0x57, 0xd8, 0xeb, 0x78, 0xf4, 0x51, 0x7c, 0x94, 0x3d, 0x85, 0x34, 0xb1, 0x3d,
	0x0c, 0xf4, 0x12, 0x7e, 0x7c, 0xbf, 0x3f, 0xf9, 0x7d, 0x1f, 0xb8, 0x17, 0x4a, 0x89, 0x8c, 0xa3,
	0x84, 0x69, 0x64, 0x61, 0x8d, 0x2a, 0x8c, 0xb8, 0x3c, 0xe4, 0x1a, 0xe5, 0x6a, 0x9b, 0x66, 0x7c,
	0xc3, 0x78, 0x95, 0xee, 0xf8, 0xa6, 0x3c, 0x16, 0x1c, 0x16, 0x7b, 0x55, 0x2a, 0x6f, 0x60, 0xc5,
	0x30, 0x61, 0x1a, 0xb6, 0x3e, 0x58, 0x61, 0x68, 0x7c, 0xb7, 0x77, 0x4d, 0x6c, 0x91, 0xa2, 0x44,
	0x4a, 0x55, 0x26, 0x65, 0xaa, 0xa4, 0xb6, 0xe6, 0xd1, 0x07, 0xb8, 0x9e, 0x9b, 0xe0, 0xb1, 0xc9,
	0x5d, 0x1d, 0x0b, 0x1e, 0xc8, 0x43, 0x3e, 0x7a, 0x06, 0xee, 0xf9, 0xdc, 0xbb, 0x02, 0xfd, 0x75,
	0xf8, 0xba, 0x0c, 0x1e, 0xa7, 0x4f, 0xd3, 0x60, 0xec, 0x5e, 0x78, 0x7d, 0x70, 0xb9, 0x0e, 0x5f,
	0xc2, 0xc5, 0x5b, 0xe8, 0x76, 0x3c, 0x00, 0x7a, 0xf3, 0x85, 0x3f, 0x9d, 0x05, 0xae, 0x53, 0xe3,
	0x15, 0xf5, 0x67, 0xc1, 0xca, 0xed, 0xfa, 0xa7, 0x0e, 0x18, 0xee, 0x54, 0x0e, 0xff, 0x6d, 0xe9,
	0xdf, 0x9c, 0xff, 0xb6, 0xac, 0xeb, 0x2d, 0x3b, 0xef, 0xfe, 0xaf, 0x4f, 0xa8, 0x2c, 0x91, 0x02,
	0xaa, 0xbd, 0x40, 0x82, 0x4b, 0x53, 0xbe, 0xb9, 0x52, 0x91, 0xea, 0x3f, 0x8e, 0xf6, 0x60, 0xde,
	0x4f, 0xa7, 0x3b, 0xa1, 0xf4, 0xcb, 0x19, 0x4c, 0x6c, 0x14, 0x65, 0x1a, 0x5a, 0x58, 0xa3, 0x08,
	0xc3, 0x7a, 0x63, 0xfd, 0xdd, 0xf0, 0x31, 0x65, 0x3a, 0x6e, 0xf9, 0x38, 0xc2, 0xb1, 0xe1, 0x4f,
	0xce, 0xd0, 0x0e, 0x09, 0xa1, 0x4c, 0x13, 0xd2, 0x2a, 0x08, 0x89, 0x30, 0x21, 0x46, 0xb3, 0xed,
	0x99, 0x62, 0xf8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x20, 0x5e, 0x3e, 0x66, 0xcc, 0x01, 0x00, 0x00,
}
