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

import (
	"math"

	"google.golang.org/protobuf/internal/encoding/wire"
	"google.golang.org/protobuf/reflect/protoreflect"
)

// sizeBool returns the size of wire encoding a bool pointer as a Bool.
func sizeBool(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Bool()
	return tagsize + wire.SizeVarint(wire.EncodeBool(v))
}

// appendBool wire encodes a bool pointer as a Bool.
func appendBool(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Bool()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeBool(v))
	return b, nil
}

var coderBool = pointerCoderFuncs{
	size:    sizeBool,
	marshal: appendBool,
}

// sizeBool returns the size of wire encoding a bool pointer as a Bool.
// The zero value is not encoded.
func sizeBoolNoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Bool()
	if v == false {
		return 0
	}
	return tagsize + wire.SizeVarint(wire.EncodeBool(v))
}

// appendBool wire encodes a bool pointer as a Bool.
// The zero value is not encoded.
func appendBoolNoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Bool()
	if v == false {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeBool(v))
	return b, nil
}

var coderBoolNoZero = pointerCoderFuncs{
	size:    sizeBoolNoZero,
	marshal: appendBoolNoZero,
}

// sizeBoolPtr returns the size of wire encoding a *bool pointer as a Bool.
// It panics if the pointer is nil.
func sizeBoolPtr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.BoolPtr()
	return tagsize + wire.SizeVarint(wire.EncodeBool(v))
}

// appendBool wire encodes a *bool pointer as a Bool.
// It panics if the pointer is nil.
func appendBoolPtr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.BoolPtr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeBool(v))
	return b, nil
}

var coderBoolPtr = pointerCoderFuncs{
	size:    sizeBoolPtr,
	marshal: appendBoolPtr,
}

// sizeBoolSlice returns the size of wire encoding a []bool pointer as a repeated Bool.
func sizeBoolSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.BoolSlice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(wire.EncodeBool(v))
	}
	return size
}

// appendBoolSlice encodes a []bool pointer as a repeated Bool.
func appendBoolSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.BoolSlice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, wire.EncodeBool(v))
	}
	return b, nil
}

var coderBoolSlice = pointerCoderFuncs{
	size:    sizeBoolSlice,
	marshal: appendBoolSlice,
}

// sizeBoolPackedSlice returns the size of wire encoding a []bool pointer as a packed repeated Bool.
func sizeBoolPackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.BoolSlice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(wire.EncodeBool(v))
	}
	return tagsize + wire.SizeBytes(n)
}

// appendBoolPackedSlice encodes a []bool pointer as a packed repeated Bool.
func appendBoolPackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.BoolSlice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(wire.EncodeBool(v))
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, wire.EncodeBool(v))
	}
	return b, nil
}

var coderBoolPackedSlice = pointerCoderFuncs{
	size:    sizeBoolPackedSlice,
	marshal: appendBoolPackedSlice,
}

// sizeBoolIface returns the size of wire encoding a bool value as a Bool.
func sizeBoolIface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(bool)
	return tagsize + wire.SizeVarint(wire.EncodeBool(v))
}

// appendBoolIface encodes a bool value as a Bool.
func appendBoolIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(bool)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeBool(v))
	return b, nil
}

var coderBoolIface = ifaceCoderFuncs{
	size:    sizeBoolIface,
	marshal: appendBoolIface,
}

// sizeBoolSliceIface returns the size of wire encoding a []bool value as a repeated Bool.
func sizeBoolSliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]bool)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(wire.EncodeBool(v))
	}
	return size
}

// appendBoolSliceIface encodes a []bool value as a repeated Bool.
func appendBoolSliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]bool)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, wire.EncodeBool(v))
	}
	return b, nil
}

var coderBoolSliceIface = ifaceCoderFuncs{
	size:    sizeBoolSliceIface,
	marshal: appendBoolSliceIface,
}

// sizeInt32 returns the size of wire encoding a int32 pointer as a Int32.
func sizeInt32(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int32()
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt32 wire encodes a int32 pointer as a Int32.
func appendInt32(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int32()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt32 = pointerCoderFuncs{
	size:    sizeInt32,
	marshal: appendInt32,
}

// sizeInt32 returns the size of wire encoding a int32 pointer as a Int32.
// The zero value is not encoded.
func sizeInt32NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int32()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt32 wire encodes a int32 pointer as a Int32.
// The zero value is not encoded.
func appendInt32NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int32()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt32NoZero = pointerCoderFuncs{
	size:    sizeInt32NoZero,
	marshal: appendInt32NoZero,
}

// sizeInt32Ptr returns the size of wire encoding a *int32 pointer as a Int32.
// It panics if the pointer is nil.
func sizeInt32Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.Int32Ptr()
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt32 wire encodes a *int32 pointer as a Int32.
// It panics if the pointer is nil.
func appendInt32Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Int32Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt32Ptr = pointerCoderFuncs{
	size:    sizeInt32Ptr,
	marshal: appendInt32Ptr,
}

// sizeInt32Slice returns the size of wire encoding a []int32 pointer as a repeated Int32.
func sizeInt32Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int32Slice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(uint64(v))
	}
	return size
}

// appendInt32Slice encodes a []int32 pointer as a repeated Int32.
func appendInt32Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int32Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderInt32Slice = pointerCoderFuncs{
	size:    sizeInt32Slice,
	marshal: appendInt32Slice,
}

// sizeInt32PackedSlice returns the size of wire encoding a []int32 pointer as a packed repeated Int32.
func sizeInt32PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int32Slice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(uint64(v))
	}
	return tagsize + wire.SizeBytes(n)
}

// appendInt32PackedSlice encodes a []int32 pointer as a packed repeated Int32.
func appendInt32PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int32Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(uint64(v))
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderInt32PackedSlice = pointerCoderFuncs{
	size:    sizeInt32PackedSlice,
	marshal: appendInt32PackedSlice,
}

// sizeInt32Iface returns the size of wire encoding a int32 value as a Int32.
func sizeInt32Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(int32)
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt32Iface encodes a int32 value as a Int32.
func appendInt32Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(int32)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt32Iface = ifaceCoderFuncs{
	size:    sizeInt32Iface,
	marshal: appendInt32Iface,
}

// sizeInt32SliceIface returns the size of wire encoding a []int32 value as a repeated Int32.
func sizeInt32SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]int32)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(uint64(v))
	}
	return size
}

// appendInt32SliceIface encodes a []int32 value as a repeated Int32.
func appendInt32SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]int32)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderInt32SliceIface = ifaceCoderFuncs{
	size:    sizeInt32SliceIface,
	marshal: appendInt32SliceIface,
}

// sizeSint32 returns the size of wire encoding a int32 pointer as a Sint32.
func sizeSint32(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int32()
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
}

