// Copyright 2018 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 generate-types. DO NOT EDIT.

package filedesc

import (
	"fmt"
	"strings"
	"sync"

	"google.golang.org/protobuf/internal/descfmt"
	"google.golang.org/protobuf/internal/pragma"
	"google.golang.org/protobuf/reflect/protoreflect"
)

type Enums struct {
	List   []Enum
	once   sync.Once
	byName map[protoreflect.Name]*Enum // protected by once
}

func (p *Enums) Len() int {
	return len(p.List)
}
func (p *Enums) Get(i int) protoreflect.EnumDescriptor {
	return &p.List[i]
}
func (p *Enums) ByName(s protoreflect.Name) protoreflect.EnumDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Enums) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Enums) ProtoInternal(pragma.DoNotImplement) {}
func (p *Enums) lazyInit() *Enums {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Enum, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
			}
		}
	})
	return p
}

type EnumValues struct {
	List   []EnumValue
	once   sync.Once
	byName map[protoreflect.Name]*EnumValue       // protected by once
	byNum  map[protoreflect.EnumNumber]*EnumValue // protected by once
}

func (p *EnumValues) Len() int {
	return len(p.List)
}
func (p *EnumValues) Get(i int) protoreflect.EnumValueDescriptor {
	return &p.List[i]
}
func (p *EnumValues) ByName(s protoreflect.Name) protoreflect.EnumValueDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *EnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor {
	if d := p.lazyInit().byNum[n]; d != nil {
		return d
	}
	return nil
}
func (p *EnumValues) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *EnumValues) ProtoInternal(pragma.DoNotImplement) {}
func (p *EnumValues) lazyInit() *EnumValues {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*EnumValue, len(p.List))
			p.byNum = make(map[protoreflect.EnumNumber]*EnumValue, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
				if _, ok := p.byNum[d.Number()]; !ok {
					p.byNum[d.Number()] = d
				}
			}
		}
	})
	return p
}

type Messages struct {
	List   []Message
	once   sync.Once
	byName map[protoreflect.Name]*Message // protected by once
}

func (p *Messages) Len() int {
	return len(p.List)
}
func (p *Messages) Get(i int) protoreflect.MessageDescriptor {
	return &p.List[i]
}
func (p *Messages) ByName(s protoreflect.Name) protoreflect.MessageDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Messages) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Messages) ProtoInternal(pragma.DoNotImplement) {}
func (p *Messages) lazyInit() *Messages {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Message, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
			}
		}
	})
	return p
}

type Fields struct {
	List   []Field
	once   sync.Once
	byName map[protoreflect.Name]*Field        // protected by once
	byJSON map[string]*Field                   // protected by once
	byText map[string]*Field                   // protected by once
	byNum  map[protoreflect.FieldNumber]*Field // protected by once
}

func (p *Fields) Len() int {
	return len(p.List)
}
func (p *Fields) Get(i int) protoreflect.FieldDescriptor {
	return &p.List[i]
}
func (p *Fields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Fields) ByJSONName(s string) protoreflect.FieldDescriptor {
	if d := p.lazyInit().byJSON[s]; d != nil {
		return d
	}
	return nil
}
func (p *Fields) ByTextName(s string) protoreflect.FieldDescriptor {
	if d := p.lazyInit().byText[s]; d != nil {
		return d
	}
	return nil
}
func (p *Fields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor {
	if d := p.lazyInit().byNum[n]; d != nil {
		return d
	}
	return nil
}
func (p *Fields) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Fields) ProtoInternal(pragma.DoNotImplement) {}
func (p *Fields) lazyInit() *Fields {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Field, len(p.List))
			p.byJSON = make(map[string]*Field, len(p.List))
			p.byText = make(map[string]*Field, len(p.List))
			p.byNum = make(map[protoreflect.FieldNumber]*Field, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
				if _, ok := p.byJSON[d.JSONName()]; !ok {
					p.byJSON[d.JSONName()] = d
				}
				if _, ok := p.byText[d.TextName()]; !ok {
					p.byText[d.TextName()] = d
				}
				if isGroupLike(d) {
					lowerJSONName := strings.ToLower(d.JSONName())
					if _, ok := p.byJSON[lowerJSONName]; !ok {
						p.byJSON[lowerJSONName] = d
					}
					lowerTextName := strings.ToLower(d.TextName())
					if _, ok := p.byText[lowerTextName]; !ok {
						p.byText[lowerTextName] = d
					}
				}
				if _, ok := p.byNum[d.Number()]; !ok {
					p.byNum[d.Number()] = d
				}
			}
		}
	})
	return p
}

type Oneofs struct {
	List   []Oneof
	once   sync.Once
	byName map[protoreflect.Name]*Oneof // protected by once
}

func (p *Oneofs) Len() int {
	return len(p.List)
}
func (p *Oneofs) Get(i int) protoreflect.OneofDescriptor {
	return &p.List[i]
}
func (p *Oneofs) ByName(s protoreflect.Name) protoreflect.OneofDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Oneofs) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Oneofs) ProtoInternal(pragma.DoNotImplement) {}
func (p *Oneofs) lazyInit() *Oneofs {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Oneof, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
			}
		}
	})
	return p
}

type Extensions struct {
	List   []Extension
	once   sync.Once
	byName map[protoreflect.Name]*Extension // protected by once
}

func (p *Extensions) Len() int {
	return len(p.List)
}
func (p *Extensions) Get(i int) protoreflect.ExtensionDescriptor {
	return &p.List[i]
}
func (p *Extensions) ByName(s protoreflect.Name) protoreflect.ExtensionDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Extensions) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Extensions) ProtoInternal(pragma.DoNotImplement) {}
func (p *Extensions) lazyInit() *Extensions {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Extension, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
			}
		}
	})
	return p
}

type Services struct {
	List   []Service
	once   sync.Once
	byName map[protoreflect.Name]*Service // protected by once
}

func (p *Services) Len() int {
	return len(p.List)
}
func (p *Services) Get(i int) protoreflect.ServiceDescriptor {
	return &p.List[i]
}
func (p *Services) ByName(s protoreflect.Name) protoreflect.ServiceDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Services) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Services) ProtoInternal(pragma.DoNotImplement) {}
func (p *Services) lazyInit() *Services {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Service, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
			}
		}
	})
	return p
}

type Methods struct {
	List   []Method
	once   sync.Once
	byName map[protoreflect.Name]*Method // protected by once
}

func (p *Methods) Len() int {
	return len(p.List)
}
func (p *Methods) Get(i int) protoreflect.MethodDescriptor {
	return &p.List[i]
}
func (p *Methods) ByName(s protoreflect.Name) protoreflect.MethodDescriptor {
	if d := p.lazyInit().byName[s]; d != nil {
		return d
	}
	return nil
}
func (p *Methods) Format(s fmt.State, r rune) {
	descfmt.FormatList(s, r, p)
}
func (p *Methods) ProtoInternal(pragma.DoNotImplement) {}
func (p *Methods) lazyInit() *Methods {
	p.once.Do(func() {
		if len(p.List) > 0 {
			p.byName = make(map[protoreflect.Name]*Method, len(p.List))
			for i := range p.List {
				d := &p.List[i]
				if _, ok := p.byName[d.Name()]; !ok {
					p.byName[d.Name()] = d
				}
			}
		}
	})
	return p
}
