// Copyright 2019 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 (
	

	
	
	
	
)

func ( *MessageInfo,  pointer,  marshalOptions) ( int) {
	if !flags.ProtoLegacy {
		return 0
	}

	 := *.Apply(.extensionOffset).Extensions()
	for ,  := range  {
		 := getExtensionFieldInfo(.Type())
		if .funcs.size == nil {
			continue
		}
		,  := protowire.DecodeTag(.wiretag)
		 += messageset.SizeField()
		 += .funcs.size(.Value(), protowire.SizeTag(messageset.FieldMessage), )
	}

	if  := .getUnknownBytes();  != nil {
		 += messageset.SizeUnknown(*)
	}

	return 
}

func ( *MessageInfo,  []byte,  pointer,  marshalOptions) ([]byte, error) {
	if !flags.ProtoLegacy {
		return , errors.New("no support for message_set_wire_format")
	}

	 := *.Apply(.extensionOffset).Extensions()
	switch len() {
	case 0:
	case 1:
		// Fast-path for one extension: Don't bother sorting the keys.
		for ,  := range  {
			var  error
			,  = marshalMessageSetField(, , , )
			if  != nil {
				return , 
			}
		}
	default:
		// Sort the keys to provide a deterministic encoding.
		// Not sure this is required, but the old code does it.
		 := make([]int, 0, len())
		for  := range  {
			 = append(, int())
		}
		sort.Ints()
		for ,  := range  {
			var  error
			,  = marshalMessageSetField(, , [int32()], )
			if  != nil {
				return , 
			}
		}
	}

	if  := .getUnknownBytes();  != nil {
		var  error
		,  = messageset.AppendUnknown(, *)
		if  != nil {
			return , 
		}
	}

	return , nil
}

func ( *MessageInfo,  []byte,  ExtensionField,  marshalOptions) ([]byte, error) {
	 := getExtensionFieldInfo(.Type())
	,  := protowire.DecodeTag(.wiretag)
	 = messageset.AppendFieldStart(, )
	,  := .funcs.marshal(, .Value(), protowire.EncodeTag(messageset.FieldMessage, protowire.BytesType), )
	if  != nil {
		return , 
	}
	 = messageset.AppendFieldEnd()
	return , nil
}

func ( *MessageInfo,  []byte,  pointer,  unmarshalOptions) ( unmarshalOutput,  error) {
	if !flags.ProtoLegacy {
		return , errors.New("no support for message_set_wire_format")
	}

	 := .Apply(.extensionOffset).Extensions()
	if * == nil {
		* = make(map[int32]ExtensionField)
	}
	 := *
	 := true
	 = messageset.Unmarshal(, true, func( protowire.Number,  []byte) error {
		,  := .unmarshalExtension(, , protowire.BytesType, , )
		if  == errUnknown {
			 := .mutableUnknownBytes()
			* = protowire.AppendTag(*, , protowire.BytesType)
			* = append(*, ...)
			return nil
		}
		if !.initialized {
			 = false
		}
		return 
	})
	.n = len()
	.initialized = 
	return , 
}