// 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.

package impl

import (
	
	

	
	
	
)

type mergeOptions struct{}

func ( mergeOptions) (,  proto.Message) {
	proto.Merge(, )
}

// merge is protoreflect.Methods.Merge.
func ( *MessageInfo) ( protoiface.MergeInput) protoiface.MergeOutput {
	,  := .getPointer(.Destination)
	if ! {
		return protoiface.MergeOutput{}
	}
	,  := .getPointer(.Source)
	if ! {
		return protoiface.MergeOutput{}
	}
	.mergePointer(, , mergeOptions{})
	return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
}

func ( *MessageInfo) (,  pointer,  mergeOptions) {
	.init()
	if .IsNil() {
		panic(fmt.Sprintf("invalid value: merging into nil message"))
	}
	if .IsNil() {
		return
	}
	for ,  := range .orderedCoderFields {
		if .funcs.merge == nil {
			continue
		}
		 := .Apply(.offset)
		if .isPointer && .Elem().IsNil() {
			continue
		}
		.funcs.merge(.Apply(.offset), , , )
	}
	if .extensionOffset.IsValid() {
		 := .Apply(.extensionOffset).Extensions()
		 := .Apply(.extensionOffset).Extensions()
		if * == nil {
			* = make(map[int32]ExtensionField)
		}
		for ,  := range * {
			 := .Type()
			 := getExtensionFieldInfo()
			if .funcs.merge == nil {
				continue
			}
			 := (*)[]
			var  protoreflect.Value
			if .Type() == .Type() {
				 = .Value()
			}
			if !.IsValid() && .unmarshalNeedsValue {
				 = .New()
			}
			 = .funcs.merge(, .Value(), )
			.Set(.Type(), )
			(*)[] = 
		}
	}
	if .unknownOffset.IsValid() {
		 := .getUnknownBytes()
		if  != nil && len(*) > 0 {
			 := .mutableUnknownBytes()
			* = append(*, *...)
		}
	}
}

func (,  protoreflect.Value,  mergeOptions) protoreflect.Value {
	return 
}

func (,  protoreflect.Value,  mergeOptions) protoreflect.Value {
	return protoreflect.ValueOfBytes(append(emptyBuf[:], .Bytes()...))
}

func (,  protoreflect.Value,  mergeOptions) protoreflect.Value {
	 := .List()
	 := .List()
	for ,  := 0, .Len();  < ; ++ {
		.Append(.Get())
	}
	return 
}

func (,  protoreflect.Value,  mergeOptions) protoreflect.Value {
	 := .List()
	 := .List()
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Bytes()
		 := append(emptyBuf[:], ...)
		.Append(protoreflect.ValueOfBytes())
	}
	return 
}

func (,  protoreflect.Value,  mergeOptions) protoreflect.Value {
	 := .List()
	 := .List()
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Message()
		 := proto.Clone(.Interface()).ProtoReflect()
		.Append(protoreflect.ValueOfMessage())
	}
	return 
}

func (,  protoreflect.Value,  mergeOptions) protoreflect.Value {
	.Merge(.Message().Interface(), .Message().Interface())
	return 
}

func (,  pointer,  *coderFieldInfo,  mergeOptions) {
	if .mi != nil {
		if .Elem().IsNil() {
			.SetPointer(pointerOfValue(reflect.New(.mi.GoReflectType.Elem())))
		}
		.mi.mergePointer(.Elem(), .Elem(), )
	} else {
		 := .AsValueOf(.ft).Elem()
		 := .AsValueOf(.ft).Elem()
		if .IsNil() {
			.Set(reflect.New(.ft.Elem()))
		}
		.Merge(asMessage(), asMessage())
	}
}

func (,  pointer,  *coderFieldInfo,  mergeOptions) {
	for ,  := range .PointerSlice() {
		 := reflect.New(.ft.Elem().Elem())
		if .mi != nil {
			.mi.mergePointer(pointerOfValue(), , )
		} else {
			.Merge(asMessage(), asMessage(.AsValueOf(.ft.Elem().Elem())))
		}
		.AppendPointerSlice(pointerOfValue())
	}
}

func (,  pointer,  *coderFieldInfo,  mergeOptions) {
	*.Bytes() = append(emptyBuf[:], *.Bytes()...)
}

func (,  pointer,  *coderFieldInfo,  mergeOptions) {
	 := *.Bytes()
	if len() > 0 {
		*.Bytes() = append(emptyBuf[:], ...)
	}
}

func (,  pointer,  *coderFieldInfo,  mergeOptions) {
	 := .BytesSlice()
	for ,  := range *.BytesSlice() {
		* = append(*, append(emptyBuf[:], ...))
	}
}