// appendSint32 wire encodes a int32 pointer as a Sint32.
func appendSint32(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int32()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	return b, nil
}

var coderSint32 = pointerCoderFuncs{
	size:    sizeSint32,
	marshal: appendSint32,
}

// sizeSint32 returns the size of wire encoding a int32 pointer as a Sint32.
// The zero value is not encoded.
func sizeSint32NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int32()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
}

// appendSint32 wire encodes a int32 pointer as a Sint32.
// The zero value is not encoded.
func appendSint32NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int32()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	return b, nil
}

var coderSint32NoZero = pointerCoderFuncs{
	size:    sizeSint32NoZero,
	marshal: appendSint32NoZero,
}

// sizeSint32Ptr returns the size of wire encoding a *int32 pointer as a Sint32.
// It panics if the pointer is nil.
func sizeSint32Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.Int32Ptr()
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
}

// appendSint32 wire encodes a *int32 pointer as a Sint32.
// It panics if the pointer is nil.
func appendSint32Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Int32Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	return b, nil
}

var coderSint32Ptr = pointerCoderFuncs{
	size:    sizeSint32Ptr,
	marshal: appendSint32Ptr,
}

// sizeSint32Slice returns the size of wire encoding a []int32 pointer as a repeated Sint32.
func sizeSint32Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int32Slice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
	}
	return size
}

// appendSint32Slice encodes a []int32 pointer as a repeated Sint32.
func appendSint32Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int32Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	}
	return b, nil
}

var coderSint32Slice = pointerCoderFuncs{
	size:    sizeSint32Slice,
	marshal: appendSint32Slice,
}

// sizeSint32PackedSlice returns the size of wire encoding a []int32 pointer as a packed repeated Sint32.
func sizeSint32PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int32Slice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(wire.EncodeZigZag(int64(v)))
	}
	return tagsize + wire.SizeBytes(n)
}

// appendSint32PackedSlice encodes a []int32 pointer as a packed repeated Sint32.
func appendSint32PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int32Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(wire.EncodeZigZag(int64(v)))
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	}
	return b, nil
}

var coderSint32PackedSlice = pointerCoderFuncs{
	size:    sizeSint32PackedSlice,
	marshal: appendSint32PackedSlice,
}

// sizeSint32Iface returns the size of wire encoding a int32 value as a Sint32.
func sizeSint32Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(int32)
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
}

// appendSint32Iface encodes a int32 value as a Sint32.
func appendSint32Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(int32)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	return b, nil
}

var coderSint32Iface = ifaceCoderFuncs{
	size:    sizeSint32Iface,
	marshal: appendSint32Iface,
}

// sizeSint32SliceIface returns the size of wire encoding a []int32 value as a repeated Sint32.
func sizeSint32SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]int32)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
	}
	return size
}

// appendSint32SliceIface encodes a []int32 value as a repeated Sint32.
func appendSint32SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]int32)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
	}
	return b, nil
}

var coderSint32SliceIface = ifaceCoderFuncs{
	size:    sizeSint32SliceIface,
	marshal: appendSint32SliceIface,
}

// sizeUint32 returns the size of wire encoding a uint32 pointer as a Uint32.
func sizeUint32(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Uint32()
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendUint32 wire encodes a uint32 pointer as a Uint32.
func appendUint32(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint32()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderUint32 = pointerCoderFuncs{
	size:    sizeUint32,
	marshal: appendUint32,
}

// sizeUint32 returns the size of wire encoding a uint32 pointer as a Uint32.
// The zero value is not encoded.
func sizeUint32NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Uint32()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendUint32 wire encodes a uint32 pointer as a Uint32.
// The zero value is not encoded.
func appendUint32NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint32()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderUint32NoZero = pointerCoderFuncs{
	size:    sizeUint32NoZero,
	marshal: appendUint32NoZero,
}

// sizeUint32Ptr returns the size of wire encoding a *uint32 pointer as a Uint32.
// It panics if the pointer is nil.
func sizeUint32Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.Uint32Ptr()
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendUint32 wire encodes a *uint32 pointer as a Uint32.
// It panics if the pointer is nil.
func appendUint32Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Uint32Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderUint32Ptr = pointerCoderFuncs{
	size:    sizeUint32Ptr,
	marshal: appendUint32Ptr,
}

// sizeUint32Slice returns the size of wire encoding a []uint32 pointer as a repeated Uint32.
func sizeUint32Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint32Slice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(uint64(v))
	}
	return size
}

// appendUint32Slice encodes a []uint32 pointer as a repeated Uint32.
func appendUint32Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint32Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderUint32Slice = pointerCoderFuncs{
	size:    sizeUint32Slice,
	marshal: appendUint32Slice,
}

// sizeUint32PackedSlice returns the size of wire encoding a []uint32 pointer as a packed repeated Uint32.
func sizeUint32PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint32Slice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(uint64(v))
	}
	return tagsize + wire.SizeBytes(n)
}

// appendUint32PackedSlice encodes a []uint32 pointer as a packed repeated Uint32.
func appendUint32PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint32Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(uint64(v))
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderUint32PackedSlice = pointerCoderFuncs{
	size:    sizeUint32PackedSlice,
	marshal: appendUint32PackedSlice,
}

// sizeUint32Iface returns the size of wire encoding a uint32 value as a Uint32.
func sizeUint32Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(uint32)
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendUint32Iface encodes a uint32 value as a Uint32.
func appendUint32Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(uint32)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderUint32Iface = ifaceCoderFuncs{
	size:    sizeUint32Iface,
	marshal: appendUint32Iface,
}

// sizeUint32SliceIface returns the size of wire encoding a []uint32 value as a repeated Uint32.
func sizeUint32SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]uint32)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(uint64(v))
	}
	return size
}

// appendUint32SliceIface encodes a []uint32 value as a repeated Uint32.
func appendUint32SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]uint32)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderUint32SliceIface = ifaceCoderFuncs{
	size:    sizeUint32SliceIface,
	marshal: appendUint32SliceIface,
}

// sizeInt64 returns the size of wire encoding a int64 pointer as a Int64.
func sizeInt64(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int64()
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt64 wire encodes a int64 pointer as a Int64.
func appendInt64(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int64()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt64 = pointerCoderFuncs{
	size:    sizeInt64,
	marshal: appendInt64,
}

// sizeInt64 returns the size of wire encoding a int64 pointer as a Int64.
// The zero value is not encoded.
func sizeInt64NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int64()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt64 wire encodes a int64 pointer as a Int64.
// The zero value is not encoded.
func appendInt64NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int64()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt64NoZero = pointerCoderFuncs{
	size:    sizeInt64NoZero,
	marshal: appendInt64NoZero,
}

// sizeInt64Ptr returns the size of wire encoding a *int64 pointer as a Int64.
// It panics if the pointer is nil.
func sizeInt64Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.Int64Ptr()
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt64 wire encodes a *int64 pointer as a Int64.
// It panics if the pointer is nil.
func appendInt64Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Int64Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt64Ptr = pointerCoderFuncs{
	size:    sizeInt64Ptr,
	marshal: appendInt64Ptr,
}

// sizeInt64Slice returns the size of wire encoding a []int64 pointer as a repeated Int64.
func sizeInt64Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int64Slice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(uint64(v))
	}
	return size
}

