// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/matching_function_operator.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

// Possible operators in a matching function.
type MatchingFunctionOperatorEnum_MatchingFunctionOperator int32

const (
	// Not specified.
	MatchingFunctionOperatorEnum_UNSPECIFIED MatchingFunctionOperatorEnum_MatchingFunctionOperator = 0
	// Used for return value only. Represents value unknown in this version.
	MatchingFunctionOperatorEnum_UNKNOWN MatchingFunctionOperatorEnum_MatchingFunctionOperator = 1
	// The IN operator.
	MatchingFunctionOperatorEnum_IN MatchingFunctionOperatorEnum_MatchingFunctionOperator = 2
	// The IDENTITY operator.
	MatchingFunctionOperatorEnum_IDENTITY MatchingFunctionOperatorEnum_MatchingFunctionOperator = 3
	// The EQUALS operator
	MatchingFunctionOperatorEnum_EQUALS MatchingFunctionOperatorEnum_MatchingFunctionOperator = 4
	// Operator that takes two or more operands that are of type
	// FunctionOperand and checks that all the operands evaluate to true.
	// For functions related to ad formats, all the operands must be in
	// left_operands.
	MatchingFunctionOperatorEnum_AND MatchingFunctionOperatorEnum_MatchingFunctionOperator = 5
	// Operator that returns true if the elements in left_operands contain any
	// of the elements in right_operands. Otherwise, return false. The
	// right_operands must contain at least 1 and no more than 3
	// ConstantOperands.
	MatchingFunctionOperatorEnum_CONTAINS_ANY MatchingFunctionOperatorEnum_MatchingFunctionOperator = 6
)

var MatchingFunctionOperatorEnum_MatchingFunctionOperator_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "IN",
	3: "IDENTITY",
	4: "EQUALS",
	5: "AND",
	6: "CONTAINS_ANY",
}

var MatchingFunctionOperatorEnum_MatchingFunctionOperator_value = map[string]int32{
	"UNSPECIFIED":  0,
	"UNKNOWN":      1,
	"IN":           2,
	"IDENTITY":     3,
	"EQUALS":       4,
	"AND":          5,
	"CONTAINS_ANY": 6,
}

func (x MatchingFunctionOperatorEnum_MatchingFunctionOperator) String() string {
	return proto.EnumName(MatchingFunctionOperatorEnum_MatchingFunctionOperator_name, int32(x))
}

func (MatchingFunctionOperatorEnum_MatchingFunctionOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_5d607f3302220a7f, []int{0, 0}
}

// Container for enum describing matching function operator.
type MatchingFunctionOperatorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MatchingFunctionOperatorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum_MatchingFunctionOperator", MatchingFunctionOperatorEnum_MatchingFunctionOperator_name, MatchingFunctionOperatorEnum_MatchingFunctionOperator_value)
	proto.RegisterType((*MatchingFunctionOperatorEnum)(nil), "google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum")
}

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

var fileDescriptor_5d607f3302220a7f = []byte{
	// 343 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4b, 0x4e, 0xc3, 0x30,
	0x14, 0x24, 0x29, 0xa4, 0xc8, 0xad, 0x84, 0xe5, 0x15, 0x42, 0xed, 0xa2, 0x3d, 0x80, 0xb3, 0xc8,
	0xce, 0x48, 0x48, 0x6e, 0x9b, 0x56, 0x11, 0xe0, 0x16, 0xf5, 0x83, 0x8a, 0x22, 0x55, 0xa6, 0x09,
	0x26, 0x52, 0x63, 0x47, 0x71, 0xd2, 0x9b, 0x70, 0x01, 0x96, 0x1c, 0x85, 0xa3, 0xb0, 0xe4, 0x04,
	0x28, 0x9f, 0x76, 0x57, 0x36, 0xd6, 0xc8, 0xf3, 0x66, 0xde, 0x9b, 0x01, 0x77, 0x42, 0x29, 0xb1,
	0x0b, 0x6d, 0x1e, 0x68, 0xbb, 0x82, 0x05, 0xda, 0x3b, 0x76, 0x28, 0xf3, 0x58, 0xdb, 0x31, 0xcf,
	0xb6, 0xef, 0x91, 0x14, 0x9b, 0xb7, 0x5c, 0x6e, 0xb3, 0x48, 0xc9, 0x8d, 0x4a, 0xc2, 0x94, 0x67,
	0x2a, 0xc5, 0x49, 0xaa, 0x32, 0x85, 0xba, 0x95, 0x08, 0xf3, 0x40, 0xe3, 0xa3, 0x1e, 0xef, 0x1d,
	0x5c, 0xea, 0x6f, 0x3a, 0x07, 0xfb, 0x24, 0xb2, 0xb9, 0x94, 0x2a, 0xe3, 0x85, 0x89, 0xae, 0xc4,
	0xfd, 0x0f, 0x03, 0x74, 0x1e, 0xeb, 0x0d, 0xe3, 0x7a, 0xc1, 0xb4, 0xf6, 0x77, 0x65, 0x1e, 0xf7,
	0x73, 0x70, 0x7d, 0x8a, 0x47, 0x57, 0xa0, 0xb5, 0x64, 0xf3, 0x99, 0x3b, 0xf4, 0xc6, 0x9e, 0x3b,
	0x82, 0x67, 0xa8, 0x05, 0x9a, 0x4b, 0x76, 0xcf, 0xa6, 0xcf, 0x0c, 0x1a, 0xc8, 0x02, 0xa6, 0xc7,
	0xa0, 0x89, 0xda, 0xe0, 0xd2, 0x1b, 0xb9, 0x6c, 0xe1, 0x2d, 0xd6, 0xb0, 0x81, 0x00, 0xb0, 0xdc,
	0xa7, 0x25, 0x7d, 0x98, 0xc3, 0x73, 0xd4, 0x04, 0x0d, 0xca, 0x46, 0xf0, 0x02, 0x41, 0xd0, 0x1e,
	0x4e, 0xd9, 0x82, 0x7a, 0x6c, 0xbe, 0xa1, 0x6c, 0x0d, 0xad, 0xc1, 0xaf, 0x01, 0x7a, 0x5b, 0x15,
	0xe3, 0x7f, 0xb3, 0x0d, 0xba, 0xa7, 0x4e, 0x9b, 0x15, 0xe1, 0x66, 0xc6, 0xcb, 0xa0, 0xd6, 0x0b,
	0xb5, 0xe3, 0x52, 0x60, 0x95, 0x0a, 0x5b, 0x84, 0xb2, 0x8c, 0x7e, 0xe8, 0x3a, 0x89, 0xf4, 0x89,
	0xea, 0x6f, 0xcb, 0xf7, 0xd3, 0x6c, 0x4c, 0x28, 0xfd, 0x32, 0xbb, 0x93, 0xca, 0x8a, 0x06, 0x1a,
	0x57, 0xb0, 0x40, 0x2b, 0x07, 0x17, 0x35, 0xe9, 0xef, 0x03, 0xef, 0xd3, 0x40, 0xfb, 0x47, 0xde,
	0x5f, 0x39, 0x7e, 0xc9, 0xff, 0x98, 0xbd, 0xea, 0x93, 0x10, 0x1a, 0x68, 0x42, 0x8e, 0x13, 0x84,
	0xac, 0x1c, 0x42, 0xca, 0x99, 0x57, 0xab, 0x3c, 0xcc, 0xf9, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x5d,
	0xe8, 0x9e, 0xe0, 0x12, 0x02, 0x00, 0x00,
}
