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

import (
	"github.com/golang/protobuf/v2/internal/encoding/wire"
	"github.com/golang/protobuf/v2/reflect/protoreflect"
)

func sizeSingular(num wire.Number, kind protoreflect.Kind, v protoreflect.Value) int {
	switch kind {
	case protoreflect.BoolKind:
		return wire.SizeVarint(wire.EncodeBool(v.Bool()))
	case protoreflect.EnumKind:
		return wire.SizeVarint(uint64(v.Enum()))
	case protoreflect.Int32Kind:
		return wire.SizeVarint(uint64(int32(v.Int())))
	case protoreflect.Sint32Kind:
		return wire.SizeVarint(wire.EncodeZigZag(int64(int32(v.Int()))))
	case protoreflect.Uint32Kind:
		return wire.SizeVarint(uint64(uint32(v.Uint())))
	case protoreflect.Int64Kind:
		return wire.SizeVarint(uint64(v.Int()))
	case protoreflect.Sint64Kind:
		return wire.SizeVarint(wire.EncodeZigZag(v.Int()))
	case protoreflect.Uint64Kind:
		return wire.SizeVarint(v.Uint())
	case protoreflect.Sfixed32Kind:
		return wire.SizeFixed32()
	case protoreflect.Fixed32Kind:
		return wire.SizeFixed32()
	case protoreflect.FloatKind:
		return wire.SizeFixed32()
	case protoreflect.Sfixed64Kind:
		return wire.SizeFixed64()
	case protoreflect.Fixed64Kind:
		return wire.SizeFixed64()
	case protoreflect.DoubleKind:
		return wire.SizeFixed64()
	case protoreflect.StringKind:
		return wire.SizeBytes(len([]byte(v.String())))
	case protoreflect.BytesKind:
		return wire.SizeBytes(len(v.Bytes()))
	case protoreflect.MessageKind:
		return wire.SizeBytes(sizeMessage(v.Message()))
	case protoreflect.GroupKind:
		return wire.SizeGroup(num, sizeMessage(v.Message()))
	default:
		return 0
	}
}