// appendInt64Slice encodes a []int64 pointer as a repeated Int64.
func appendInt64Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int64Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderInt64Slice = pointerCoderFuncs{
	size:    sizeInt64Slice,
	marshal: appendInt64Slice,
}

// sizeInt64PackedSlice returns the size of wire encoding a []int64 pointer as a packed repeated Int64.
func sizeInt64PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int64Slice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(uint64(v))
	}
	return tagsize + wire.SizeBytes(n)
}

// appendInt64PackedSlice encodes a []int64 pointer as a packed repeated Int64.
func appendInt64PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int64Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(uint64(v))
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderInt64PackedSlice = pointerCoderFuncs{
	size:    sizeInt64PackedSlice,
	marshal: appendInt64PackedSlice,
}

// sizeInt64Iface returns the size of wire encoding a int64 value as a Int64.
func sizeInt64Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(int64)
	return tagsize + wire.SizeVarint(uint64(v))
}

// appendInt64Iface encodes a int64 value as a Int64.
func appendInt64Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(int64)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, uint64(v))
	return b, nil
}

var coderInt64Iface = ifaceCoderFuncs{
	size:    sizeInt64Iface,
	marshal: appendInt64Iface,
}

// sizeInt64SliceIface returns the size of wire encoding a []int64 value as a repeated Int64.
func sizeInt64SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]int64)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(uint64(v))
	}
	return size
}

// appendInt64SliceIface encodes a []int64 value as a repeated Int64.
func appendInt64SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]int64)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, uint64(v))
	}
	return b, nil
}

var coderInt64SliceIface = ifaceCoderFuncs{
	size:    sizeInt64SliceIface,
	marshal: appendInt64SliceIface,
}

// sizeSint64 returns the size of wire encoding a int64 pointer as a Sint64.
func sizeSint64(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int64()
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
}

// appendSint64 wire encodes a int64 pointer as a Sint64.
func appendSint64(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int64()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	return b, nil
}

var coderSint64 = pointerCoderFuncs{
	size:    sizeSint64,
	marshal: appendSint64,
}

// sizeSint64 returns the size of wire encoding a int64 pointer as a Sint64.
// The zero value is not encoded.
func sizeSint64NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int64()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
}

// appendSint64 wire encodes a int64 pointer as a Sint64.
// The zero value is not encoded.
func appendSint64NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int64()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	return b, nil
}

var coderSint64NoZero = pointerCoderFuncs{
	size:    sizeSint64NoZero,
	marshal: appendSint64NoZero,
}

// sizeSint64Ptr returns the size of wire encoding a *int64 pointer as a Sint64.
// It panics if the pointer is nil.
func sizeSint64Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.Int64Ptr()
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
}

// appendSint64 wire encodes a *int64 pointer as a Sint64.
// It panics if the pointer is nil.
func appendSint64Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Int64Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	return b, nil
}

var coderSint64Ptr = pointerCoderFuncs{
	size:    sizeSint64Ptr,
	marshal: appendSint64Ptr,
}

// sizeSint64Slice returns the size of wire encoding a []int64 pointer as a repeated Sint64.
func sizeSint64Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int64Slice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
	}
	return size
}

// appendSint64Slice encodes a []int64 pointer as a repeated Sint64.
func appendSint64Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int64Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	}
	return b, nil
}

var coderSint64Slice = pointerCoderFuncs{
	size:    sizeSint64Slice,
	marshal: appendSint64Slice,
}

// sizeSint64PackedSlice returns the size of wire encoding a []int64 pointer as a packed repeated Sint64.
func sizeSint64PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int64Slice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(wire.EncodeZigZag(v))
	}
	return tagsize + wire.SizeBytes(n)
}

// appendSint64PackedSlice encodes a []int64 pointer as a packed repeated Sint64.
func appendSint64PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int64Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(wire.EncodeZigZag(v))
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	}
	return b, nil
}

var coderSint64PackedSlice = pointerCoderFuncs{
	size:    sizeSint64PackedSlice,
	marshal: appendSint64PackedSlice,
}

// sizeSint64Iface returns the size of wire encoding a int64 value as a Sint64.
func sizeSint64Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(int64)
	return tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
}

// appendSint64Iface encodes a int64 value as a Sint64.
func appendSint64Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(int64)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	return b, nil
}

var coderSint64Iface = ifaceCoderFuncs{
	size:    sizeSint64Iface,
	marshal: appendSint64Iface,
}

// sizeSint64SliceIface returns the size of wire encoding a []int64 value as a repeated Sint64.
func sizeSint64SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]int64)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
	}
	return size
}

// appendSint64SliceIface encodes a []int64 value as a repeated Sint64.
func appendSint64SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]int64)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, wire.EncodeZigZag(v))
	}
	return b, nil
}

var coderSint64SliceIface = ifaceCoderFuncs{
	size:    sizeSint64SliceIface,
	marshal: appendSint64SliceIface,
}

// sizeUint64 returns the size of wire encoding a uint64 pointer as a Uint64.
func sizeUint64(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Uint64()
	return tagsize + wire.SizeVarint(v)
}

// appendUint64 wire encodes a uint64 pointer as a Uint64.
func appendUint64(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint64()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, v)
	return b, nil
}

var coderUint64 = pointerCoderFuncs{
	size:    sizeUint64,
	marshal: appendUint64,
}

// sizeUint64 returns the size of wire encoding a uint64 pointer as a Uint64.
// The zero value is not encoded.
func sizeUint64NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Uint64()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeVarint(v)
}

// appendUint64 wire encodes a uint64 pointer as a Uint64.
// The zero value is not encoded.
func appendUint64NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint64()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, v)
	return b, nil
}

var coderUint64NoZero = pointerCoderFuncs{
	size:    sizeUint64NoZero,
	marshal: appendUint64NoZero,
}

// sizeUint64Ptr returns the size of wire encoding a *uint64 pointer as a Uint64.
// It panics if the pointer is nil.
func sizeUint64Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.Uint64Ptr()
	return tagsize + wire.SizeVarint(v)
}

// appendUint64 wire encodes a *uint64 pointer as a Uint64.
// It panics if the pointer is nil.
func appendUint64Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Uint64Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, v)
	return b, nil
}

