// Protocol Buffers for Go with Gadgets
//
// Copyright (c) 2018, The GoGo Authors. All rights reserved.
// http://github.com/gogo/protobuf
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package proto

import (
	
	
)

// makeMessageRefMarshaler differs a bit from makeMessageMarshaler
// It marshal a message T instead of a *T
func makeMessageRefMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .size()
			return  + SizeVarint(uint64()) + 
		},
		func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 = appendVarint(, )
			 := .cachedsize()
			 = appendVarint(, uint64())
			return .marshal(, , )
		}
}

// makeMessageRefSliceMarshaler differs quite a lot from makeMessageSliceMarshaler
// It marshals a slice of messages []T instead of []*T
func makeMessageRefSliceMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .getSlice(.typ)
			 := 0
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface()
				 := toAddrPointer(&, false)
				 := .size()
				 +=  + SizeVarint(uint64()) + 
			}
			return 
		},
		func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .getSlice(.typ)
			var ,  error
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface()
				 := toAddrPointer(&, false)
				 = appendVarint(, )
				 := .size()
				 = appendVarint(, uint64())
				,  = .marshal(, , )

				if  != nil {
					if ,  := .(*RequiredNotSetError);  {
						// Required field in submessage is not set.
						// We record the error but keep going, to give a complete marshaling.
						if  == nil {
							 = 
						}
						continue
					}
					if  == ErrNil {
						 = errRepeatedHasNil
					}
					return , 
				}
			}

			return , 
		}
}

func makeCustomPtrMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			if .isNil() {
				return 0
			}
			 := .asPointerTo(reflect.PtrTo(.typ)).Elem().Interface().(custom)
			 := .Size()
			return  + SizeVarint(uint64()) + 
		}, func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			if .isNil() {
				return , nil
			}
			 := .asPointerTo(reflect.PtrTo(.typ)).Elem().Interface().(custom)
			 := .Size()
			,  := .Marshal()
			if  != nil {
				return nil, 
			}
			 = appendVarint(, )
			 = appendVarint(, uint64())
			 = append(, ...)
			return , nil
		}
}

func makeCustomMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .asPointerTo(.typ).Interface().(custom)
			 := .Size()
			return  + SizeVarint(uint64()) + 
		}, func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .asPointerTo(.typ).Interface().(custom)
			 := .Size()
			,  := .Marshal()
			if  != nil {
				return nil, 
			}
			 = appendVarint(, )
			 = appendVarint(, uint64())
			 = append(, ...)
			return , nil
		}
}

func makeTimeMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .asPointerTo(.typ).Interface().(*time.Time)
			,  := timestampProto(*)
			if  != nil {
				return 0
			}
			 := Size()
			return  + SizeVarint(uint64()) + 
		}, func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .asPointerTo(.typ).Interface().(*time.Time)
			,  := timestampProto(*)
			if  != nil {
				return nil, 
			}
			,  := Marshal()
			if  != nil {
				return nil, 
			}
			 = appendVarint(, )
			 = appendVarint(, uint64(len()))
			 = append(, ...)
			return , nil
		}
}

func makeTimePtrMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			if .isNil() {
				return 0
			}
			 := .asPointerTo(reflect.PtrTo(.typ)).Elem().Interface().(*time.Time)
			,  := timestampProto(*)
			if  != nil {
				return 0
			}
			 := Size()
			return  + SizeVarint(uint64()) + 
		}, func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			if .isNil() {
				return , nil
			}
			 := .asPointerTo(reflect.PtrTo(.typ)).Elem().Interface().(*time.Time)
			,  := timestampProto(*)
			if  != nil {
				return nil, 
			}
			,  := Marshal()
			if  != nil {
				return nil, 
			}
			 = appendVarint(, )
			 = appendVarint(, uint64(len()))
			 = append(, ...)
			return , nil
		}
}

func makeTimeSliceMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .getSlice(.typ)
			 := 0
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(time.Time)
				,  := timestampProto()
				if  != nil {
					return 0
				}
				 := Size()
				 +=  + SizeVarint(uint64()) + 
			}
			return 
		},
		func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .getSlice(.typ)
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(time.Time)
				,  := timestampProto()
				if  != nil {
					return nil, 
				}
				 := Size()
				,  := Marshal()
				if  != nil {
					return nil, 
				}
				 = appendVarint(, )
				 = appendVarint(, uint64())
				 = append(, ...)
			}

			return , nil
		}
}

func makeTimePtrSliceMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .getSlice(reflect.PtrTo(.typ))
			 := 0
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(*time.Time)
				,  := timestampProto(*)
				if  != nil {
					return 0
				}
				 := Size()
				 +=  + SizeVarint(uint64()) + 
			}
			return 
		},
		func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .getSlice(reflect.PtrTo(.typ))
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(*time.Time)
				,  := timestampProto(*)
				if  != nil {
					return nil, 
				}
				 := Size()
				,  := Marshal()
				if  != nil {
					return nil, 
				}
				 = appendVarint(, )
				 = appendVarint(, uint64())
				 = append(, ...)
			}

			return , nil
		}
}

func makeDurationMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .asPointerTo(.typ).Interface().(*time.Duration)
			 := durationProto(*)
			 := Size()
			return  + SizeVarint(uint64()) + 
		}, func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .asPointerTo(.typ).Interface().(*time.Duration)
			 := durationProto(*)
			,  := Marshal()
			if  != nil {
				return nil, 
			}
			 = appendVarint(, )
			 = appendVarint(, uint64(len()))
			 = append(, ...)
			return , nil
		}
}

func makeDurationPtrMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			if .isNil() {
				return 0
			}
			 := .asPointerTo(reflect.PtrTo(.typ)).Elem().Interface().(*time.Duration)
			 := durationProto(*)
			 := Size()
			return  + SizeVarint(uint64()) + 
		}, func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			if .isNil() {
				return , nil
			}
			 := .asPointerTo(reflect.PtrTo(.typ)).Elem().Interface().(*time.Duration)
			 := durationProto(*)
			,  := Marshal()
			if  != nil {
				return nil, 
			}
			 = appendVarint(, )
			 = appendVarint(, uint64(len()))
			 = append(, ...)
			return , nil
		}
}

func makeDurationSliceMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .getSlice(.typ)
			 := 0
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(time.Duration)
				 := durationProto()
				 := Size()
				 +=  + SizeVarint(uint64()) + 
			}
			return 
		},
		func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .getSlice(.typ)
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(time.Duration)
				 := durationProto()
				 := Size()
				,  := Marshal()
				if  != nil {
					return nil, 
				}
				 = appendVarint(, )
				 = appendVarint(, uint64())
				 = append(, ...)
			}

			return , nil
		}
}

func makeDurationPtrSliceMarshaler( *marshalInfo) (sizer, marshaler) {
	return func( pointer,  int) int {
			 := .getSlice(reflect.PtrTo(.typ))
			 := 0
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(*time.Duration)
				 := durationProto(*)
				 := Size()
				 +=  + SizeVarint(uint64()) + 
			}
			return 
		},
		func( []byte,  pointer,  uint64,  bool) ([]byte, error) {
			 := .getSlice(reflect.PtrTo(.typ))
			for  := 0;  < .Len(); ++ {
				 := .Index()
				 := .Interface().(*time.Duration)
				 := durationProto(*)
				 := Size()
				,  := Marshal()
				if  != nil {
					return nil, 
				}
				 = appendVarint(, )
				 = appendVarint(, uint64())
				 = append(, ...)
			}

			return , nil
		}
}