// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v3/enums/operating_system_version_operator_type.proto

package enums

import (
	reflect "reflect"
	sync "sync"

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

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// The type of operating system version.
type OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType int32

const (
	// Not specified.
	OperatingSystemVersionOperatorTypeEnum_UNSPECIFIED OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 0
	// Used for return value only. Represents value unknown in this version.
	OperatingSystemVersionOperatorTypeEnum_UNKNOWN OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 1
	// Equals to the specified version.
	OperatingSystemVersionOperatorTypeEnum_EQUALS_TO OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 2
	// Greater than or equals to the specified version.
	OperatingSystemVersionOperatorTypeEnum_GREATER_THAN_EQUALS_TO OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 4
)

// Enum value maps for OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType.
var (
	OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "EQUALS_TO",
		4: "GREATER_THAN_EQUALS_TO",
	}
	OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_value = map[string]int32{
		"UNSPECIFIED":            0,
		"UNKNOWN":                1,
		"EQUALS_TO":              2,
		"GREATER_THAN_EQUALS_TO": 4,
	}
)

func (x OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) Enum() *OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType {
	p := new(OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType)
	*p = x
	return p
}

func (x OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_enumTypes[0].Descriptor()
}

func (OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_enumTypes[0]
}

func (x OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType.Descriptor instead.
func (OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing the type of OS operators.
type OperatingSystemVersionOperatorTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *OperatingSystemVersionOperatorTypeEnum) Reset() {
	*x = OperatingSystemVersionOperatorTypeEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *OperatingSystemVersionOperatorTypeEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*OperatingSystemVersionOperatorTypeEnum) ProtoMessage() {}

func (x *OperatingSystemVersionOperatorTypeEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use OperatingSystemVersionOperatorTypeEnum.ProtoReflect.Descriptor instead.
func (*OperatingSystemVersionOperatorTypeEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDesc = []byte{
	0x0a, 0x4a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d,
	0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f,
	0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
	0x64, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a, 0x26, 0x4f, 0x70,
	0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x56, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65,
	0x45, 0x6e, 0x75, 0x6d, 0x22, 0x6d, 0x0a, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e,
	0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4f, 0x70,
	0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e,
	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55,
	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x51, 0x55, 0x41,
	0x4c, 0x53, 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x47, 0x52, 0x45, 0x41, 0x54,
	0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x54,
	0x4f, 0x10, 0x04, 0x42, 0xfc, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73,
	0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x27, 0x4f, 0x70, 0x65, 0x72, 0x61,
	0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f,
	0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c,
	0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75,
	0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x41, 0x41, 0xaa, 0x02,
	0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xca, 0x02,
	0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56, 0x33, 0x5c, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xea, 0x02,
	0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56, 0x33, 0x3a, 0x3a, 0x45, 0x6e, 0x75,
	0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescData = file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_goTypes = []interface{}{
	(OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType)(0), // 0: google.ads.googleads.v3.enums.OperatingSystemVersionOperatorTypeEnum.OperatingSystemVersionOperatorType
	(*OperatingSystemVersionOperatorTypeEnum)(nil),                                 // 1: google.ads.googleads.v3.enums.OperatingSystemVersionOperatorTypeEnum
}
var file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_init() }
func file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_init() {
	if File_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*OperatingSystemVersionOperatorTypeEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto = out.File
	file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_operating_system_version_operator_type_proto_depIdxs = nil
}