var coderUint64Ptr = pointerCoderFuncs{
	size:    sizeUint64Ptr,
	marshal: appendUint64Ptr,
}

// sizeUint64Slice returns the size of wire encoding a []uint64 pointer as a repeated Uint64.
func sizeUint64Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint64Slice()
	for _, v := range s {
		size += tagsize + wire.SizeVarint(v)
	}
	return size
}

// appendUint64Slice encodes a []uint64 pointer as a repeated Uint64.
func appendUint64Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint64Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, v)
	}
	return b, nil
}

var coderUint64Slice = pointerCoderFuncs{
	size:    sizeUint64Slice,
	marshal: appendUint64Slice,
}

// sizeUint64PackedSlice returns the size of wire encoding a []uint64 pointer as a packed repeated Uint64.
func sizeUint64PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint64Slice()
	if len(s) == 0 {
		return 0
	}
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(v)
	}
	return tagsize + wire.SizeBytes(n)
}

// appendUint64PackedSlice encodes a []uint64 pointer as a packed repeated Uint64.
func appendUint64PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint64Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := 0
	for _, v := range s {
		n += wire.SizeVarint(v)
	}
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendVarint(b, v)
	}
	return b, nil
}

var coderUint64PackedSlice = pointerCoderFuncs{
	size:    sizeUint64PackedSlice,
	marshal: appendUint64PackedSlice,
}

// sizeUint64Iface returns the size of wire encoding a uint64 value as a Uint64.
func sizeUint64Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(uint64)
	return tagsize + wire.SizeVarint(v)
}

// appendUint64Iface encodes a uint64 value as a Uint64.
func appendUint64Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(uint64)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendVarint(b, v)
	return b, nil
}

var coderUint64Iface = ifaceCoderFuncs{
	size:    sizeUint64Iface,
	marshal: appendUint64Iface,
}

// sizeUint64SliceIface returns the size of wire encoding a []uint64 value as a repeated Uint64.
func sizeUint64SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]uint64)
	for _, v := range s {
		size += tagsize + wire.SizeVarint(v)
	}
	return size
}

// appendUint64SliceIface encodes a []uint64 value as a repeated Uint64.
func appendUint64SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]uint64)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendVarint(b, v)
	}
	return b, nil
}

var coderUint64SliceIface = ifaceCoderFuncs{
	size:    sizeUint64SliceIface,
	marshal: appendUint64SliceIface,
}

// sizeSfixed32 returns the size of wire encoding a int32 pointer as a Sfixed32.
func sizeSfixed32(p pointer, tagsize int, _ marshalOptions) (size int) {

	return tagsize + wire.SizeFixed32()
}

// appendSfixed32 wire encodes a int32 pointer as a Sfixed32.
func appendSfixed32(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int32()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, uint32(v))
	return b, nil
}

var coderSfixed32 = pointerCoderFuncs{
	size:    sizeSfixed32,
	marshal: appendSfixed32,
}

// sizeSfixed32 returns the size of wire encoding a int32 pointer as a Sfixed32.
// The zero value is not encoded.
func sizeSfixed32NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int32()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeFixed32()
}

// appendSfixed32 wire encodes a int32 pointer as a Sfixed32.
// The zero value is not encoded.
func appendSfixed32NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int32()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, uint32(v))
	return b, nil
}

var coderSfixed32NoZero = pointerCoderFuncs{
	size:    sizeSfixed32NoZero,
	marshal: appendSfixed32NoZero,
}

// sizeSfixed32Ptr returns the size of wire encoding a *int32 pointer as a Sfixed32.
// It panics if the pointer is nil.
func sizeSfixed32Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	return tagsize + wire.SizeFixed32()
}

// appendSfixed32 wire encodes a *int32 pointer as a Sfixed32.
// It panics if the pointer is nil.
func appendSfixed32Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Int32Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, uint32(v))
	return b, nil
}

var coderSfixed32Ptr = pointerCoderFuncs{
	size:    sizeSfixed32Ptr,
	marshal: appendSfixed32Ptr,
}

// sizeSfixed32Slice returns the size of wire encoding a []int32 pointer as a repeated Sfixed32.
func sizeSfixed32Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int32Slice()
	size = len(s) * (tagsize + wire.SizeFixed32())
	return size
}

// appendSfixed32Slice encodes a []int32 pointer as a repeated Sfixed32.
func appendSfixed32Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int32Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed32(b, uint32(v))
	}
	return b, nil
}

var coderSfixed32Slice = pointerCoderFuncs{
	size:    sizeSfixed32Slice,
	marshal: appendSfixed32Slice,
}

// sizeSfixed32PackedSlice returns the size of wire encoding a []int32 pointer as a packed repeated Sfixed32.
func sizeSfixed32PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int32Slice()
	if len(s) == 0 {
		return 0
	}
	n := len(s) * wire.SizeFixed32()
	return tagsize + wire.SizeBytes(n)
}

// appendSfixed32PackedSlice encodes a []int32 pointer as a packed repeated Sfixed32.
func appendSfixed32PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int32Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := len(s) * wire.SizeFixed32()
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendFixed32(b, uint32(v))
	}
	return b, nil
}

var coderSfixed32PackedSlice = pointerCoderFuncs{
	size:    sizeSfixed32PackedSlice,
	marshal: appendSfixed32PackedSlice,
}

// sizeSfixed32Iface returns the size of wire encoding a int32 value as a Sfixed32.
func sizeSfixed32Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	return tagsize + wire.SizeFixed32()
}

// appendSfixed32Iface encodes a int32 value as a Sfixed32.
func appendSfixed32Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(int32)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, uint32(v))
	return b, nil
}

var coderSfixed32Iface = ifaceCoderFuncs{
	size:    sizeSfixed32Iface,
	marshal: appendSfixed32Iface,
}

// sizeSfixed32SliceIface returns the size of wire encoding a []int32 value as a repeated Sfixed32.
func sizeSfixed32SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]int32)
	size = len(s) * (tagsize + wire.SizeFixed32())
	return size
}

// appendSfixed32SliceIface encodes a []int32 value as a repeated Sfixed32.
func appendSfixed32SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]int32)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed32(b, uint32(v))
	}
	return b, nil
}

var coderSfixed32SliceIface = ifaceCoderFuncs{
	size:    sizeSfixed32SliceIface,
	marshal: appendSfixed32SliceIface,
}

// sizeFixed32 returns the size of wire encoding a uint32 pointer as a Fixed32.
func sizeFixed32(p pointer, tagsize int, _ marshalOptions) (size int) {

	return tagsize + wire.SizeFixed32()
}

// appendFixed32 wire encodes a uint32 pointer as a Fixed32.
func appendFixed32(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint32()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, v)
	return b, nil
}

var coderFixed32 = pointerCoderFuncs{
	size:    sizeFixed32,
	marshal: appendFixed32,
}

