// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: internal/testprotos/benchmarks/micro/micro.proto

package micro

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

type SixteenRequired struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	F1            *int32                 `protobuf:"varint,1,req,name=f1" json:"f1,omitempty"`
	F2            *int32                 `protobuf:"varint,2,req,name=f2" json:"f2,omitempty"`
	F3            *int32                 `protobuf:"varint,3,req,name=f3" json:"f3,omitempty"`
	F4            *int32                 `protobuf:"varint,4,req,name=f4" json:"f4,omitempty"`
	F5            *int32                 `protobuf:"varint,5,req,name=f5" json:"f5,omitempty"`
	F6            *int32                 `protobuf:"varint,6,req,name=f6" json:"f6,omitempty"`
	F7            *int32                 `protobuf:"varint,7,req,name=f7" json:"f7,omitempty"`
	F8            *int32                 `protobuf:"varint,8,req,name=f8" json:"f8,omitempty"`
	F9            *int32                 `protobuf:"varint,9,req,name=f9" json:"f9,omitempty"`
	F10           *int32                 `protobuf:"varint,10,req,name=f10" json:"f10,omitempty"`
	F11           *int32                 `protobuf:"varint,11,req,name=f11" json:"f11,omitempty"`
	F12           *int32                 `protobuf:"varint,12,req,name=f12" json:"f12,omitempty"`
	F13           *int32                 `protobuf:"varint,13,req,name=f13" json:"f13,omitempty"`
	F14           *int32                 `protobuf:"varint,14,req,name=f14" json:"f14,omitempty"`
	F15           *int32                 `protobuf:"varint,15,req,name=f15" json:"f15,omitempty"`
	F16           *int32                 `protobuf:"varint,16,req,name=f16" json:"f16,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SixteenRequired) Reset() {
	*x = SixteenRequired{}
	mi := &file_internal_testprotos_benchmarks_micro_micro_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*SixteenRequired) ProtoMessage() {}

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

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

func (x *SixteenRequired) GetF1() int32 {
	if x != nil && x.F1 != nil {
		return *x.F1
	}
	return 0
}

func (x *SixteenRequired) GetF2() int32 {
	if x != nil && x.F2 != nil {
		return *x.F2
	}
	return 0
}

func (x *SixteenRequired) GetF3() int32 {
	if x != nil && x.F3 != nil {
		return *x.F3
	}
	return 0
}

func (x *SixteenRequired) GetF4() int32 {
	if x != nil && x.F4 != nil {
		return *x.F4
	}
	return 0
}

func (x *SixteenRequired) GetF5() int32 {
	if x != nil && x.F5 != nil {
		return *x.F5
	}
	return 0
}

func (x *SixteenRequired) GetF6() int32 {
	if x != nil && x.F6 != nil {
		return *x.F6
	}
	return 0
}

func (x *SixteenRequired) GetF7() int32 {
	if x != nil && x.F7 != nil {
		return *x.F7
	}
	return 0
}

func (x *SixteenRequired) GetF8() int32 {
	if x != nil && x.F8 != nil {
		return *x.F8
	}
	return 0
}

func (x *SixteenRequired) GetF9() int32 {
	if x != nil && x.F9 != nil {
		return *x.F9
	}
	return 0
}

func (x *SixteenRequired) GetF10() int32 {
	if x != nil && x.F10 != nil {
		return *x.F10
	}
	return 0
}

func (x *SixteenRequired) GetF11() int32 {
	if x != nil && x.F11 != nil {
		return *x.F11
	}
	return 0
}

func (x *SixteenRequired) GetF12() int32 {
	if x != nil && x.F12 != nil {
		return *x.F12
	}
	return 0
}

func (x *SixteenRequired) GetF13() int32 {
	if x != nil && x.F13 != nil {
		return *x.F13
	}
	return 0
}

func (x *SixteenRequired) GetF14() int32 {
	if x != nil && x.F14 != nil {
		return *x.F14
	}
	return 0
}

func (x *SixteenRequired) GetF15() int32 {
	if x != nil && x.F15 != nil {
		return *x.F15
	}
	return 0
}

func (x *SixteenRequired) GetF16() int32 {
	if x != nil && x.F16 != nil {
		return *x.F16
	}
	return 0
}

var File_internal_testprotos_benchmarks_micro_micro_proto protoreflect.FileDescriptor

const file_internal_testprotos_benchmarks_micro_micro_proto_rawDesc = "\n0internal/testprotos/benchmarks/micro/micro.protogoproto.proto.benchmarks.microt\"\x9f\nSixteenRequired\nf1 (Rf1\nf2 (Rf2\nf3 (Rf3\nf4 (Rf4\nf5 (Rf5\nf6 (Rf6\nf7 (Rf7\nf8 (Rf8\nf9	 (Rf9\nf10\n (Rf10\nf11 (Rf11\nf12 (Rf12\nf13\r (Rf13\nf14 (Rf14\nf15 (Rf15\nf16 (Rf16BAZ?google.golang.org/protobuf/internal/testprotos/benchmarks/micro"

var (
	file_internal_testprotos_benchmarks_micro_micro_proto_rawDescOnce sync.Once
	file_internal_testprotos_benchmarks_micro_micro_proto_rawDescData = file_internal_testprotos_benchmarks_micro_micro_proto_rawDesc
)

func file_internal_testprotos_benchmarks_micro_micro_proto_rawDescGZIP() []byte {
	file_internal_testprotos_benchmarks_micro_micro_proto_rawDescOnce.Do(func() {
		file_internal_testprotos_benchmarks_micro_micro_proto_rawDescData = string(protoimpl.X.CompressGZIP([]byte(file_internal_testprotos_benchmarks_micro_micro_proto_rawDescData)))
	})
	return []byte(file_internal_testprotos_benchmarks_micro_micro_proto_rawDescData)
}

var file_internal_testprotos_benchmarks_micro_micro_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_internal_testprotos_benchmarks_micro_micro_proto_goTypes = []any{
	(*SixteenRequired)(nil), // 0: goproto.proto.benchmarks.microt.SixteenRequired
}
var file_internal_testprotos_benchmarks_micro_micro_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_internal_testprotos_benchmarks_micro_micro_proto_init() }
func file_internal_testprotos_benchmarks_micro_micro_proto_init() {
	if File_internal_testprotos_benchmarks_micro_micro_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_testprotos_benchmarks_micro_micro_proto_rawDesc), len(file_internal_testprotos_benchmarks_micro_micro_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_benchmarks_micro_micro_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_benchmarks_micro_micro_proto_depIdxs,
		MessageInfos:      file_internal_testprotos_benchmarks_micro_micro_proto_msgTypes,
	}.Build()
	File_internal_testprotos_benchmarks_micro_micro_proto = out.File
	file_internal_testprotos_benchmarks_micro_micro_proto_goTypes = nil
	file_internal_testprotos_benchmarks_micro_micro_proto_depIdxs = nil
}