// sizeFixed32 returns the size of wire encoding a uint32 pointer as a Fixed32.
// The zero value is not encoded.
func sizeFixed32NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Uint32()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeFixed32()
}

// appendFixed32 wire encodes a uint32 pointer as a Fixed32.
// The zero value is not encoded.
func appendFixed32NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint32()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, v)
	return b, nil
}

var coderFixed32NoZero = pointerCoderFuncs{
	size:    sizeFixed32NoZero,
	marshal: appendFixed32NoZero,
}

// sizeFixed32Ptr returns the size of wire encoding a *uint32 pointer as a Fixed32.
// It panics if the pointer is nil.
func sizeFixed32Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	return tagsize + wire.SizeFixed32()
}

// appendFixed32 wire encodes a *uint32 pointer as a Fixed32.
// It panics if the pointer is nil.
func appendFixed32Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Uint32Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, v)
	return b, nil
}

var coderFixed32Ptr = pointerCoderFuncs{
	size:    sizeFixed32Ptr,
	marshal: appendFixed32Ptr,
}

// sizeFixed32Slice returns the size of wire encoding a []uint32 pointer as a repeated Fixed32.
func sizeFixed32Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint32Slice()
	size = len(s) * (tagsize + wire.SizeFixed32())
	return size
}

// appendFixed32Slice encodes a []uint32 pointer as a repeated Fixed32.
func appendFixed32Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint32Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed32(b, v)
	}
	return b, nil
}

var coderFixed32Slice = pointerCoderFuncs{
	size:    sizeFixed32Slice,
	marshal: appendFixed32Slice,
}

// sizeFixed32PackedSlice returns the size of wire encoding a []uint32 pointer as a packed repeated Fixed32.
func sizeFixed32PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint32Slice()
	if len(s) == 0 {
		return 0
	}
	n := len(s) * wire.SizeFixed32()
	return tagsize + wire.SizeBytes(n)
}

// appendFixed32PackedSlice encodes a []uint32 pointer as a packed repeated Fixed32.
func appendFixed32PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint32Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := len(s) * wire.SizeFixed32()
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendFixed32(b, v)
	}
	return b, nil
}

var coderFixed32PackedSlice = pointerCoderFuncs{
	size:    sizeFixed32PackedSlice,
	marshal: appendFixed32PackedSlice,
}

// sizeFixed32Iface returns the size of wire encoding a uint32 value as a Fixed32.
func sizeFixed32Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	return tagsize + wire.SizeFixed32()
}

// appendFixed32Iface encodes a uint32 value as a Fixed32.
func appendFixed32Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(uint32)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, v)
	return b, nil
}

var coderFixed32Iface = ifaceCoderFuncs{
	size:    sizeFixed32Iface,
	marshal: appendFixed32Iface,
}

// sizeFixed32SliceIface returns the size of wire encoding a []uint32 value as a repeated Fixed32.
func sizeFixed32SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]uint32)
	size = len(s) * (tagsize + wire.SizeFixed32())
	return size
}

// appendFixed32SliceIface encodes a []uint32 value as a repeated Fixed32.
func appendFixed32SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]uint32)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed32(b, v)
	}
	return b, nil
}

var coderFixed32SliceIface = ifaceCoderFuncs{
	size:    sizeFixed32SliceIface,
	marshal: appendFixed32SliceIface,
}

// sizeFloat returns the size of wire encoding a float32 pointer as a Float.
func sizeFloat(p pointer, tagsize int, _ marshalOptions) (size int) {

	return tagsize + wire.SizeFixed32()
}

// appendFloat wire encodes a float32 pointer as a Float.
func appendFloat(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Float32()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, math.Float32bits(v))
	return b, nil
}

var coderFloat = pointerCoderFuncs{
	size:    sizeFloat,
	marshal: appendFloat,
}

// sizeFloat returns the size of wire encoding a float32 pointer as a Float.
// The zero value is not encoded.
func sizeFloatNoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Float32()
	if v == 0 && !math.Signbit(float64(v)) {
		return 0
	}
	return tagsize + wire.SizeFixed32()
}

// appendFloat wire encodes a float32 pointer as a Float.
// The zero value is not encoded.
func appendFloatNoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Float32()
	if v == 0 && !math.Signbit(float64(v)) {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, math.Float32bits(v))
	return b, nil
}

var coderFloatNoZero = pointerCoderFuncs{
	size:    sizeFloatNoZero,
	marshal: appendFloatNoZero,
}

// sizeFloatPtr returns the size of wire encoding a *float32 pointer as a Float.
// It panics if the pointer is nil.
func sizeFloatPtr(p pointer, tagsize int, _ marshalOptions) (size int) {
	return tagsize + wire.SizeFixed32()
}

// appendFloat wire encodes a *float32 pointer as a Float.
// It panics if the pointer is nil.
func appendFloatPtr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Float32Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, math.Float32bits(v))
	return b, nil
}

var coderFloatPtr = pointerCoderFuncs{
	size:    sizeFloatPtr,
	marshal: appendFloatPtr,
}

// sizeFloatSlice returns the size of wire encoding a []float32 pointer as a repeated Float.
func sizeFloatSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Float32Slice()
	size = len(s) * (tagsize + wire.SizeFixed32())
	return size
}

// appendFloatSlice encodes a []float32 pointer as a repeated Float.
func appendFloatSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Float32Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed32(b, math.Float32bits(v))
	}
	return b, nil
}

var coderFloatSlice = pointerCoderFuncs{
	size:    sizeFloatSlice,
	marshal: appendFloatSlice,
}

// sizeFloatPackedSlice returns the size of wire encoding a []float32 pointer as a packed repeated Float.
func sizeFloatPackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Float32Slice()
	if len(s) == 0 {
		return 0
	}
	n := len(s) * wire.SizeFixed32()
	return tagsize + wire.SizeBytes(n)
}

// appendFloatPackedSlice encodes a []float32 pointer as a packed repeated Float.
func appendFloatPackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Float32Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := len(s) * wire.SizeFixed32()
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendFixed32(b, math.Float32bits(v))
	}
	return b, nil
}

var coderFloatPackedSlice = pointerCoderFuncs{
	size:    sizeFloatPackedSlice,
	marshal: appendFloatPackedSlice,
}

// sizeFloatIface returns the size of wire encoding a float32 value as a Float.
func sizeFloatIface(ival interface{}, tagsize int, _ marshalOptions) int {
	return tagsize + wire.SizeFixed32()
}

// appendFloatIface encodes a float32 value as a Float.
func appendFloatIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(float32)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed32(b, math.Float32bits(v))
	return b, nil
}

var coderFloatIface = ifaceCoderFuncs{
	size:    sizeFloatIface,
	marshal: appendFloatIface,
}

// sizeFloatSliceIface returns the size of wire encoding a []float32 value as a repeated Float.
func sizeFloatSliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]float32)
	size = len(s) * (tagsize + wire.SizeFixed32())
	return size
}

// appendFloatSliceIface encodes a []float32 value as a repeated Float.
func appendFloatSliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]float32)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed32(b, math.Float32bits(v))
	}
	return b, nil
}

var coderFloatSliceIface = ifaceCoderFuncs{
	size:    sizeFloatSliceIface,
	marshal: appendFloatSliceIface,
}

// sizeSfixed64 returns the size of wire encoding a int64 pointer as a Sfixed64.
func sizeSfixed64(p pointer, tagsize int, _ marshalOptions) (size int) {

	return tagsize + wire.SizeFixed64()
}

// appendSfixed64 wire encodes a int64 pointer as a Sfixed64.
func appendSfixed64(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int64()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, uint64(v))
	return b, nil
}

var coderSfixed64 = pointerCoderFuncs{
	size:    sizeSfixed64,
	marshal: appendSfixed64,
}

// sizeSfixed64 returns the size of wire encoding a int64 pointer as a Sfixed64.
// The zero value is not encoded.
func sizeSfixed64NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Int64()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeFixed64()
}

// appendSfixed64 wire encodes a int64 pointer as a Sfixed64.
// The zero value is not encoded.
func appendSfixed64NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Int64()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, uint64(v))
	return b, nil
}

var coderSfixed64NoZero = pointerCoderFuncs{
	size:    sizeSfixed64NoZero,
	marshal: appendSfixed64NoZero,
}

// sizeSfixed64Ptr returns the size of wire encoding a *int64 pointer as a Sfixed64.
// It panics if the pointer is nil.
func sizeSfixed64Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	return tagsize + wire.SizeFixed64()
}

// appendSfixed64 wire encodes a *int64 pointer as a Sfixed64.
// It panics if the pointer is nil.
func appendSfixed64Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Int64Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, uint64(v))
	return b, nil
}

var coderSfixed64Ptr = pointerCoderFuncs{
	size:    sizeSfixed64Ptr,
	marshal: appendSfixed64Ptr,
}

// sizeSfixed64Slice returns the size of wire encoding a []int64 pointer as a repeated Sfixed64.
func sizeSfixed64Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int64Slice()
	size = len(s) * (tagsize + wire.SizeFixed64())
	return size
}

// appendSfixed64Slice encodes a []int64 pointer as a repeated Sfixed64.
func appendSfixed64Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int64Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed64(b, uint64(v))
	}
	return b, nil
}

var coderSfixed64Slice = pointerCoderFuncs{
	size:    sizeSfixed64Slice,
	marshal: appendSfixed64Slice,
}

// sizeSfixed64PackedSlice returns the size of wire encoding a []int64 pointer as a packed repeated Sfixed64.
func sizeSfixed64PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Int64Slice()
	if len(s) == 0 {
		return 0
	}
	n := len(s) * wire.SizeFixed64()
	return tagsize + wire.SizeBytes(n)
}

// appendSfixed64PackedSlice encodes a []int64 pointer as a packed repeated Sfixed64.
func appendSfixed64PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Int64Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := len(s) * wire.SizeFixed64()
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendFixed64(b, uint64(v))
	}
	return b, nil
}

var coderSfixed64PackedSlice = pointerCoderFuncs{
	size:    sizeSfixed64PackedSlice,
	marshal: appendSfixed64PackedSlice,
}

// sizeSfixed64Iface returns the size of wire encoding a int64 value as a Sfixed64.
func sizeSfixed64Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	return tagsize + wire.SizeFixed64()
}

// appendSfixed64Iface encodes a int64 value as a Sfixed64.
func appendSfixed64Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(int64)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, uint64(v))
	return b, nil
}

var coderSfixed64Iface = ifaceCoderFuncs{
	size:    sizeSfixed64Iface,
	marshal: appendSfixed64Iface,
}

// sizeSfixed64SliceIface returns the size of wire encoding a []int64 value as a repeated Sfixed64.
func sizeSfixed64SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]int64)
	size = len(s) * (tagsize + wire.SizeFixed64())
	return size
}

// appendSfixed64SliceIface encodes a []int64 value as a repeated Sfixed64.
func appendSfixed64SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]int64)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed64(b, uint64(v))
	}
	return b, nil
}

var coderSfixed64SliceIface = ifaceCoderFuncs{
	size:    sizeSfixed64SliceIface,
	marshal: appendSfixed64SliceIface,
}

// sizeFixed64 returns the size of wire encoding a uint64 pointer as a Fixed64.
func sizeFixed64(p pointer, tagsize int, _ marshalOptions) (size int) {

	return tagsize + wire.SizeFixed64()
}

// appendFixed64 wire encodes a uint64 pointer as a Fixed64.
func appendFixed64(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint64()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, v)
	return b, nil
}

var coderFixed64 = pointerCoderFuncs{
	size:    sizeFixed64,
	marshal: appendFixed64,
}

// sizeFixed64 returns the size of wire encoding a uint64 pointer as a Fixed64.
// The zero value is not encoded.
func sizeFixed64NoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Uint64()
	if v == 0 {
		return 0
	}
	return tagsize + wire.SizeFixed64()
}

// appendFixed64 wire encodes a uint64 pointer as a Fixed64.
// The zero value is not encoded.
func appendFixed64NoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Uint64()
	if v == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, v)
	return b, nil
}

var coderFixed64NoZero = pointerCoderFuncs{
	size:    sizeFixed64NoZero,
	marshal: appendFixed64NoZero,
}

// sizeFixed64Ptr returns the size of wire encoding a *uint64 pointer as a Fixed64.
// It panics if the pointer is nil.
func sizeFixed64Ptr(p pointer, tagsize int, _ marshalOptions) (size int) {
	return tagsize + wire.SizeFixed64()
}

// appendFixed64 wire encodes a *uint64 pointer as a Fixed64.
// It panics if the pointer is nil.
func appendFixed64Ptr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Uint64Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, v)
	return b, nil
}

var coderFixed64Ptr = pointerCoderFuncs{
	size:    sizeFixed64Ptr,
	marshal: appendFixed64Ptr,
}

// sizeFixed64Slice returns the size of wire encoding a []uint64 pointer as a repeated Fixed64.
func sizeFixed64Slice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint64Slice()
	size = len(s) * (tagsize + wire.SizeFixed64())
	return size
}

// appendFixed64Slice encodes a []uint64 pointer as a repeated Fixed64.
func appendFixed64Slice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint64Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed64(b, v)
	}
	return b, nil
}

var coderFixed64Slice = pointerCoderFuncs{
	size:    sizeFixed64Slice,
	marshal: appendFixed64Slice,
}

// sizeFixed64PackedSlice returns the size of wire encoding a []uint64 pointer as a packed repeated Fixed64.
func sizeFixed64PackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Uint64Slice()
	if len(s) == 0 {
		return 0
	}
	n := len(s) * wire.SizeFixed64()
	return tagsize + wire.SizeBytes(n)
}

// appendFixed64PackedSlice encodes a []uint64 pointer as a packed repeated Fixed64.
func appendFixed64PackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Uint64Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := len(s) * wire.SizeFixed64()
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendFixed64(b, v)
	}
	return b, nil
}

var coderFixed64PackedSlice = pointerCoderFuncs{
	size:    sizeFixed64PackedSlice,
	marshal: appendFixed64PackedSlice,
}

// sizeFixed64Iface returns the size of wire encoding a uint64 value as a Fixed64.
func sizeFixed64Iface(ival interface{}, tagsize int, _ marshalOptions) int {
	return tagsize + wire.SizeFixed64()
}

// appendFixed64Iface encodes a uint64 value as a Fixed64.
func appendFixed64Iface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(uint64)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, v)
	return b, nil
}

var coderFixed64Iface = ifaceCoderFuncs{
	size:    sizeFixed64Iface,
	marshal: appendFixed64Iface,
}

// sizeFixed64SliceIface returns the size of wire encoding a []uint64 value as a repeated Fixed64.
func sizeFixed64SliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]uint64)
	size = len(s) * (tagsize + wire.SizeFixed64())
	return size
}

// appendFixed64SliceIface encodes a []uint64 value as a repeated Fixed64.
func appendFixed64SliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]uint64)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed64(b, v)
	}
	return b, nil
}

var coderFixed64SliceIface = ifaceCoderFuncs{
	size:    sizeFixed64SliceIface,
	marshal: appendFixed64SliceIface,
}

// sizeDouble returns the size of wire encoding a float64 pointer as a Double.
func sizeDouble(p pointer, tagsize int, _ marshalOptions) (size int) {

	return tagsize + wire.SizeFixed64()
}

// appendDouble wire encodes a float64 pointer as a Double.
func appendDouble(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Float64()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, math.Float64bits(v))
	return b, nil
}

var coderDouble = pointerCoderFuncs{
	size:    sizeDouble,
	marshal: appendDouble,
}

// sizeDouble returns the size of wire encoding a float64 pointer as a Double.
// The zero value is not encoded.
func sizeDoubleNoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Float64()
	if v == 0 && !math.Signbit(float64(v)) {
		return 0
	}
	return tagsize + wire.SizeFixed64()
}

// appendDouble wire encodes a float64 pointer as a Double.
// The zero value is not encoded.
func appendDoubleNoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Float64()
	if v == 0 && !math.Signbit(float64(v)) {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, math.Float64bits(v))
	return b, nil
}

var coderDoubleNoZero = pointerCoderFuncs{
	size:    sizeDoubleNoZero,
	marshal: appendDoubleNoZero,
}

// sizeDoublePtr returns the size of wire encoding a *float64 pointer as a Double.
// It panics if the pointer is nil.
func sizeDoublePtr(p pointer, tagsize int, _ marshalOptions) (size int) {
	return tagsize + wire.SizeFixed64()
}

// appendDouble wire encodes a *float64 pointer as a Double.
// It panics if the pointer is nil.
func appendDoublePtr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.Float64Ptr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, math.Float64bits(v))
	return b, nil
}

var coderDoublePtr = pointerCoderFuncs{
	size:    sizeDoublePtr,
	marshal: appendDoublePtr,
}

// sizeDoubleSlice returns the size of wire encoding a []float64 pointer as a repeated Double.
func sizeDoubleSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Float64Slice()
	size = len(s) * (tagsize + wire.SizeFixed64())
	return size
}

// appendDoubleSlice encodes a []float64 pointer as a repeated Double.
func appendDoubleSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Float64Slice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed64(b, math.Float64bits(v))
	}
	return b, nil
}

var coderDoubleSlice = pointerCoderFuncs{
	size:    sizeDoubleSlice,
	marshal: appendDoubleSlice,
}

// sizeDoublePackedSlice returns the size of wire encoding a []float64 pointer as a packed repeated Double.
func sizeDoublePackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.Float64Slice()
	if len(s) == 0 {
		return 0
	}
	n := len(s) * wire.SizeFixed64()
	return tagsize + wire.SizeBytes(n)
}

// appendDoublePackedSlice encodes a []float64 pointer as a packed repeated Double.
func appendDoublePackedSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.Float64Slice()
	if len(s) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	n := len(s) * wire.SizeFixed64()
	b = wire.AppendVarint(b, uint64(n))
	for _, v := range s {
		b = wire.AppendFixed64(b, math.Float64bits(v))
	}
	return b, nil
}

var coderDoublePackedSlice = pointerCoderFuncs{
	size:    sizeDoublePackedSlice,
	marshal: appendDoublePackedSlice,
}

// sizeDoubleIface returns the size of wire encoding a float64 value as a Double.
func sizeDoubleIface(ival interface{}, tagsize int, _ marshalOptions) int {
	return tagsize + wire.SizeFixed64()
}

// appendDoubleIface encodes a float64 value as a Double.
func appendDoubleIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(float64)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendFixed64(b, math.Float64bits(v))
	return b, nil
}

var coderDoubleIface = ifaceCoderFuncs{
	size:    sizeDoubleIface,
	marshal: appendDoubleIface,
}

// sizeDoubleSliceIface returns the size of wire encoding a []float64 value as a repeated Double.
func sizeDoubleSliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]float64)
	size = len(s) * (tagsize + wire.SizeFixed64())
	return size
}

// appendDoubleSliceIface encodes a []float64 value as a repeated Double.
func appendDoubleSliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]float64)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendFixed64(b, math.Float64bits(v))
	}
	return b, nil
}

var coderDoubleSliceIface = ifaceCoderFuncs{
	size:    sizeDoubleSliceIface,
	marshal: appendDoubleSliceIface,
}

// sizeString returns the size of wire encoding a string pointer as a String.
func sizeString(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.String()
	return tagsize + wire.SizeBytes(len([]byte(v)))
}

// appendString wire encodes a string pointer as a String.
func appendString(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.String()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, []byte(v))
	return b, nil
}

var coderString = pointerCoderFuncs{
	size:    sizeString,
	marshal: appendString,
}

// sizeString returns the size of wire encoding a string pointer as a String.
// The zero value is not encoded.
func sizeStringNoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.String()
	if len(v) == 0 {
		return 0
	}
	return tagsize + wire.SizeBytes(len([]byte(v)))
}

// appendString wire encodes a string pointer as a String.
// The zero value is not encoded.
func appendStringNoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.String()
	if len(v) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, []byte(v))
	return b, nil
}

var coderStringNoZero = pointerCoderFuncs{
	size:    sizeStringNoZero,
	marshal: appendStringNoZero,
}

// sizeStringPtr returns the size of wire encoding a *string pointer as a String.
// It panics if the pointer is nil.
func sizeStringPtr(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := **p.StringPtr()
	return tagsize + wire.SizeBytes(len([]byte(v)))
}

// appendString wire encodes a *string pointer as a String.
// It panics if the pointer is nil.
func appendStringPtr(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := **p.StringPtr()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, []byte(v))
	return b, nil
}

var coderStringPtr = pointerCoderFuncs{
	size:    sizeStringPtr,
	marshal: appendStringPtr,
}

// sizeStringSlice returns the size of wire encoding a []string pointer as a repeated String.
func sizeStringSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.StringSlice()
	for _, v := range s {
		size += tagsize + wire.SizeBytes(len([]byte(v)))
	}
	return size
}

// appendStringSlice encodes a []string pointer as a repeated String.
func appendStringSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.StringSlice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendBytes(b, []byte(v))
	}
	return b, nil
}

var coderStringSlice = pointerCoderFuncs{
	size:    sizeStringSlice,
	marshal: appendStringSlice,
}

// sizeStringIface returns the size of wire encoding a string value as a String.
func sizeStringIface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.(string)
	return tagsize + wire.SizeBytes(len([]byte(v)))
}

// appendStringIface encodes a string value as a String.
func appendStringIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.(string)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, []byte(v))
	return b, nil
}

var coderStringIface = ifaceCoderFuncs{
	size:    sizeStringIface,
	marshal: appendStringIface,
}

// sizeStringSliceIface returns the size of wire encoding a []string value as a repeated String.
func sizeStringSliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[]string)
	for _, v := range s {
		size += tagsize + wire.SizeBytes(len([]byte(v)))
	}
	return size
}

// appendStringSliceIface encodes a []string value as a repeated String.
func appendStringSliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[]string)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendBytes(b, []byte(v))
	}
	return b, nil
}

var coderStringSliceIface = ifaceCoderFuncs{
	size:    sizeStringSliceIface,
	marshal: appendStringSliceIface,
}

// sizeBytes returns the size of wire encoding a []byte pointer as a Bytes.
func sizeBytes(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Bytes()
	return tagsize + wire.SizeBytes(len(v))
}

// appendBytes wire encodes a []byte pointer as a Bytes.
func appendBytes(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Bytes()
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, v)
	return b, nil
}

var coderBytes = pointerCoderFuncs{
	size:    sizeBytes,
	marshal: appendBytes,
}

// sizeBytes returns the size of wire encoding a []byte pointer as a Bytes.
// The zero value is not encoded.
func sizeBytesNoZero(p pointer, tagsize int, _ marshalOptions) (size int) {
	v := *p.Bytes()
	if len(v) == 0 {
		return 0
	}
	return tagsize + wire.SizeBytes(len(v))
}

// appendBytes wire encodes a []byte pointer as a Bytes.
// The zero value is not encoded.
func appendBytesNoZero(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := *p.Bytes()
	if len(v) == 0 {
		return b, nil
	}
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, v)
	return b, nil
}

var coderBytesNoZero = pointerCoderFuncs{
	size:    sizeBytesNoZero,
	marshal: appendBytesNoZero,
}

// sizeBytesSlice returns the size of wire encoding a [][]byte pointer as a repeated Bytes.
func sizeBytesSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
	s := *p.BytesSlice()
	for _, v := range s {
		size += tagsize + wire.SizeBytes(len(v))
	}
	return size
}

// appendBytesSlice encodes a [][]byte pointer as a repeated Bytes.
func appendBytesSlice(b []byte, p pointer, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *p.BytesSlice()
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendBytes(b, v)
	}
	return b, nil
}

var coderBytesSlice = pointerCoderFuncs{
	size:    sizeBytesSlice,
	marshal: appendBytesSlice,
}

// sizeBytesIface returns the size of wire encoding a []byte value as a Bytes.
func sizeBytesIface(ival interface{}, tagsize int, _ marshalOptions) int {
	v := ival.([]byte)
	return tagsize + wire.SizeBytes(len(v))
}

// appendBytesIface encodes a []byte value as a Bytes.
func appendBytesIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	v := ival.([]byte)
	b = wire.AppendVarint(b, wiretag)
	b = wire.AppendBytes(b, v)
	return b, nil
}

var coderBytesIface = ifaceCoderFuncs{
	size:    sizeBytesIface,
	marshal: appendBytesIface,
}

// sizeBytesSliceIface returns the size of wire encoding a [][]byte value as a repeated Bytes.
func sizeBytesSliceIface(ival interface{}, tagsize int, _ marshalOptions) (size int) {
	s := *ival.(*[][]byte)
	for _, v := range s {
		size += tagsize + wire.SizeBytes(len(v))
	}
	return size
}

// appendBytesSliceIface encodes a [][]byte value as a repeated Bytes.
func appendBytesSliceIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
	s := *ival.(*[][]byte)
	for _, v := range s {
		b = wire.AppendVarint(b, wiretag)
		b = wire.AppendBytes(b, v)
	}
	return b, nil
}

var coderBytesSliceIface = ifaceCoderFuncs{
	size:    sizeBytesSliceIface,
	marshal: appendBytesSliceIface,
}

var wireTypes = map[protoreflect.Kind]wire.Type{
	protoreflect.BoolKind:     wire.VarintType,
	protoreflect.EnumKind:     wire.VarintType,
	protoreflect.Int32Kind:    wire.VarintType,
	protoreflect.Sint32Kind:   wire.VarintType,
	protoreflect.Uint32Kind:   wire.VarintType,
	protoreflect.Int64Kind:    wire.VarintType,
	protoreflect.Sint64Kind:   wire.VarintType,
	protoreflect.Uint64Kind:   wire.VarintType,
	protoreflect.Sfixed32Kind: wire.Fixed32Type,
	protoreflect.Fixed32Kind:  wire.Fixed32Type,
	protoreflect.FloatKind:    wire.Fixed32Type,
	protoreflect.Sfixed64Kind: wire.Fixed64Type,
	protoreflect.Fixed64Kind:  wire.Fixed64Type,
	protoreflect.DoubleKind:   wire.Fixed64Type,
	protoreflect.StringKind:   wire.BytesType,
	protoreflect.BytesKind:    wire.BytesType,
	protoreflect.MessageKind:  wire.BytesType,
	protoreflect.GroupKind:    wire.StartGroupType,
}
