xref: /aosp_15_r20/external/golang-protobuf/internal/impl/codec_gen.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2018 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsen// Code generated by generate-types. DO NOT EDIT.
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenpackage impl
8*1c12ee1eSDan Willemsen
9*1c12ee1eSDan Willemsenimport (
10*1c12ee1eSDan Willemsen	"math"
11*1c12ee1eSDan Willemsen	"unicode/utf8"
12*1c12ee1eSDan Willemsen
13*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/protowire"
14*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
15*1c12ee1eSDan Willemsen)
16*1c12ee1eSDan Willemsen
17*1c12ee1eSDan Willemsen// sizeBool returns the size of wire encoding a bool pointer as a Bool.
18*1c12ee1eSDan Willemsenfunc sizeBool(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
19*1c12ee1eSDan Willemsen	v := *p.Bool()
20*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
21*1c12ee1eSDan Willemsen}
22*1c12ee1eSDan Willemsen
23*1c12ee1eSDan Willemsen// appendBool wire encodes a bool pointer as a Bool.
24*1c12ee1eSDan Willemsenfunc appendBool(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
25*1c12ee1eSDan Willemsen	v := *p.Bool()
26*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
27*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeBool(v))
28*1c12ee1eSDan Willemsen	return b, nil
29*1c12ee1eSDan Willemsen}
30*1c12ee1eSDan Willemsen
31*1c12ee1eSDan Willemsen// consumeBool wire decodes a bool pointer as a Bool.
32*1c12ee1eSDan Willemsenfunc consumeBool(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
33*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
34*1c12ee1eSDan Willemsen		return out, errUnknown
35*1c12ee1eSDan Willemsen	}
36*1c12ee1eSDan Willemsen	var v uint64
37*1c12ee1eSDan Willemsen	var n int
38*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
39*1c12ee1eSDan Willemsen		v = uint64(b[0])
40*1c12ee1eSDan Willemsen		n = 1
41*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
42*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
43*1c12ee1eSDan Willemsen		n = 2
44*1c12ee1eSDan Willemsen	} else {
45*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
46*1c12ee1eSDan Willemsen	}
47*1c12ee1eSDan Willemsen	if n < 0 {
48*1c12ee1eSDan Willemsen		return out, errDecode
49*1c12ee1eSDan Willemsen	}
50*1c12ee1eSDan Willemsen	*p.Bool() = protowire.DecodeBool(v)
51*1c12ee1eSDan Willemsen	out.n = n
52*1c12ee1eSDan Willemsen	return out, nil
53*1c12ee1eSDan Willemsen}
54*1c12ee1eSDan Willemsen
55*1c12ee1eSDan Willemsenvar coderBool = pointerCoderFuncs{
56*1c12ee1eSDan Willemsen	size:      sizeBool,
57*1c12ee1eSDan Willemsen	marshal:   appendBool,
58*1c12ee1eSDan Willemsen	unmarshal: consumeBool,
59*1c12ee1eSDan Willemsen	merge:     mergeBool,
60*1c12ee1eSDan Willemsen}
61*1c12ee1eSDan Willemsen
62*1c12ee1eSDan Willemsen// sizeBoolNoZero returns the size of wire encoding a bool pointer as a Bool.
63*1c12ee1eSDan Willemsen// The zero value is not encoded.
64*1c12ee1eSDan Willemsenfunc sizeBoolNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
65*1c12ee1eSDan Willemsen	v := *p.Bool()
66*1c12ee1eSDan Willemsen	if v == false {
67*1c12ee1eSDan Willemsen		return 0
68*1c12ee1eSDan Willemsen	}
69*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
70*1c12ee1eSDan Willemsen}
71*1c12ee1eSDan Willemsen
72*1c12ee1eSDan Willemsen// appendBoolNoZero wire encodes a bool pointer as a Bool.
73*1c12ee1eSDan Willemsen// The zero value is not encoded.
74*1c12ee1eSDan Willemsenfunc appendBoolNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
75*1c12ee1eSDan Willemsen	v := *p.Bool()
76*1c12ee1eSDan Willemsen	if v == false {
77*1c12ee1eSDan Willemsen		return b, nil
78*1c12ee1eSDan Willemsen	}
79*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
80*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeBool(v))
81*1c12ee1eSDan Willemsen	return b, nil
82*1c12ee1eSDan Willemsen}
83*1c12ee1eSDan Willemsen
84*1c12ee1eSDan Willemsenvar coderBoolNoZero = pointerCoderFuncs{
85*1c12ee1eSDan Willemsen	size:      sizeBoolNoZero,
86*1c12ee1eSDan Willemsen	marshal:   appendBoolNoZero,
87*1c12ee1eSDan Willemsen	unmarshal: consumeBool,
88*1c12ee1eSDan Willemsen	merge:     mergeBoolNoZero,
89*1c12ee1eSDan Willemsen}
90*1c12ee1eSDan Willemsen
91*1c12ee1eSDan Willemsen// sizeBoolPtr returns the size of wire encoding a *bool pointer as a Bool.
92*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
93*1c12ee1eSDan Willemsenfunc sizeBoolPtr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
94*1c12ee1eSDan Willemsen	v := **p.BoolPtr()
95*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
96*1c12ee1eSDan Willemsen}
97*1c12ee1eSDan Willemsen
98*1c12ee1eSDan Willemsen// appendBoolPtr wire encodes a *bool pointer as a Bool.
99*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
100*1c12ee1eSDan Willemsenfunc appendBoolPtr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
101*1c12ee1eSDan Willemsen	v := **p.BoolPtr()
102*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
103*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeBool(v))
104*1c12ee1eSDan Willemsen	return b, nil
105*1c12ee1eSDan Willemsen}
106*1c12ee1eSDan Willemsen
107*1c12ee1eSDan Willemsen// consumeBoolPtr wire decodes a *bool pointer as a Bool.
108*1c12ee1eSDan Willemsenfunc consumeBoolPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
109*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
110*1c12ee1eSDan Willemsen		return out, errUnknown
111*1c12ee1eSDan Willemsen	}
112*1c12ee1eSDan Willemsen	var v uint64
113*1c12ee1eSDan Willemsen	var n int
114*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
115*1c12ee1eSDan Willemsen		v = uint64(b[0])
116*1c12ee1eSDan Willemsen		n = 1
117*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
118*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
119*1c12ee1eSDan Willemsen		n = 2
120*1c12ee1eSDan Willemsen	} else {
121*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
122*1c12ee1eSDan Willemsen	}
123*1c12ee1eSDan Willemsen	if n < 0 {
124*1c12ee1eSDan Willemsen		return out, errDecode
125*1c12ee1eSDan Willemsen	}
126*1c12ee1eSDan Willemsen	vp := p.BoolPtr()
127*1c12ee1eSDan Willemsen	if *vp == nil {
128*1c12ee1eSDan Willemsen		*vp = new(bool)
129*1c12ee1eSDan Willemsen	}
130*1c12ee1eSDan Willemsen	**vp = protowire.DecodeBool(v)
131*1c12ee1eSDan Willemsen	out.n = n
132*1c12ee1eSDan Willemsen	return out, nil
133*1c12ee1eSDan Willemsen}
134*1c12ee1eSDan Willemsen
135*1c12ee1eSDan Willemsenvar coderBoolPtr = pointerCoderFuncs{
136*1c12ee1eSDan Willemsen	size:      sizeBoolPtr,
137*1c12ee1eSDan Willemsen	marshal:   appendBoolPtr,
138*1c12ee1eSDan Willemsen	unmarshal: consumeBoolPtr,
139*1c12ee1eSDan Willemsen	merge:     mergeBoolPtr,
140*1c12ee1eSDan Willemsen}
141*1c12ee1eSDan Willemsen
142*1c12ee1eSDan Willemsen// sizeBoolSlice returns the size of wire encoding a []bool pointer as a repeated Bool.
143*1c12ee1eSDan Willemsenfunc sizeBoolSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
144*1c12ee1eSDan Willemsen	s := *p.BoolSlice()
145*1c12ee1eSDan Willemsen	for _, v := range s {
146*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
147*1c12ee1eSDan Willemsen	}
148*1c12ee1eSDan Willemsen	return size
149*1c12ee1eSDan Willemsen}
150*1c12ee1eSDan Willemsen
151*1c12ee1eSDan Willemsen// appendBoolSlice encodes a []bool pointer as a repeated Bool.
152*1c12ee1eSDan Willemsenfunc appendBoolSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
153*1c12ee1eSDan Willemsen	s := *p.BoolSlice()
154*1c12ee1eSDan Willemsen	for _, v := range s {
155*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
156*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeBool(v))
157*1c12ee1eSDan Willemsen	}
158*1c12ee1eSDan Willemsen	return b, nil
159*1c12ee1eSDan Willemsen}
160*1c12ee1eSDan Willemsen
161*1c12ee1eSDan Willemsen// consumeBoolSlice wire decodes a []bool pointer as a repeated Bool.
162*1c12ee1eSDan Willemsenfunc consumeBoolSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
163*1c12ee1eSDan Willemsen	sp := p.BoolSlice()
164*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
165*1c12ee1eSDan Willemsen		s := *sp
166*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
167*1c12ee1eSDan Willemsen		if n < 0 {
168*1c12ee1eSDan Willemsen			return out, errDecode
169*1c12ee1eSDan Willemsen		}
170*1c12ee1eSDan Willemsen		for len(b) > 0 {
171*1c12ee1eSDan Willemsen			var v uint64
172*1c12ee1eSDan Willemsen			var n int
173*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
174*1c12ee1eSDan Willemsen				v = uint64(b[0])
175*1c12ee1eSDan Willemsen				n = 1
176*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
177*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
178*1c12ee1eSDan Willemsen				n = 2
179*1c12ee1eSDan Willemsen			} else {
180*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
181*1c12ee1eSDan Willemsen			}
182*1c12ee1eSDan Willemsen			if n < 0 {
183*1c12ee1eSDan Willemsen				return out, errDecode
184*1c12ee1eSDan Willemsen			}
185*1c12ee1eSDan Willemsen			s = append(s, protowire.DecodeBool(v))
186*1c12ee1eSDan Willemsen			b = b[n:]
187*1c12ee1eSDan Willemsen		}
188*1c12ee1eSDan Willemsen		*sp = s
189*1c12ee1eSDan Willemsen		out.n = n
190*1c12ee1eSDan Willemsen		return out, nil
191*1c12ee1eSDan Willemsen	}
192*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
193*1c12ee1eSDan Willemsen		return out, errUnknown
194*1c12ee1eSDan Willemsen	}
195*1c12ee1eSDan Willemsen	var v uint64
196*1c12ee1eSDan Willemsen	var n int
197*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
198*1c12ee1eSDan Willemsen		v = uint64(b[0])
199*1c12ee1eSDan Willemsen		n = 1
200*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
201*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
202*1c12ee1eSDan Willemsen		n = 2
203*1c12ee1eSDan Willemsen	} else {
204*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
205*1c12ee1eSDan Willemsen	}
206*1c12ee1eSDan Willemsen	if n < 0 {
207*1c12ee1eSDan Willemsen		return out, errDecode
208*1c12ee1eSDan Willemsen	}
209*1c12ee1eSDan Willemsen	*sp = append(*sp, protowire.DecodeBool(v))
210*1c12ee1eSDan Willemsen	out.n = n
211*1c12ee1eSDan Willemsen	return out, nil
212*1c12ee1eSDan Willemsen}
213*1c12ee1eSDan Willemsen
214*1c12ee1eSDan Willemsenvar coderBoolSlice = pointerCoderFuncs{
215*1c12ee1eSDan Willemsen	size:      sizeBoolSlice,
216*1c12ee1eSDan Willemsen	marshal:   appendBoolSlice,
217*1c12ee1eSDan Willemsen	unmarshal: consumeBoolSlice,
218*1c12ee1eSDan Willemsen	merge:     mergeBoolSlice,
219*1c12ee1eSDan Willemsen}
220*1c12ee1eSDan Willemsen
221*1c12ee1eSDan Willemsen// sizeBoolPackedSlice returns the size of wire encoding a []bool pointer as a packed repeated Bool.
222*1c12ee1eSDan Willemsenfunc sizeBoolPackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
223*1c12ee1eSDan Willemsen	s := *p.BoolSlice()
224*1c12ee1eSDan Willemsen	if len(s) == 0 {
225*1c12ee1eSDan Willemsen		return 0
226*1c12ee1eSDan Willemsen	}
227*1c12ee1eSDan Willemsen	n := 0
228*1c12ee1eSDan Willemsen	for _, v := range s {
229*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeBool(v))
230*1c12ee1eSDan Willemsen	}
231*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
232*1c12ee1eSDan Willemsen}
233*1c12ee1eSDan Willemsen
234*1c12ee1eSDan Willemsen// appendBoolPackedSlice encodes a []bool pointer as a packed repeated Bool.
235*1c12ee1eSDan Willemsenfunc appendBoolPackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
236*1c12ee1eSDan Willemsen	s := *p.BoolSlice()
237*1c12ee1eSDan Willemsen	if len(s) == 0 {
238*1c12ee1eSDan Willemsen		return b, nil
239*1c12ee1eSDan Willemsen	}
240*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
241*1c12ee1eSDan Willemsen	n := 0
242*1c12ee1eSDan Willemsen	for _, v := range s {
243*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeBool(v))
244*1c12ee1eSDan Willemsen	}
245*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
246*1c12ee1eSDan Willemsen	for _, v := range s {
247*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeBool(v))
248*1c12ee1eSDan Willemsen	}
249*1c12ee1eSDan Willemsen	return b, nil
250*1c12ee1eSDan Willemsen}
251*1c12ee1eSDan Willemsen
252*1c12ee1eSDan Willemsenvar coderBoolPackedSlice = pointerCoderFuncs{
253*1c12ee1eSDan Willemsen	size:      sizeBoolPackedSlice,
254*1c12ee1eSDan Willemsen	marshal:   appendBoolPackedSlice,
255*1c12ee1eSDan Willemsen	unmarshal: consumeBoolSlice,
256*1c12ee1eSDan Willemsen	merge:     mergeBoolSlice,
257*1c12ee1eSDan Willemsen}
258*1c12ee1eSDan Willemsen
259*1c12ee1eSDan Willemsen// sizeBoolValue returns the size of wire encoding a bool value as a Bool.
260*1c12ee1eSDan Willemsenfunc sizeBoolValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
261*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
262*1c12ee1eSDan Willemsen}
263*1c12ee1eSDan Willemsen
264*1c12ee1eSDan Willemsen// appendBoolValue encodes a bool value as a Bool.
265*1c12ee1eSDan Willemsenfunc appendBoolValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
266*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
267*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
268*1c12ee1eSDan Willemsen	return b, nil
269*1c12ee1eSDan Willemsen}
270*1c12ee1eSDan Willemsen
271*1c12ee1eSDan Willemsen// consumeBoolValue decodes a bool value as a Bool.
272*1c12ee1eSDan Willemsenfunc consumeBoolValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
273*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
274*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
275*1c12ee1eSDan Willemsen	}
276*1c12ee1eSDan Willemsen	var v uint64
277*1c12ee1eSDan Willemsen	var n int
278*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
279*1c12ee1eSDan Willemsen		v = uint64(b[0])
280*1c12ee1eSDan Willemsen		n = 1
281*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
282*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
283*1c12ee1eSDan Willemsen		n = 2
284*1c12ee1eSDan Willemsen	} else {
285*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
286*1c12ee1eSDan Willemsen	}
287*1c12ee1eSDan Willemsen	if n < 0 {
288*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
289*1c12ee1eSDan Willemsen	}
290*1c12ee1eSDan Willemsen	out.n = n
291*1c12ee1eSDan Willemsen	return protoreflect.ValueOfBool(protowire.DecodeBool(v)), out, nil
292*1c12ee1eSDan Willemsen}
293*1c12ee1eSDan Willemsen
294*1c12ee1eSDan Willemsenvar coderBoolValue = valueCoderFuncs{
295*1c12ee1eSDan Willemsen	size:      sizeBoolValue,
296*1c12ee1eSDan Willemsen	marshal:   appendBoolValue,
297*1c12ee1eSDan Willemsen	unmarshal: consumeBoolValue,
298*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
299*1c12ee1eSDan Willemsen}
300*1c12ee1eSDan Willemsen
301*1c12ee1eSDan Willemsen// sizeBoolSliceValue returns the size of wire encoding a []bool value as a repeated Bool.
302*1c12ee1eSDan Willemsenfunc sizeBoolSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
303*1c12ee1eSDan Willemsen	list := listv.List()
304*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
305*1c12ee1eSDan Willemsen		v := list.Get(i)
306*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
307*1c12ee1eSDan Willemsen	}
308*1c12ee1eSDan Willemsen	return size
309*1c12ee1eSDan Willemsen}
310*1c12ee1eSDan Willemsen
311*1c12ee1eSDan Willemsen// appendBoolSliceValue encodes a []bool value as a repeated Bool.
312*1c12ee1eSDan Willemsenfunc appendBoolSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
313*1c12ee1eSDan Willemsen	list := listv.List()
314*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
315*1c12ee1eSDan Willemsen		v := list.Get(i)
316*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
317*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
318*1c12ee1eSDan Willemsen	}
319*1c12ee1eSDan Willemsen	return b, nil
320*1c12ee1eSDan Willemsen}
321*1c12ee1eSDan Willemsen
322*1c12ee1eSDan Willemsen// consumeBoolSliceValue wire decodes a []bool value as a repeated Bool.
323*1c12ee1eSDan Willemsenfunc consumeBoolSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
324*1c12ee1eSDan Willemsen	list := listv.List()
325*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
326*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
327*1c12ee1eSDan Willemsen		if n < 0 {
328*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
329*1c12ee1eSDan Willemsen		}
330*1c12ee1eSDan Willemsen		for len(b) > 0 {
331*1c12ee1eSDan Willemsen			var v uint64
332*1c12ee1eSDan Willemsen			var n int
333*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
334*1c12ee1eSDan Willemsen				v = uint64(b[0])
335*1c12ee1eSDan Willemsen				n = 1
336*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
337*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
338*1c12ee1eSDan Willemsen				n = 2
339*1c12ee1eSDan Willemsen			} else {
340*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
341*1c12ee1eSDan Willemsen			}
342*1c12ee1eSDan Willemsen			if n < 0 {
343*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
344*1c12ee1eSDan Willemsen			}
345*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfBool(protowire.DecodeBool(v)))
346*1c12ee1eSDan Willemsen			b = b[n:]
347*1c12ee1eSDan Willemsen		}
348*1c12ee1eSDan Willemsen		out.n = n
349*1c12ee1eSDan Willemsen		return listv, out, nil
350*1c12ee1eSDan Willemsen	}
351*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
352*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
353*1c12ee1eSDan Willemsen	}
354*1c12ee1eSDan Willemsen	var v uint64
355*1c12ee1eSDan Willemsen	var n int
356*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
357*1c12ee1eSDan Willemsen		v = uint64(b[0])
358*1c12ee1eSDan Willemsen		n = 1
359*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
360*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
361*1c12ee1eSDan Willemsen		n = 2
362*1c12ee1eSDan Willemsen	} else {
363*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
364*1c12ee1eSDan Willemsen	}
365*1c12ee1eSDan Willemsen	if n < 0 {
366*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
367*1c12ee1eSDan Willemsen	}
368*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfBool(protowire.DecodeBool(v)))
369*1c12ee1eSDan Willemsen	out.n = n
370*1c12ee1eSDan Willemsen	return listv, out, nil
371*1c12ee1eSDan Willemsen}
372*1c12ee1eSDan Willemsen
373*1c12ee1eSDan Willemsenvar coderBoolSliceValue = valueCoderFuncs{
374*1c12ee1eSDan Willemsen	size:      sizeBoolSliceValue,
375*1c12ee1eSDan Willemsen	marshal:   appendBoolSliceValue,
376*1c12ee1eSDan Willemsen	unmarshal: consumeBoolSliceValue,
377*1c12ee1eSDan Willemsen	merge:     mergeListValue,
378*1c12ee1eSDan Willemsen}
379*1c12ee1eSDan Willemsen
380*1c12ee1eSDan Willemsen// sizeBoolPackedSliceValue returns the size of wire encoding a []bool value as a packed repeated Bool.
381*1c12ee1eSDan Willemsenfunc sizeBoolPackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
382*1c12ee1eSDan Willemsen	list := listv.List()
383*1c12ee1eSDan Willemsen	llen := list.Len()
384*1c12ee1eSDan Willemsen	if llen == 0 {
385*1c12ee1eSDan Willemsen		return 0
386*1c12ee1eSDan Willemsen	}
387*1c12ee1eSDan Willemsen	n := 0
388*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
389*1c12ee1eSDan Willemsen		v := list.Get(i)
390*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
391*1c12ee1eSDan Willemsen	}
392*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
393*1c12ee1eSDan Willemsen}
394*1c12ee1eSDan Willemsen
395*1c12ee1eSDan Willemsen// appendBoolPackedSliceValue encodes a []bool value as a packed repeated Bool.
396*1c12ee1eSDan Willemsenfunc appendBoolPackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
397*1c12ee1eSDan Willemsen	list := listv.List()
398*1c12ee1eSDan Willemsen	llen := list.Len()
399*1c12ee1eSDan Willemsen	if llen == 0 {
400*1c12ee1eSDan Willemsen		return b, nil
401*1c12ee1eSDan Willemsen	}
402*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
403*1c12ee1eSDan Willemsen	n := 0
404*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
405*1c12ee1eSDan Willemsen		v := list.Get(i)
406*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
407*1c12ee1eSDan Willemsen	}
408*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
409*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
410*1c12ee1eSDan Willemsen		v := list.Get(i)
411*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
412*1c12ee1eSDan Willemsen	}
413*1c12ee1eSDan Willemsen	return b, nil
414*1c12ee1eSDan Willemsen}
415*1c12ee1eSDan Willemsen
416*1c12ee1eSDan Willemsenvar coderBoolPackedSliceValue = valueCoderFuncs{
417*1c12ee1eSDan Willemsen	size:      sizeBoolPackedSliceValue,
418*1c12ee1eSDan Willemsen	marshal:   appendBoolPackedSliceValue,
419*1c12ee1eSDan Willemsen	unmarshal: consumeBoolSliceValue,
420*1c12ee1eSDan Willemsen	merge:     mergeListValue,
421*1c12ee1eSDan Willemsen}
422*1c12ee1eSDan Willemsen
423*1c12ee1eSDan Willemsen// sizeEnumValue returns the size of wire encoding a  value as a Enum.
424*1c12ee1eSDan Willemsenfunc sizeEnumValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
425*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(uint64(v.Enum()))
426*1c12ee1eSDan Willemsen}
427*1c12ee1eSDan Willemsen
428*1c12ee1eSDan Willemsen// appendEnumValue encodes a  value as a Enum.
429*1c12ee1eSDan Willemsenfunc appendEnumValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
430*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
431*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v.Enum()))
432*1c12ee1eSDan Willemsen	return b, nil
433*1c12ee1eSDan Willemsen}
434*1c12ee1eSDan Willemsen
435*1c12ee1eSDan Willemsen// consumeEnumValue decodes a  value as a Enum.
436*1c12ee1eSDan Willemsenfunc consumeEnumValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
437*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
438*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
439*1c12ee1eSDan Willemsen	}
440*1c12ee1eSDan Willemsen	var v uint64
441*1c12ee1eSDan Willemsen	var n int
442*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
443*1c12ee1eSDan Willemsen		v = uint64(b[0])
444*1c12ee1eSDan Willemsen		n = 1
445*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
446*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
447*1c12ee1eSDan Willemsen		n = 2
448*1c12ee1eSDan Willemsen	} else {
449*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
450*1c12ee1eSDan Willemsen	}
451*1c12ee1eSDan Willemsen	if n < 0 {
452*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
453*1c12ee1eSDan Willemsen	}
454*1c12ee1eSDan Willemsen	out.n = n
455*1c12ee1eSDan Willemsen	return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)), out, nil
456*1c12ee1eSDan Willemsen}
457*1c12ee1eSDan Willemsen
458*1c12ee1eSDan Willemsenvar coderEnumValue = valueCoderFuncs{
459*1c12ee1eSDan Willemsen	size:      sizeEnumValue,
460*1c12ee1eSDan Willemsen	marshal:   appendEnumValue,
461*1c12ee1eSDan Willemsen	unmarshal: consumeEnumValue,
462*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
463*1c12ee1eSDan Willemsen}
464*1c12ee1eSDan Willemsen
465*1c12ee1eSDan Willemsen// sizeEnumSliceValue returns the size of wire encoding a [] value as a repeated Enum.
466*1c12ee1eSDan Willemsenfunc sizeEnumSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
467*1c12ee1eSDan Willemsen	list := listv.List()
468*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
469*1c12ee1eSDan Willemsen		v := list.Get(i)
470*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(uint64(v.Enum()))
471*1c12ee1eSDan Willemsen	}
472*1c12ee1eSDan Willemsen	return size
473*1c12ee1eSDan Willemsen}
474*1c12ee1eSDan Willemsen
475*1c12ee1eSDan Willemsen// appendEnumSliceValue encodes a [] value as a repeated Enum.
476*1c12ee1eSDan Willemsenfunc appendEnumSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
477*1c12ee1eSDan Willemsen	list := listv.List()
478*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
479*1c12ee1eSDan Willemsen		v := list.Get(i)
480*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
481*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v.Enum()))
482*1c12ee1eSDan Willemsen	}
483*1c12ee1eSDan Willemsen	return b, nil
484*1c12ee1eSDan Willemsen}
485*1c12ee1eSDan Willemsen
486*1c12ee1eSDan Willemsen// consumeEnumSliceValue wire decodes a [] value as a repeated Enum.
487*1c12ee1eSDan Willemsenfunc consumeEnumSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
488*1c12ee1eSDan Willemsen	list := listv.List()
489*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
490*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
491*1c12ee1eSDan Willemsen		if n < 0 {
492*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
493*1c12ee1eSDan Willemsen		}
494*1c12ee1eSDan Willemsen		for len(b) > 0 {
495*1c12ee1eSDan Willemsen			var v uint64
496*1c12ee1eSDan Willemsen			var n int
497*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
498*1c12ee1eSDan Willemsen				v = uint64(b[0])
499*1c12ee1eSDan Willemsen				n = 1
500*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
501*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
502*1c12ee1eSDan Willemsen				n = 2
503*1c12ee1eSDan Willemsen			} else {
504*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
505*1c12ee1eSDan Willemsen			}
506*1c12ee1eSDan Willemsen			if n < 0 {
507*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
508*1c12ee1eSDan Willemsen			}
509*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
510*1c12ee1eSDan Willemsen			b = b[n:]
511*1c12ee1eSDan Willemsen		}
512*1c12ee1eSDan Willemsen		out.n = n
513*1c12ee1eSDan Willemsen		return listv, out, nil
514*1c12ee1eSDan Willemsen	}
515*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
516*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
517*1c12ee1eSDan Willemsen	}
518*1c12ee1eSDan Willemsen	var v uint64
519*1c12ee1eSDan Willemsen	var n int
520*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
521*1c12ee1eSDan Willemsen		v = uint64(b[0])
522*1c12ee1eSDan Willemsen		n = 1
523*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
524*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
525*1c12ee1eSDan Willemsen		n = 2
526*1c12ee1eSDan Willemsen	} else {
527*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
528*1c12ee1eSDan Willemsen	}
529*1c12ee1eSDan Willemsen	if n < 0 {
530*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
531*1c12ee1eSDan Willemsen	}
532*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
533*1c12ee1eSDan Willemsen	out.n = n
534*1c12ee1eSDan Willemsen	return listv, out, nil
535*1c12ee1eSDan Willemsen}
536*1c12ee1eSDan Willemsen
537*1c12ee1eSDan Willemsenvar coderEnumSliceValue = valueCoderFuncs{
538*1c12ee1eSDan Willemsen	size:      sizeEnumSliceValue,
539*1c12ee1eSDan Willemsen	marshal:   appendEnumSliceValue,
540*1c12ee1eSDan Willemsen	unmarshal: consumeEnumSliceValue,
541*1c12ee1eSDan Willemsen	merge:     mergeListValue,
542*1c12ee1eSDan Willemsen}
543*1c12ee1eSDan Willemsen
544*1c12ee1eSDan Willemsen// sizeEnumPackedSliceValue returns the size of wire encoding a [] value as a packed repeated Enum.
545*1c12ee1eSDan Willemsenfunc sizeEnumPackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
546*1c12ee1eSDan Willemsen	list := listv.List()
547*1c12ee1eSDan Willemsen	llen := list.Len()
548*1c12ee1eSDan Willemsen	if llen == 0 {
549*1c12ee1eSDan Willemsen		return 0
550*1c12ee1eSDan Willemsen	}
551*1c12ee1eSDan Willemsen	n := 0
552*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
553*1c12ee1eSDan Willemsen		v := list.Get(i)
554*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v.Enum()))
555*1c12ee1eSDan Willemsen	}
556*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
557*1c12ee1eSDan Willemsen}
558*1c12ee1eSDan Willemsen
559*1c12ee1eSDan Willemsen// appendEnumPackedSliceValue encodes a [] value as a packed repeated Enum.
560*1c12ee1eSDan Willemsenfunc appendEnumPackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
561*1c12ee1eSDan Willemsen	list := listv.List()
562*1c12ee1eSDan Willemsen	llen := list.Len()
563*1c12ee1eSDan Willemsen	if llen == 0 {
564*1c12ee1eSDan Willemsen		return b, nil
565*1c12ee1eSDan Willemsen	}
566*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
567*1c12ee1eSDan Willemsen	n := 0
568*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
569*1c12ee1eSDan Willemsen		v := list.Get(i)
570*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v.Enum()))
571*1c12ee1eSDan Willemsen	}
572*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
573*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
574*1c12ee1eSDan Willemsen		v := list.Get(i)
575*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v.Enum()))
576*1c12ee1eSDan Willemsen	}
577*1c12ee1eSDan Willemsen	return b, nil
578*1c12ee1eSDan Willemsen}
579*1c12ee1eSDan Willemsen
580*1c12ee1eSDan Willemsenvar coderEnumPackedSliceValue = valueCoderFuncs{
581*1c12ee1eSDan Willemsen	size:      sizeEnumPackedSliceValue,
582*1c12ee1eSDan Willemsen	marshal:   appendEnumPackedSliceValue,
583*1c12ee1eSDan Willemsen	unmarshal: consumeEnumSliceValue,
584*1c12ee1eSDan Willemsen	merge:     mergeListValue,
585*1c12ee1eSDan Willemsen}
586*1c12ee1eSDan Willemsen
587*1c12ee1eSDan Willemsen// sizeInt32 returns the size of wire encoding a int32 pointer as a Int32.
588*1c12ee1eSDan Willemsenfunc sizeInt32(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
589*1c12ee1eSDan Willemsen	v := *p.Int32()
590*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
591*1c12ee1eSDan Willemsen}
592*1c12ee1eSDan Willemsen
593*1c12ee1eSDan Willemsen// appendInt32 wire encodes a int32 pointer as a Int32.
594*1c12ee1eSDan Willemsenfunc appendInt32(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
595*1c12ee1eSDan Willemsen	v := *p.Int32()
596*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
597*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
598*1c12ee1eSDan Willemsen	return b, nil
599*1c12ee1eSDan Willemsen}
600*1c12ee1eSDan Willemsen
601*1c12ee1eSDan Willemsen// consumeInt32 wire decodes a int32 pointer as a Int32.
602*1c12ee1eSDan Willemsenfunc consumeInt32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
603*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
604*1c12ee1eSDan Willemsen		return out, errUnknown
605*1c12ee1eSDan Willemsen	}
606*1c12ee1eSDan Willemsen	var v uint64
607*1c12ee1eSDan Willemsen	var n int
608*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
609*1c12ee1eSDan Willemsen		v = uint64(b[0])
610*1c12ee1eSDan Willemsen		n = 1
611*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
612*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
613*1c12ee1eSDan Willemsen		n = 2
614*1c12ee1eSDan Willemsen	} else {
615*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
616*1c12ee1eSDan Willemsen	}
617*1c12ee1eSDan Willemsen	if n < 0 {
618*1c12ee1eSDan Willemsen		return out, errDecode
619*1c12ee1eSDan Willemsen	}
620*1c12ee1eSDan Willemsen	*p.Int32() = int32(v)
621*1c12ee1eSDan Willemsen	out.n = n
622*1c12ee1eSDan Willemsen	return out, nil
623*1c12ee1eSDan Willemsen}
624*1c12ee1eSDan Willemsen
625*1c12ee1eSDan Willemsenvar coderInt32 = pointerCoderFuncs{
626*1c12ee1eSDan Willemsen	size:      sizeInt32,
627*1c12ee1eSDan Willemsen	marshal:   appendInt32,
628*1c12ee1eSDan Willemsen	unmarshal: consumeInt32,
629*1c12ee1eSDan Willemsen	merge:     mergeInt32,
630*1c12ee1eSDan Willemsen}
631*1c12ee1eSDan Willemsen
632*1c12ee1eSDan Willemsen// sizeInt32NoZero returns the size of wire encoding a int32 pointer as a Int32.
633*1c12ee1eSDan Willemsen// The zero value is not encoded.
634*1c12ee1eSDan Willemsenfunc sizeInt32NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
635*1c12ee1eSDan Willemsen	v := *p.Int32()
636*1c12ee1eSDan Willemsen	if v == 0 {
637*1c12ee1eSDan Willemsen		return 0
638*1c12ee1eSDan Willemsen	}
639*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
640*1c12ee1eSDan Willemsen}
641*1c12ee1eSDan Willemsen
642*1c12ee1eSDan Willemsen// appendInt32NoZero wire encodes a int32 pointer as a Int32.
643*1c12ee1eSDan Willemsen// The zero value is not encoded.
644*1c12ee1eSDan Willemsenfunc appendInt32NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
645*1c12ee1eSDan Willemsen	v := *p.Int32()
646*1c12ee1eSDan Willemsen	if v == 0 {
647*1c12ee1eSDan Willemsen		return b, nil
648*1c12ee1eSDan Willemsen	}
649*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
650*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
651*1c12ee1eSDan Willemsen	return b, nil
652*1c12ee1eSDan Willemsen}
653*1c12ee1eSDan Willemsen
654*1c12ee1eSDan Willemsenvar coderInt32NoZero = pointerCoderFuncs{
655*1c12ee1eSDan Willemsen	size:      sizeInt32NoZero,
656*1c12ee1eSDan Willemsen	marshal:   appendInt32NoZero,
657*1c12ee1eSDan Willemsen	unmarshal: consumeInt32,
658*1c12ee1eSDan Willemsen	merge:     mergeInt32NoZero,
659*1c12ee1eSDan Willemsen}
660*1c12ee1eSDan Willemsen
661*1c12ee1eSDan Willemsen// sizeInt32Ptr returns the size of wire encoding a *int32 pointer as a Int32.
662*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
663*1c12ee1eSDan Willemsenfunc sizeInt32Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
664*1c12ee1eSDan Willemsen	v := **p.Int32Ptr()
665*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
666*1c12ee1eSDan Willemsen}
667*1c12ee1eSDan Willemsen
668*1c12ee1eSDan Willemsen// appendInt32Ptr wire encodes a *int32 pointer as a Int32.
669*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
670*1c12ee1eSDan Willemsenfunc appendInt32Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
671*1c12ee1eSDan Willemsen	v := **p.Int32Ptr()
672*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
673*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
674*1c12ee1eSDan Willemsen	return b, nil
675*1c12ee1eSDan Willemsen}
676*1c12ee1eSDan Willemsen
677*1c12ee1eSDan Willemsen// consumeInt32Ptr wire decodes a *int32 pointer as a Int32.
678*1c12ee1eSDan Willemsenfunc consumeInt32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
679*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
680*1c12ee1eSDan Willemsen		return out, errUnknown
681*1c12ee1eSDan Willemsen	}
682*1c12ee1eSDan Willemsen	var v uint64
683*1c12ee1eSDan Willemsen	var n int
684*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
685*1c12ee1eSDan Willemsen		v = uint64(b[0])
686*1c12ee1eSDan Willemsen		n = 1
687*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
688*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
689*1c12ee1eSDan Willemsen		n = 2
690*1c12ee1eSDan Willemsen	} else {
691*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
692*1c12ee1eSDan Willemsen	}
693*1c12ee1eSDan Willemsen	if n < 0 {
694*1c12ee1eSDan Willemsen		return out, errDecode
695*1c12ee1eSDan Willemsen	}
696*1c12ee1eSDan Willemsen	vp := p.Int32Ptr()
697*1c12ee1eSDan Willemsen	if *vp == nil {
698*1c12ee1eSDan Willemsen		*vp = new(int32)
699*1c12ee1eSDan Willemsen	}
700*1c12ee1eSDan Willemsen	**vp = int32(v)
701*1c12ee1eSDan Willemsen	out.n = n
702*1c12ee1eSDan Willemsen	return out, nil
703*1c12ee1eSDan Willemsen}
704*1c12ee1eSDan Willemsen
705*1c12ee1eSDan Willemsenvar coderInt32Ptr = pointerCoderFuncs{
706*1c12ee1eSDan Willemsen	size:      sizeInt32Ptr,
707*1c12ee1eSDan Willemsen	marshal:   appendInt32Ptr,
708*1c12ee1eSDan Willemsen	unmarshal: consumeInt32Ptr,
709*1c12ee1eSDan Willemsen	merge:     mergeInt32Ptr,
710*1c12ee1eSDan Willemsen}
711*1c12ee1eSDan Willemsen
712*1c12ee1eSDan Willemsen// sizeInt32Slice returns the size of wire encoding a []int32 pointer as a repeated Int32.
713*1c12ee1eSDan Willemsenfunc sizeInt32Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
714*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
715*1c12ee1eSDan Willemsen	for _, v := range s {
716*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(uint64(v))
717*1c12ee1eSDan Willemsen	}
718*1c12ee1eSDan Willemsen	return size
719*1c12ee1eSDan Willemsen}
720*1c12ee1eSDan Willemsen
721*1c12ee1eSDan Willemsen// appendInt32Slice encodes a []int32 pointer as a repeated Int32.
722*1c12ee1eSDan Willemsenfunc appendInt32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
723*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
724*1c12ee1eSDan Willemsen	for _, v := range s {
725*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
726*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v))
727*1c12ee1eSDan Willemsen	}
728*1c12ee1eSDan Willemsen	return b, nil
729*1c12ee1eSDan Willemsen}
730*1c12ee1eSDan Willemsen
731*1c12ee1eSDan Willemsen// consumeInt32Slice wire decodes a []int32 pointer as a repeated Int32.
732*1c12ee1eSDan Willemsenfunc consumeInt32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
733*1c12ee1eSDan Willemsen	sp := p.Int32Slice()
734*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
735*1c12ee1eSDan Willemsen		s := *sp
736*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
737*1c12ee1eSDan Willemsen		if n < 0 {
738*1c12ee1eSDan Willemsen			return out, errDecode
739*1c12ee1eSDan Willemsen		}
740*1c12ee1eSDan Willemsen		for len(b) > 0 {
741*1c12ee1eSDan Willemsen			var v uint64
742*1c12ee1eSDan Willemsen			var n int
743*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
744*1c12ee1eSDan Willemsen				v = uint64(b[0])
745*1c12ee1eSDan Willemsen				n = 1
746*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
747*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
748*1c12ee1eSDan Willemsen				n = 2
749*1c12ee1eSDan Willemsen			} else {
750*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
751*1c12ee1eSDan Willemsen			}
752*1c12ee1eSDan Willemsen			if n < 0 {
753*1c12ee1eSDan Willemsen				return out, errDecode
754*1c12ee1eSDan Willemsen			}
755*1c12ee1eSDan Willemsen			s = append(s, int32(v))
756*1c12ee1eSDan Willemsen			b = b[n:]
757*1c12ee1eSDan Willemsen		}
758*1c12ee1eSDan Willemsen		*sp = s
759*1c12ee1eSDan Willemsen		out.n = n
760*1c12ee1eSDan Willemsen		return out, nil
761*1c12ee1eSDan Willemsen	}
762*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
763*1c12ee1eSDan Willemsen		return out, errUnknown
764*1c12ee1eSDan Willemsen	}
765*1c12ee1eSDan Willemsen	var v uint64
766*1c12ee1eSDan Willemsen	var n int
767*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
768*1c12ee1eSDan Willemsen		v = uint64(b[0])
769*1c12ee1eSDan Willemsen		n = 1
770*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
771*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
772*1c12ee1eSDan Willemsen		n = 2
773*1c12ee1eSDan Willemsen	} else {
774*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
775*1c12ee1eSDan Willemsen	}
776*1c12ee1eSDan Willemsen	if n < 0 {
777*1c12ee1eSDan Willemsen		return out, errDecode
778*1c12ee1eSDan Willemsen	}
779*1c12ee1eSDan Willemsen	*sp = append(*sp, int32(v))
780*1c12ee1eSDan Willemsen	out.n = n
781*1c12ee1eSDan Willemsen	return out, nil
782*1c12ee1eSDan Willemsen}
783*1c12ee1eSDan Willemsen
784*1c12ee1eSDan Willemsenvar coderInt32Slice = pointerCoderFuncs{
785*1c12ee1eSDan Willemsen	size:      sizeInt32Slice,
786*1c12ee1eSDan Willemsen	marshal:   appendInt32Slice,
787*1c12ee1eSDan Willemsen	unmarshal: consumeInt32Slice,
788*1c12ee1eSDan Willemsen	merge:     mergeInt32Slice,
789*1c12ee1eSDan Willemsen}
790*1c12ee1eSDan Willemsen
791*1c12ee1eSDan Willemsen// sizeInt32PackedSlice returns the size of wire encoding a []int32 pointer as a packed repeated Int32.
792*1c12ee1eSDan Willemsenfunc sizeInt32PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
793*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
794*1c12ee1eSDan Willemsen	if len(s) == 0 {
795*1c12ee1eSDan Willemsen		return 0
796*1c12ee1eSDan Willemsen	}
797*1c12ee1eSDan Willemsen	n := 0
798*1c12ee1eSDan Willemsen	for _, v := range s {
799*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v))
800*1c12ee1eSDan Willemsen	}
801*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
802*1c12ee1eSDan Willemsen}
803*1c12ee1eSDan Willemsen
804*1c12ee1eSDan Willemsen// appendInt32PackedSlice encodes a []int32 pointer as a packed repeated Int32.
805*1c12ee1eSDan Willemsenfunc appendInt32PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
806*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
807*1c12ee1eSDan Willemsen	if len(s) == 0 {
808*1c12ee1eSDan Willemsen		return b, nil
809*1c12ee1eSDan Willemsen	}
810*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
811*1c12ee1eSDan Willemsen	n := 0
812*1c12ee1eSDan Willemsen	for _, v := range s {
813*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v))
814*1c12ee1eSDan Willemsen	}
815*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
816*1c12ee1eSDan Willemsen	for _, v := range s {
817*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v))
818*1c12ee1eSDan Willemsen	}
819*1c12ee1eSDan Willemsen	return b, nil
820*1c12ee1eSDan Willemsen}
821*1c12ee1eSDan Willemsen
822*1c12ee1eSDan Willemsenvar coderInt32PackedSlice = pointerCoderFuncs{
823*1c12ee1eSDan Willemsen	size:      sizeInt32PackedSlice,
824*1c12ee1eSDan Willemsen	marshal:   appendInt32PackedSlice,
825*1c12ee1eSDan Willemsen	unmarshal: consumeInt32Slice,
826*1c12ee1eSDan Willemsen	merge:     mergeInt32Slice,
827*1c12ee1eSDan Willemsen}
828*1c12ee1eSDan Willemsen
829*1c12ee1eSDan Willemsen// sizeInt32Value returns the size of wire encoding a int32 value as a Int32.
830*1c12ee1eSDan Willemsenfunc sizeInt32Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
831*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(uint64(int32(v.Int())))
832*1c12ee1eSDan Willemsen}
833*1c12ee1eSDan Willemsen
834*1c12ee1eSDan Willemsen// appendInt32Value encodes a int32 value as a Int32.
835*1c12ee1eSDan Willemsenfunc appendInt32Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
836*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
837*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(int32(v.Int())))
838*1c12ee1eSDan Willemsen	return b, nil
839*1c12ee1eSDan Willemsen}
840*1c12ee1eSDan Willemsen
841*1c12ee1eSDan Willemsen// consumeInt32Value decodes a int32 value as a Int32.
842*1c12ee1eSDan Willemsenfunc consumeInt32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
843*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
844*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
845*1c12ee1eSDan Willemsen	}
846*1c12ee1eSDan Willemsen	var v uint64
847*1c12ee1eSDan Willemsen	var n int
848*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
849*1c12ee1eSDan Willemsen		v = uint64(b[0])
850*1c12ee1eSDan Willemsen		n = 1
851*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
852*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
853*1c12ee1eSDan Willemsen		n = 2
854*1c12ee1eSDan Willemsen	} else {
855*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
856*1c12ee1eSDan Willemsen	}
857*1c12ee1eSDan Willemsen	if n < 0 {
858*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
859*1c12ee1eSDan Willemsen	}
860*1c12ee1eSDan Willemsen	out.n = n
861*1c12ee1eSDan Willemsen	return protoreflect.ValueOfInt32(int32(v)), out, nil
862*1c12ee1eSDan Willemsen}
863*1c12ee1eSDan Willemsen
864*1c12ee1eSDan Willemsenvar coderInt32Value = valueCoderFuncs{
865*1c12ee1eSDan Willemsen	size:      sizeInt32Value,
866*1c12ee1eSDan Willemsen	marshal:   appendInt32Value,
867*1c12ee1eSDan Willemsen	unmarshal: consumeInt32Value,
868*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
869*1c12ee1eSDan Willemsen}
870*1c12ee1eSDan Willemsen
871*1c12ee1eSDan Willemsen// sizeInt32SliceValue returns the size of wire encoding a []int32 value as a repeated Int32.
872*1c12ee1eSDan Willemsenfunc sizeInt32SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
873*1c12ee1eSDan Willemsen	list := listv.List()
874*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
875*1c12ee1eSDan Willemsen		v := list.Get(i)
876*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(uint64(int32(v.Int())))
877*1c12ee1eSDan Willemsen	}
878*1c12ee1eSDan Willemsen	return size
879*1c12ee1eSDan Willemsen}
880*1c12ee1eSDan Willemsen
881*1c12ee1eSDan Willemsen// appendInt32SliceValue encodes a []int32 value as a repeated Int32.
882*1c12ee1eSDan Willemsenfunc appendInt32SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
883*1c12ee1eSDan Willemsen	list := listv.List()
884*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
885*1c12ee1eSDan Willemsen		v := list.Get(i)
886*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
887*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(int32(v.Int())))
888*1c12ee1eSDan Willemsen	}
889*1c12ee1eSDan Willemsen	return b, nil
890*1c12ee1eSDan Willemsen}
891*1c12ee1eSDan Willemsen
892*1c12ee1eSDan Willemsen// consumeInt32SliceValue wire decodes a []int32 value as a repeated Int32.
893*1c12ee1eSDan Willemsenfunc consumeInt32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
894*1c12ee1eSDan Willemsen	list := listv.List()
895*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
896*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
897*1c12ee1eSDan Willemsen		if n < 0 {
898*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
899*1c12ee1eSDan Willemsen		}
900*1c12ee1eSDan Willemsen		for len(b) > 0 {
901*1c12ee1eSDan Willemsen			var v uint64
902*1c12ee1eSDan Willemsen			var n int
903*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
904*1c12ee1eSDan Willemsen				v = uint64(b[0])
905*1c12ee1eSDan Willemsen				n = 1
906*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
907*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
908*1c12ee1eSDan Willemsen				n = 2
909*1c12ee1eSDan Willemsen			} else {
910*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
911*1c12ee1eSDan Willemsen			}
912*1c12ee1eSDan Willemsen			if n < 0 {
913*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
914*1c12ee1eSDan Willemsen			}
915*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfInt32(int32(v)))
916*1c12ee1eSDan Willemsen			b = b[n:]
917*1c12ee1eSDan Willemsen		}
918*1c12ee1eSDan Willemsen		out.n = n
919*1c12ee1eSDan Willemsen		return listv, out, nil
920*1c12ee1eSDan Willemsen	}
921*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
922*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
923*1c12ee1eSDan Willemsen	}
924*1c12ee1eSDan Willemsen	var v uint64
925*1c12ee1eSDan Willemsen	var n int
926*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
927*1c12ee1eSDan Willemsen		v = uint64(b[0])
928*1c12ee1eSDan Willemsen		n = 1
929*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
930*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
931*1c12ee1eSDan Willemsen		n = 2
932*1c12ee1eSDan Willemsen	} else {
933*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
934*1c12ee1eSDan Willemsen	}
935*1c12ee1eSDan Willemsen	if n < 0 {
936*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
937*1c12ee1eSDan Willemsen	}
938*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfInt32(int32(v)))
939*1c12ee1eSDan Willemsen	out.n = n
940*1c12ee1eSDan Willemsen	return listv, out, nil
941*1c12ee1eSDan Willemsen}
942*1c12ee1eSDan Willemsen
943*1c12ee1eSDan Willemsenvar coderInt32SliceValue = valueCoderFuncs{
944*1c12ee1eSDan Willemsen	size:      sizeInt32SliceValue,
945*1c12ee1eSDan Willemsen	marshal:   appendInt32SliceValue,
946*1c12ee1eSDan Willemsen	unmarshal: consumeInt32SliceValue,
947*1c12ee1eSDan Willemsen	merge:     mergeListValue,
948*1c12ee1eSDan Willemsen}
949*1c12ee1eSDan Willemsen
950*1c12ee1eSDan Willemsen// sizeInt32PackedSliceValue returns the size of wire encoding a []int32 value as a packed repeated Int32.
951*1c12ee1eSDan Willemsenfunc sizeInt32PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
952*1c12ee1eSDan Willemsen	list := listv.List()
953*1c12ee1eSDan Willemsen	llen := list.Len()
954*1c12ee1eSDan Willemsen	if llen == 0 {
955*1c12ee1eSDan Willemsen		return 0
956*1c12ee1eSDan Willemsen	}
957*1c12ee1eSDan Willemsen	n := 0
958*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
959*1c12ee1eSDan Willemsen		v := list.Get(i)
960*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(int32(v.Int())))
961*1c12ee1eSDan Willemsen	}
962*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
963*1c12ee1eSDan Willemsen}
964*1c12ee1eSDan Willemsen
965*1c12ee1eSDan Willemsen// appendInt32PackedSliceValue encodes a []int32 value as a packed repeated Int32.
966*1c12ee1eSDan Willemsenfunc appendInt32PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
967*1c12ee1eSDan Willemsen	list := listv.List()
968*1c12ee1eSDan Willemsen	llen := list.Len()
969*1c12ee1eSDan Willemsen	if llen == 0 {
970*1c12ee1eSDan Willemsen		return b, nil
971*1c12ee1eSDan Willemsen	}
972*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
973*1c12ee1eSDan Willemsen	n := 0
974*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
975*1c12ee1eSDan Willemsen		v := list.Get(i)
976*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(int32(v.Int())))
977*1c12ee1eSDan Willemsen	}
978*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
979*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
980*1c12ee1eSDan Willemsen		v := list.Get(i)
981*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(int32(v.Int())))
982*1c12ee1eSDan Willemsen	}
983*1c12ee1eSDan Willemsen	return b, nil
984*1c12ee1eSDan Willemsen}
985*1c12ee1eSDan Willemsen
986*1c12ee1eSDan Willemsenvar coderInt32PackedSliceValue = valueCoderFuncs{
987*1c12ee1eSDan Willemsen	size:      sizeInt32PackedSliceValue,
988*1c12ee1eSDan Willemsen	marshal:   appendInt32PackedSliceValue,
989*1c12ee1eSDan Willemsen	unmarshal: consumeInt32SliceValue,
990*1c12ee1eSDan Willemsen	merge:     mergeListValue,
991*1c12ee1eSDan Willemsen}
992*1c12ee1eSDan Willemsen
993*1c12ee1eSDan Willemsen// sizeSint32 returns the size of wire encoding a int32 pointer as a Sint32.
994*1c12ee1eSDan Willemsenfunc sizeSint32(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
995*1c12ee1eSDan Willemsen	v := *p.Int32()
996*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
997*1c12ee1eSDan Willemsen}
998*1c12ee1eSDan Willemsen
999*1c12ee1eSDan Willemsen// appendSint32 wire encodes a int32 pointer as a Sint32.
1000*1c12ee1eSDan Willemsenfunc appendSint32(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1001*1c12ee1eSDan Willemsen	v := *p.Int32()
1002*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1003*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
1004*1c12ee1eSDan Willemsen	return b, nil
1005*1c12ee1eSDan Willemsen}
1006*1c12ee1eSDan Willemsen
1007*1c12ee1eSDan Willemsen// consumeSint32 wire decodes a int32 pointer as a Sint32.
1008*1c12ee1eSDan Willemsenfunc consumeSint32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1009*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1010*1c12ee1eSDan Willemsen		return out, errUnknown
1011*1c12ee1eSDan Willemsen	}
1012*1c12ee1eSDan Willemsen	var v uint64
1013*1c12ee1eSDan Willemsen	var n int
1014*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1015*1c12ee1eSDan Willemsen		v = uint64(b[0])
1016*1c12ee1eSDan Willemsen		n = 1
1017*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1018*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1019*1c12ee1eSDan Willemsen		n = 2
1020*1c12ee1eSDan Willemsen	} else {
1021*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1022*1c12ee1eSDan Willemsen	}
1023*1c12ee1eSDan Willemsen	if n < 0 {
1024*1c12ee1eSDan Willemsen		return out, errDecode
1025*1c12ee1eSDan Willemsen	}
1026*1c12ee1eSDan Willemsen	*p.Int32() = int32(protowire.DecodeZigZag(v & math.MaxUint32))
1027*1c12ee1eSDan Willemsen	out.n = n
1028*1c12ee1eSDan Willemsen	return out, nil
1029*1c12ee1eSDan Willemsen}
1030*1c12ee1eSDan Willemsen
1031*1c12ee1eSDan Willemsenvar coderSint32 = pointerCoderFuncs{
1032*1c12ee1eSDan Willemsen	size:      sizeSint32,
1033*1c12ee1eSDan Willemsen	marshal:   appendSint32,
1034*1c12ee1eSDan Willemsen	unmarshal: consumeSint32,
1035*1c12ee1eSDan Willemsen	merge:     mergeInt32,
1036*1c12ee1eSDan Willemsen}
1037*1c12ee1eSDan Willemsen
1038*1c12ee1eSDan Willemsen// sizeSint32NoZero returns the size of wire encoding a int32 pointer as a Sint32.
1039*1c12ee1eSDan Willemsen// The zero value is not encoded.
1040*1c12ee1eSDan Willemsenfunc sizeSint32NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1041*1c12ee1eSDan Willemsen	v := *p.Int32()
1042*1c12ee1eSDan Willemsen	if v == 0 {
1043*1c12ee1eSDan Willemsen		return 0
1044*1c12ee1eSDan Willemsen	}
1045*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
1046*1c12ee1eSDan Willemsen}
1047*1c12ee1eSDan Willemsen
1048*1c12ee1eSDan Willemsen// appendSint32NoZero wire encodes a int32 pointer as a Sint32.
1049*1c12ee1eSDan Willemsen// The zero value is not encoded.
1050*1c12ee1eSDan Willemsenfunc appendSint32NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1051*1c12ee1eSDan Willemsen	v := *p.Int32()
1052*1c12ee1eSDan Willemsen	if v == 0 {
1053*1c12ee1eSDan Willemsen		return b, nil
1054*1c12ee1eSDan Willemsen	}
1055*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1056*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
1057*1c12ee1eSDan Willemsen	return b, nil
1058*1c12ee1eSDan Willemsen}
1059*1c12ee1eSDan Willemsen
1060*1c12ee1eSDan Willemsenvar coderSint32NoZero = pointerCoderFuncs{
1061*1c12ee1eSDan Willemsen	size:      sizeSint32NoZero,
1062*1c12ee1eSDan Willemsen	marshal:   appendSint32NoZero,
1063*1c12ee1eSDan Willemsen	unmarshal: consumeSint32,
1064*1c12ee1eSDan Willemsen	merge:     mergeInt32NoZero,
1065*1c12ee1eSDan Willemsen}
1066*1c12ee1eSDan Willemsen
1067*1c12ee1eSDan Willemsen// sizeSint32Ptr returns the size of wire encoding a *int32 pointer as a Sint32.
1068*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
1069*1c12ee1eSDan Willemsenfunc sizeSint32Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1070*1c12ee1eSDan Willemsen	v := **p.Int32Ptr()
1071*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
1072*1c12ee1eSDan Willemsen}
1073*1c12ee1eSDan Willemsen
1074*1c12ee1eSDan Willemsen// appendSint32Ptr wire encodes a *int32 pointer as a Sint32.
1075*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
1076*1c12ee1eSDan Willemsenfunc appendSint32Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1077*1c12ee1eSDan Willemsen	v := **p.Int32Ptr()
1078*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1079*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
1080*1c12ee1eSDan Willemsen	return b, nil
1081*1c12ee1eSDan Willemsen}
1082*1c12ee1eSDan Willemsen
1083*1c12ee1eSDan Willemsen// consumeSint32Ptr wire decodes a *int32 pointer as a Sint32.
1084*1c12ee1eSDan Willemsenfunc consumeSint32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1085*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1086*1c12ee1eSDan Willemsen		return out, errUnknown
1087*1c12ee1eSDan Willemsen	}
1088*1c12ee1eSDan Willemsen	var v uint64
1089*1c12ee1eSDan Willemsen	var n int
1090*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1091*1c12ee1eSDan Willemsen		v = uint64(b[0])
1092*1c12ee1eSDan Willemsen		n = 1
1093*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1094*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1095*1c12ee1eSDan Willemsen		n = 2
1096*1c12ee1eSDan Willemsen	} else {
1097*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1098*1c12ee1eSDan Willemsen	}
1099*1c12ee1eSDan Willemsen	if n < 0 {
1100*1c12ee1eSDan Willemsen		return out, errDecode
1101*1c12ee1eSDan Willemsen	}
1102*1c12ee1eSDan Willemsen	vp := p.Int32Ptr()
1103*1c12ee1eSDan Willemsen	if *vp == nil {
1104*1c12ee1eSDan Willemsen		*vp = new(int32)
1105*1c12ee1eSDan Willemsen	}
1106*1c12ee1eSDan Willemsen	**vp = int32(protowire.DecodeZigZag(v & math.MaxUint32))
1107*1c12ee1eSDan Willemsen	out.n = n
1108*1c12ee1eSDan Willemsen	return out, nil
1109*1c12ee1eSDan Willemsen}
1110*1c12ee1eSDan Willemsen
1111*1c12ee1eSDan Willemsenvar coderSint32Ptr = pointerCoderFuncs{
1112*1c12ee1eSDan Willemsen	size:      sizeSint32Ptr,
1113*1c12ee1eSDan Willemsen	marshal:   appendSint32Ptr,
1114*1c12ee1eSDan Willemsen	unmarshal: consumeSint32Ptr,
1115*1c12ee1eSDan Willemsen	merge:     mergeInt32Ptr,
1116*1c12ee1eSDan Willemsen}
1117*1c12ee1eSDan Willemsen
1118*1c12ee1eSDan Willemsen// sizeSint32Slice returns the size of wire encoding a []int32 pointer as a repeated Sint32.
1119*1c12ee1eSDan Willemsenfunc sizeSint32Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1120*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
1121*1c12ee1eSDan Willemsen	for _, v := range s {
1122*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
1123*1c12ee1eSDan Willemsen	}
1124*1c12ee1eSDan Willemsen	return size
1125*1c12ee1eSDan Willemsen}
1126*1c12ee1eSDan Willemsen
1127*1c12ee1eSDan Willemsen// appendSint32Slice encodes a []int32 pointer as a repeated Sint32.
1128*1c12ee1eSDan Willemsenfunc appendSint32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1129*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
1130*1c12ee1eSDan Willemsen	for _, v := range s {
1131*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
1132*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
1133*1c12ee1eSDan Willemsen	}
1134*1c12ee1eSDan Willemsen	return b, nil
1135*1c12ee1eSDan Willemsen}
1136*1c12ee1eSDan Willemsen
1137*1c12ee1eSDan Willemsen// consumeSint32Slice wire decodes a []int32 pointer as a repeated Sint32.
1138*1c12ee1eSDan Willemsenfunc consumeSint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1139*1c12ee1eSDan Willemsen	sp := p.Int32Slice()
1140*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
1141*1c12ee1eSDan Willemsen		s := *sp
1142*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
1143*1c12ee1eSDan Willemsen		if n < 0 {
1144*1c12ee1eSDan Willemsen			return out, errDecode
1145*1c12ee1eSDan Willemsen		}
1146*1c12ee1eSDan Willemsen		for len(b) > 0 {
1147*1c12ee1eSDan Willemsen			var v uint64
1148*1c12ee1eSDan Willemsen			var n int
1149*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
1150*1c12ee1eSDan Willemsen				v = uint64(b[0])
1151*1c12ee1eSDan Willemsen				n = 1
1152*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
1153*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1154*1c12ee1eSDan Willemsen				n = 2
1155*1c12ee1eSDan Willemsen			} else {
1156*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
1157*1c12ee1eSDan Willemsen			}
1158*1c12ee1eSDan Willemsen			if n < 0 {
1159*1c12ee1eSDan Willemsen				return out, errDecode
1160*1c12ee1eSDan Willemsen			}
1161*1c12ee1eSDan Willemsen			s = append(s, int32(protowire.DecodeZigZag(v&math.MaxUint32)))
1162*1c12ee1eSDan Willemsen			b = b[n:]
1163*1c12ee1eSDan Willemsen		}
1164*1c12ee1eSDan Willemsen		*sp = s
1165*1c12ee1eSDan Willemsen		out.n = n
1166*1c12ee1eSDan Willemsen		return out, nil
1167*1c12ee1eSDan Willemsen	}
1168*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1169*1c12ee1eSDan Willemsen		return out, errUnknown
1170*1c12ee1eSDan Willemsen	}
1171*1c12ee1eSDan Willemsen	var v uint64
1172*1c12ee1eSDan Willemsen	var n int
1173*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1174*1c12ee1eSDan Willemsen		v = uint64(b[0])
1175*1c12ee1eSDan Willemsen		n = 1
1176*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1177*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1178*1c12ee1eSDan Willemsen		n = 2
1179*1c12ee1eSDan Willemsen	} else {
1180*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1181*1c12ee1eSDan Willemsen	}
1182*1c12ee1eSDan Willemsen	if n < 0 {
1183*1c12ee1eSDan Willemsen		return out, errDecode
1184*1c12ee1eSDan Willemsen	}
1185*1c12ee1eSDan Willemsen	*sp = append(*sp, int32(protowire.DecodeZigZag(v&math.MaxUint32)))
1186*1c12ee1eSDan Willemsen	out.n = n
1187*1c12ee1eSDan Willemsen	return out, nil
1188*1c12ee1eSDan Willemsen}
1189*1c12ee1eSDan Willemsen
1190*1c12ee1eSDan Willemsenvar coderSint32Slice = pointerCoderFuncs{
1191*1c12ee1eSDan Willemsen	size:      sizeSint32Slice,
1192*1c12ee1eSDan Willemsen	marshal:   appendSint32Slice,
1193*1c12ee1eSDan Willemsen	unmarshal: consumeSint32Slice,
1194*1c12ee1eSDan Willemsen	merge:     mergeInt32Slice,
1195*1c12ee1eSDan Willemsen}
1196*1c12ee1eSDan Willemsen
1197*1c12ee1eSDan Willemsen// sizeSint32PackedSlice returns the size of wire encoding a []int32 pointer as a packed repeated Sint32.
1198*1c12ee1eSDan Willemsenfunc sizeSint32PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1199*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
1200*1c12ee1eSDan Willemsen	if len(s) == 0 {
1201*1c12ee1eSDan Willemsen		return 0
1202*1c12ee1eSDan Willemsen	}
1203*1c12ee1eSDan Willemsen	n := 0
1204*1c12ee1eSDan Willemsen	for _, v := range s {
1205*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
1206*1c12ee1eSDan Willemsen	}
1207*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
1208*1c12ee1eSDan Willemsen}
1209*1c12ee1eSDan Willemsen
1210*1c12ee1eSDan Willemsen// appendSint32PackedSlice encodes a []int32 pointer as a packed repeated Sint32.
1211*1c12ee1eSDan Willemsenfunc appendSint32PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1212*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
1213*1c12ee1eSDan Willemsen	if len(s) == 0 {
1214*1c12ee1eSDan Willemsen		return b, nil
1215*1c12ee1eSDan Willemsen	}
1216*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1217*1c12ee1eSDan Willemsen	n := 0
1218*1c12ee1eSDan Willemsen	for _, v := range s {
1219*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
1220*1c12ee1eSDan Willemsen	}
1221*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
1222*1c12ee1eSDan Willemsen	for _, v := range s {
1223*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
1224*1c12ee1eSDan Willemsen	}
1225*1c12ee1eSDan Willemsen	return b, nil
1226*1c12ee1eSDan Willemsen}
1227*1c12ee1eSDan Willemsen
1228*1c12ee1eSDan Willemsenvar coderSint32PackedSlice = pointerCoderFuncs{
1229*1c12ee1eSDan Willemsen	size:      sizeSint32PackedSlice,
1230*1c12ee1eSDan Willemsen	marshal:   appendSint32PackedSlice,
1231*1c12ee1eSDan Willemsen	unmarshal: consumeSint32Slice,
1232*1c12ee1eSDan Willemsen	merge:     mergeInt32Slice,
1233*1c12ee1eSDan Willemsen}
1234*1c12ee1eSDan Willemsen
1235*1c12ee1eSDan Willemsen// sizeSint32Value returns the size of wire encoding a int32 value as a Sint32.
1236*1c12ee1eSDan Willemsenfunc sizeSint32Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
1237*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
1238*1c12ee1eSDan Willemsen}
1239*1c12ee1eSDan Willemsen
1240*1c12ee1eSDan Willemsen// appendSint32Value encodes a int32 value as a Sint32.
1241*1c12ee1eSDan Willemsenfunc appendSint32Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
1242*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
1243*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
1244*1c12ee1eSDan Willemsen	return b, nil
1245*1c12ee1eSDan Willemsen}
1246*1c12ee1eSDan Willemsen
1247*1c12ee1eSDan Willemsen// consumeSint32Value decodes a int32 value as a Sint32.
1248*1c12ee1eSDan Willemsenfunc consumeSint32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
1249*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1250*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
1251*1c12ee1eSDan Willemsen	}
1252*1c12ee1eSDan Willemsen	var v uint64
1253*1c12ee1eSDan Willemsen	var n int
1254*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1255*1c12ee1eSDan Willemsen		v = uint64(b[0])
1256*1c12ee1eSDan Willemsen		n = 1
1257*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1258*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1259*1c12ee1eSDan Willemsen		n = 2
1260*1c12ee1eSDan Willemsen	} else {
1261*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1262*1c12ee1eSDan Willemsen	}
1263*1c12ee1eSDan Willemsen	if n < 0 {
1264*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
1265*1c12ee1eSDan Willemsen	}
1266*1c12ee1eSDan Willemsen	out.n = n
1267*1c12ee1eSDan Willemsen	return protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))), out, nil
1268*1c12ee1eSDan Willemsen}
1269*1c12ee1eSDan Willemsen
1270*1c12ee1eSDan Willemsenvar coderSint32Value = valueCoderFuncs{
1271*1c12ee1eSDan Willemsen	size:      sizeSint32Value,
1272*1c12ee1eSDan Willemsen	marshal:   appendSint32Value,
1273*1c12ee1eSDan Willemsen	unmarshal: consumeSint32Value,
1274*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
1275*1c12ee1eSDan Willemsen}
1276*1c12ee1eSDan Willemsen
1277*1c12ee1eSDan Willemsen// sizeSint32SliceValue returns the size of wire encoding a []int32 value as a repeated Sint32.
1278*1c12ee1eSDan Willemsenfunc sizeSint32SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
1279*1c12ee1eSDan Willemsen	list := listv.List()
1280*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
1281*1c12ee1eSDan Willemsen		v := list.Get(i)
1282*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
1283*1c12ee1eSDan Willemsen	}
1284*1c12ee1eSDan Willemsen	return size
1285*1c12ee1eSDan Willemsen}
1286*1c12ee1eSDan Willemsen
1287*1c12ee1eSDan Willemsen// appendSint32SliceValue encodes a []int32 value as a repeated Sint32.
1288*1c12ee1eSDan Willemsenfunc appendSint32SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
1289*1c12ee1eSDan Willemsen	list := listv.List()
1290*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
1291*1c12ee1eSDan Willemsen		v := list.Get(i)
1292*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
1293*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
1294*1c12ee1eSDan Willemsen	}
1295*1c12ee1eSDan Willemsen	return b, nil
1296*1c12ee1eSDan Willemsen}
1297*1c12ee1eSDan Willemsen
1298*1c12ee1eSDan Willemsen// consumeSint32SliceValue wire decodes a []int32 value as a repeated Sint32.
1299*1c12ee1eSDan Willemsenfunc consumeSint32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
1300*1c12ee1eSDan Willemsen	list := listv.List()
1301*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
1302*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
1303*1c12ee1eSDan Willemsen		if n < 0 {
1304*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
1305*1c12ee1eSDan Willemsen		}
1306*1c12ee1eSDan Willemsen		for len(b) > 0 {
1307*1c12ee1eSDan Willemsen			var v uint64
1308*1c12ee1eSDan Willemsen			var n int
1309*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
1310*1c12ee1eSDan Willemsen				v = uint64(b[0])
1311*1c12ee1eSDan Willemsen				n = 1
1312*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
1313*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1314*1c12ee1eSDan Willemsen				n = 2
1315*1c12ee1eSDan Willemsen			} else {
1316*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
1317*1c12ee1eSDan Willemsen			}
1318*1c12ee1eSDan Willemsen			if n < 0 {
1319*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
1320*1c12ee1eSDan Willemsen			}
1321*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))))
1322*1c12ee1eSDan Willemsen			b = b[n:]
1323*1c12ee1eSDan Willemsen		}
1324*1c12ee1eSDan Willemsen		out.n = n
1325*1c12ee1eSDan Willemsen		return listv, out, nil
1326*1c12ee1eSDan Willemsen	}
1327*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1328*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
1329*1c12ee1eSDan Willemsen	}
1330*1c12ee1eSDan Willemsen	var v uint64
1331*1c12ee1eSDan Willemsen	var n int
1332*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1333*1c12ee1eSDan Willemsen		v = uint64(b[0])
1334*1c12ee1eSDan Willemsen		n = 1
1335*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1336*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1337*1c12ee1eSDan Willemsen		n = 2
1338*1c12ee1eSDan Willemsen	} else {
1339*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1340*1c12ee1eSDan Willemsen	}
1341*1c12ee1eSDan Willemsen	if n < 0 {
1342*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
1343*1c12ee1eSDan Willemsen	}
1344*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))))
1345*1c12ee1eSDan Willemsen	out.n = n
1346*1c12ee1eSDan Willemsen	return listv, out, nil
1347*1c12ee1eSDan Willemsen}
1348*1c12ee1eSDan Willemsen
1349*1c12ee1eSDan Willemsenvar coderSint32SliceValue = valueCoderFuncs{
1350*1c12ee1eSDan Willemsen	size:      sizeSint32SliceValue,
1351*1c12ee1eSDan Willemsen	marshal:   appendSint32SliceValue,
1352*1c12ee1eSDan Willemsen	unmarshal: consumeSint32SliceValue,
1353*1c12ee1eSDan Willemsen	merge:     mergeListValue,
1354*1c12ee1eSDan Willemsen}
1355*1c12ee1eSDan Willemsen
1356*1c12ee1eSDan Willemsen// sizeSint32PackedSliceValue returns the size of wire encoding a []int32 value as a packed repeated Sint32.
1357*1c12ee1eSDan Willemsenfunc sizeSint32PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
1358*1c12ee1eSDan Willemsen	list := listv.List()
1359*1c12ee1eSDan Willemsen	llen := list.Len()
1360*1c12ee1eSDan Willemsen	if llen == 0 {
1361*1c12ee1eSDan Willemsen		return 0
1362*1c12ee1eSDan Willemsen	}
1363*1c12ee1eSDan Willemsen	n := 0
1364*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
1365*1c12ee1eSDan Willemsen		v := list.Get(i)
1366*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
1367*1c12ee1eSDan Willemsen	}
1368*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
1369*1c12ee1eSDan Willemsen}
1370*1c12ee1eSDan Willemsen
1371*1c12ee1eSDan Willemsen// appendSint32PackedSliceValue encodes a []int32 value as a packed repeated Sint32.
1372*1c12ee1eSDan Willemsenfunc appendSint32PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
1373*1c12ee1eSDan Willemsen	list := listv.List()
1374*1c12ee1eSDan Willemsen	llen := list.Len()
1375*1c12ee1eSDan Willemsen	if llen == 0 {
1376*1c12ee1eSDan Willemsen		return b, nil
1377*1c12ee1eSDan Willemsen	}
1378*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
1379*1c12ee1eSDan Willemsen	n := 0
1380*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
1381*1c12ee1eSDan Willemsen		v := list.Get(i)
1382*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
1383*1c12ee1eSDan Willemsen	}
1384*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
1385*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
1386*1c12ee1eSDan Willemsen		v := list.Get(i)
1387*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
1388*1c12ee1eSDan Willemsen	}
1389*1c12ee1eSDan Willemsen	return b, nil
1390*1c12ee1eSDan Willemsen}
1391*1c12ee1eSDan Willemsen
1392*1c12ee1eSDan Willemsenvar coderSint32PackedSliceValue = valueCoderFuncs{
1393*1c12ee1eSDan Willemsen	size:      sizeSint32PackedSliceValue,
1394*1c12ee1eSDan Willemsen	marshal:   appendSint32PackedSliceValue,
1395*1c12ee1eSDan Willemsen	unmarshal: consumeSint32SliceValue,
1396*1c12ee1eSDan Willemsen	merge:     mergeListValue,
1397*1c12ee1eSDan Willemsen}
1398*1c12ee1eSDan Willemsen
1399*1c12ee1eSDan Willemsen// sizeUint32 returns the size of wire encoding a uint32 pointer as a Uint32.
1400*1c12ee1eSDan Willemsenfunc sizeUint32(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1401*1c12ee1eSDan Willemsen	v := *p.Uint32()
1402*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
1403*1c12ee1eSDan Willemsen}
1404*1c12ee1eSDan Willemsen
1405*1c12ee1eSDan Willemsen// appendUint32 wire encodes a uint32 pointer as a Uint32.
1406*1c12ee1eSDan Willemsenfunc appendUint32(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1407*1c12ee1eSDan Willemsen	v := *p.Uint32()
1408*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1409*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
1410*1c12ee1eSDan Willemsen	return b, nil
1411*1c12ee1eSDan Willemsen}
1412*1c12ee1eSDan Willemsen
1413*1c12ee1eSDan Willemsen// consumeUint32 wire decodes a uint32 pointer as a Uint32.
1414*1c12ee1eSDan Willemsenfunc consumeUint32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1415*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1416*1c12ee1eSDan Willemsen		return out, errUnknown
1417*1c12ee1eSDan Willemsen	}
1418*1c12ee1eSDan Willemsen	var v uint64
1419*1c12ee1eSDan Willemsen	var n int
1420*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1421*1c12ee1eSDan Willemsen		v = uint64(b[0])
1422*1c12ee1eSDan Willemsen		n = 1
1423*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1424*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1425*1c12ee1eSDan Willemsen		n = 2
1426*1c12ee1eSDan Willemsen	} else {
1427*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1428*1c12ee1eSDan Willemsen	}
1429*1c12ee1eSDan Willemsen	if n < 0 {
1430*1c12ee1eSDan Willemsen		return out, errDecode
1431*1c12ee1eSDan Willemsen	}
1432*1c12ee1eSDan Willemsen	*p.Uint32() = uint32(v)
1433*1c12ee1eSDan Willemsen	out.n = n
1434*1c12ee1eSDan Willemsen	return out, nil
1435*1c12ee1eSDan Willemsen}
1436*1c12ee1eSDan Willemsen
1437*1c12ee1eSDan Willemsenvar coderUint32 = pointerCoderFuncs{
1438*1c12ee1eSDan Willemsen	size:      sizeUint32,
1439*1c12ee1eSDan Willemsen	marshal:   appendUint32,
1440*1c12ee1eSDan Willemsen	unmarshal: consumeUint32,
1441*1c12ee1eSDan Willemsen	merge:     mergeUint32,
1442*1c12ee1eSDan Willemsen}
1443*1c12ee1eSDan Willemsen
1444*1c12ee1eSDan Willemsen// sizeUint32NoZero returns the size of wire encoding a uint32 pointer as a Uint32.
1445*1c12ee1eSDan Willemsen// The zero value is not encoded.
1446*1c12ee1eSDan Willemsenfunc sizeUint32NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1447*1c12ee1eSDan Willemsen	v := *p.Uint32()
1448*1c12ee1eSDan Willemsen	if v == 0 {
1449*1c12ee1eSDan Willemsen		return 0
1450*1c12ee1eSDan Willemsen	}
1451*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
1452*1c12ee1eSDan Willemsen}
1453*1c12ee1eSDan Willemsen
1454*1c12ee1eSDan Willemsen// appendUint32NoZero wire encodes a uint32 pointer as a Uint32.
1455*1c12ee1eSDan Willemsen// The zero value is not encoded.
1456*1c12ee1eSDan Willemsenfunc appendUint32NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1457*1c12ee1eSDan Willemsen	v := *p.Uint32()
1458*1c12ee1eSDan Willemsen	if v == 0 {
1459*1c12ee1eSDan Willemsen		return b, nil
1460*1c12ee1eSDan Willemsen	}
1461*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1462*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
1463*1c12ee1eSDan Willemsen	return b, nil
1464*1c12ee1eSDan Willemsen}
1465*1c12ee1eSDan Willemsen
1466*1c12ee1eSDan Willemsenvar coderUint32NoZero = pointerCoderFuncs{
1467*1c12ee1eSDan Willemsen	size:      sizeUint32NoZero,
1468*1c12ee1eSDan Willemsen	marshal:   appendUint32NoZero,
1469*1c12ee1eSDan Willemsen	unmarshal: consumeUint32,
1470*1c12ee1eSDan Willemsen	merge:     mergeUint32NoZero,
1471*1c12ee1eSDan Willemsen}
1472*1c12ee1eSDan Willemsen
1473*1c12ee1eSDan Willemsen// sizeUint32Ptr returns the size of wire encoding a *uint32 pointer as a Uint32.
1474*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
1475*1c12ee1eSDan Willemsenfunc sizeUint32Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1476*1c12ee1eSDan Willemsen	v := **p.Uint32Ptr()
1477*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
1478*1c12ee1eSDan Willemsen}
1479*1c12ee1eSDan Willemsen
1480*1c12ee1eSDan Willemsen// appendUint32Ptr wire encodes a *uint32 pointer as a Uint32.
1481*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
1482*1c12ee1eSDan Willemsenfunc appendUint32Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1483*1c12ee1eSDan Willemsen	v := **p.Uint32Ptr()
1484*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1485*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
1486*1c12ee1eSDan Willemsen	return b, nil
1487*1c12ee1eSDan Willemsen}
1488*1c12ee1eSDan Willemsen
1489*1c12ee1eSDan Willemsen// consumeUint32Ptr wire decodes a *uint32 pointer as a Uint32.
1490*1c12ee1eSDan Willemsenfunc consumeUint32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1491*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1492*1c12ee1eSDan Willemsen		return out, errUnknown
1493*1c12ee1eSDan Willemsen	}
1494*1c12ee1eSDan Willemsen	var v uint64
1495*1c12ee1eSDan Willemsen	var n int
1496*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1497*1c12ee1eSDan Willemsen		v = uint64(b[0])
1498*1c12ee1eSDan Willemsen		n = 1
1499*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1500*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1501*1c12ee1eSDan Willemsen		n = 2
1502*1c12ee1eSDan Willemsen	} else {
1503*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1504*1c12ee1eSDan Willemsen	}
1505*1c12ee1eSDan Willemsen	if n < 0 {
1506*1c12ee1eSDan Willemsen		return out, errDecode
1507*1c12ee1eSDan Willemsen	}
1508*1c12ee1eSDan Willemsen	vp := p.Uint32Ptr()
1509*1c12ee1eSDan Willemsen	if *vp == nil {
1510*1c12ee1eSDan Willemsen		*vp = new(uint32)
1511*1c12ee1eSDan Willemsen	}
1512*1c12ee1eSDan Willemsen	**vp = uint32(v)
1513*1c12ee1eSDan Willemsen	out.n = n
1514*1c12ee1eSDan Willemsen	return out, nil
1515*1c12ee1eSDan Willemsen}
1516*1c12ee1eSDan Willemsen
1517*1c12ee1eSDan Willemsenvar coderUint32Ptr = pointerCoderFuncs{
1518*1c12ee1eSDan Willemsen	size:      sizeUint32Ptr,
1519*1c12ee1eSDan Willemsen	marshal:   appendUint32Ptr,
1520*1c12ee1eSDan Willemsen	unmarshal: consumeUint32Ptr,
1521*1c12ee1eSDan Willemsen	merge:     mergeUint32Ptr,
1522*1c12ee1eSDan Willemsen}
1523*1c12ee1eSDan Willemsen
1524*1c12ee1eSDan Willemsen// sizeUint32Slice returns the size of wire encoding a []uint32 pointer as a repeated Uint32.
1525*1c12ee1eSDan Willemsenfunc sizeUint32Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1526*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
1527*1c12ee1eSDan Willemsen	for _, v := range s {
1528*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(uint64(v))
1529*1c12ee1eSDan Willemsen	}
1530*1c12ee1eSDan Willemsen	return size
1531*1c12ee1eSDan Willemsen}
1532*1c12ee1eSDan Willemsen
1533*1c12ee1eSDan Willemsen// appendUint32Slice encodes a []uint32 pointer as a repeated Uint32.
1534*1c12ee1eSDan Willemsenfunc appendUint32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1535*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
1536*1c12ee1eSDan Willemsen	for _, v := range s {
1537*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
1538*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v))
1539*1c12ee1eSDan Willemsen	}
1540*1c12ee1eSDan Willemsen	return b, nil
1541*1c12ee1eSDan Willemsen}
1542*1c12ee1eSDan Willemsen
1543*1c12ee1eSDan Willemsen// consumeUint32Slice wire decodes a []uint32 pointer as a repeated Uint32.
1544*1c12ee1eSDan Willemsenfunc consumeUint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1545*1c12ee1eSDan Willemsen	sp := p.Uint32Slice()
1546*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
1547*1c12ee1eSDan Willemsen		s := *sp
1548*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
1549*1c12ee1eSDan Willemsen		if n < 0 {
1550*1c12ee1eSDan Willemsen			return out, errDecode
1551*1c12ee1eSDan Willemsen		}
1552*1c12ee1eSDan Willemsen		for len(b) > 0 {
1553*1c12ee1eSDan Willemsen			var v uint64
1554*1c12ee1eSDan Willemsen			var n int
1555*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
1556*1c12ee1eSDan Willemsen				v = uint64(b[0])
1557*1c12ee1eSDan Willemsen				n = 1
1558*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
1559*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1560*1c12ee1eSDan Willemsen				n = 2
1561*1c12ee1eSDan Willemsen			} else {
1562*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
1563*1c12ee1eSDan Willemsen			}
1564*1c12ee1eSDan Willemsen			if n < 0 {
1565*1c12ee1eSDan Willemsen				return out, errDecode
1566*1c12ee1eSDan Willemsen			}
1567*1c12ee1eSDan Willemsen			s = append(s, uint32(v))
1568*1c12ee1eSDan Willemsen			b = b[n:]
1569*1c12ee1eSDan Willemsen		}
1570*1c12ee1eSDan Willemsen		*sp = s
1571*1c12ee1eSDan Willemsen		out.n = n
1572*1c12ee1eSDan Willemsen		return out, nil
1573*1c12ee1eSDan Willemsen	}
1574*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1575*1c12ee1eSDan Willemsen		return out, errUnknown
1576*1c12ee1eSDan Willemsen	}
1577*1c12ee1eSDan Willemsen	var v uint64
1578*1c12ee1eSDan Willemsen	var n int
1579*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1580*1c12ee1eSDan Willemsen		v = uint64(b[0])
1581*1c12ee1eSDan Willemsen		n = 1
1582*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1583*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1584*1c12ee1eSDan Willemsen		n = 2
1585*1c12ee1eSDan Willemsen	} else {
1586*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1587*1c12ee1eSDan Willemsen	}
1588*1c12ee1eSDan Willemsen	if n < 0 {
1589*1c12ee1eSDan Willemsen		return out, errDecode
1590*1c12ee1eSDan Willemsen	}
1591*1c12ee1eSDan Willemsen	*sp = append(*sp, uint32(v))
1592*1c12ee1eSDan Willemsen	out.n = n
1593*1c12ee1eSDan Willemsen	return out, nil
1594*1c12ee1eSDan Willemsen}
1595*1c12ee1eSDan Willemsen
1596*1c12ee1eSDan Willemsenvar coderUint32Slice = pointerCoderFuncs{
1597*1c12ee1eSDan Willemsen	size:      sizeUint32Slice,
1598*1c12ee1eSDan Willemsen	marshal:   appendUint32Slice,
1599*1c12ee1eSDan Willemsen	unmarshal: consumeUint32Slice,
1600*1c12ee1eSDan Willemsen	merge:     mergeUint32Slice,
1601*1c12ee1eSDan Willemsen}
1602*1c12ee1eSDan Willemsen
1603*1c12ee1eSDan Willemsen// sizeUint32PackedSlice returns the size of wire encoding a []uint32 pointer as a packed repeated Uint32.
1604*1c12ee1eSDan Willemsenfunc sizeUint32PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1605*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
1606*1c12ee1eSDan Willemsen	if len(s) == 0 {
1607*1c12ee1eSDan Willemsen		return 0
1608*1c12ee1eSDan Willemsen	}
1609*1c12ee1eSDan Willemsen	n := 0
1610*1c12ee1eSDan Willemsen	for _, v := range s {
1611*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v))
1612*1c12ee1eSDan Willemsen	}
1613*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
1614*1c12ee1eSDan Willemsen}
1615*1c12ee1eSDan Willemsen
1616*1c12ee1eSDan Willemsen// appendUint32PackedSlice encodes a []uint32 pointer as a packed repeated Uint32.
1617*1c12ee1eSDan Willemsenfunc appendUint32PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1618*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
1619*1c12ee1eSDan Willemsen	if len(s) == 0 {
1620*1c12ee1eSDan Willemsen		return b, nil
1621*1c12ee1eSDan Willemsen	}
1622*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1623*1c12ee1eSDan Willemsen	n := 0
1624*1c12ee1eSDan Willemsen	for _, v := range s {
1625*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v))
1626*1c12ee1eSDan Willemsen	}
1627*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
1628*1c12ee1eSDan Willemsen	for _, v := range s {
1629*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v))
1630*1c12ee1eSDan Willemsen	}
1631*1c12ee1eSDan Willemsen	return b, nil
1632*1c12ee1eSDan Willemsen}
1633*1c12ee1eSDan Willemsen
1634*1c12ee1eSDan Willemsenvar coderUint32PackedSlice = pointerCoderFuncs{
1635*1c12ee1eSDan Willemsen	size:      sizeUint32PackedSlice,
1636*1c12ee1eSDan Willemsen	marshal:   appendUint32PackedSlice,
1637*1c12ee1eSDan Willemsen	unmarshal: consumeUint32Slice,
1638*1c12ee1eSDan Willemsen	merge:     mergeUint32Slice,
1639*1c12ee1eSDan Willemsen}
1640*1c12ee1eSDan Willemsen
1641*1c12ee1eSDan Willemsen// sizeUint32Value returns the size of wire encoding a uint32 value as a Uint32.
1642*1c12ee1eSDan Willemsenfunc sizeUint32Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
1643*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(uint64(uint32(v.Uint())))
1644*1c12ee1eSDan Willemsen}
1645*1c12ee1eSDan Willemsen
1646*1c12ee1eSDan Willemsen// appendUint32Value encodes a uint32 value as a Uint32.
1647*1c12ee1eSDan Willemsenfunc appendUint32Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
1648*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
1649*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
1650*1c12ee1eSDan Willemsen	return b, nil
1651*1c12ee1eSDan Willemsen}
1652*1c12ee1eSDan Willemsen
1653*1c12ee1eSDan Willemsen// consumeUint32Value decodes a uint32 value as a Uint32.
1654*1c12ee1eSDan Willemsenfunc consumeUint32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
1655*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1656*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
1657*1c12ee1eSDan Willemsen	}
1658*1c12ee1eSDan Willemsen	var v uint64
1659*1c12ee1eSDan Willemsen	var n int
1660*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1661*1c12ee1eSDan Willemsen		v = uint64(b[0])
1662*1c12ee1eSDan Willemsen		n = 1
1663*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1664*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1665*1c12ee1eSDan Willemsen		n = 2
1666*1c12ee1eSDan Willemsen	} else {
1667*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1668*1c12ee1eSDan Willemsen	}
1669*1c12ee1eSDan Willemsen	if n < 0 {
1670*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
1671*1c12ee1eSDan Willemsen	}
1672*1c12ee1eSDan Willemsen	out.n = n
1673*1c12ee1eSDan Willemsen	return protoreflect.ValueOfUint32(uint32(v)), out, nil
1674*1c12ee1eSDan Willemsen}
1675*1c12ee1eSDan Willemsen
1676*1c12ee1eSDan Willemsenvar coderUint32Value = valueCoderFuncs{
1677*1c12ee1eSDan Willemsen	size:      sizeUint32Value,
1678*1c12ee1eSDan Willemsen	marshal:   appendUint32Value,
1679*1c12ee1eSDan Willemsen	unmarshal: consumeUint32Value,
1680*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
1681*1c12ee1eSDan Willemsen}
1682*1c12ee1eSDan Willemsen
1683*1c12ee1eSDan Willemsen// sizeUint32SliceValue returns the size of wire encoding a []uint32 value as a repeated Uint32.
1684*1c12ee1eSDan Willemsenfunc sizeUint32SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
1685*1c12ee1eSDan Willemsen	list := listv.List()
1686*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
1687*1c12ee1eSDan Willemsen		v := list.Get(i)
1688*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(uint64(uint32(v.Uint())))
1689*1c12ee1eSDan Willemsen	}
1690*1c12ee1eSDan Willemsen	return size
1691*1c12ee1eSDan Willemsen}
1692*1c12ee1eSDan Willemsen
1693*1c12ee1eSDan Willemsen// appendUint32SliceValue encodes a []uint32 value as a repeated Uint32.
1694*1c12ee1eSDan Willemsenfunc appendUint32SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
1695*1c12ee1eSDan Willemsen	list := listv.List()
1696*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
1697*1c12ee1eSDan Willemsen		v := list.Get(i)
1698*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
1699*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
1700*1c12ee1eSDan Willemsen	}
1701*1c12ee1eSDan Willemsen	return b, nil
1702*1c12ee1eSDan Willemsen}
1703*1c12ee1eSDan Willemsen
1704*1c12ee1eSDan Willemsen// consumeUint32SliceValue wire decodes a []uint32 value as a repeated Uint32.
1705*1c12ee1eSDan Willemsenfunc consumeUint32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
1706*1c12ee1eSDan Willemsen	list := listv.List()
1707*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
1708*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
1709*1c12ee1eSDan Willemsen		if n < 0 {
1710*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
1711*1c12ee1eSDan Willemsen		}
1712*1c12ee1eSDan Willemsen		for len(b) > 0 {
1713*1c12ee1eSDan Willemsen			var v uint64
1714*1c12ee1eSDan Willemsen			var n int
1715*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
1716*1c12ee1eSDan Willemsen				v = uint64(b[0])
1717*1c12ee1eSDan Willemsen				n = 1
1718*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
1719*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1720*1c12ee1eSDan Willemsen				n = 2
1721*1c12ee1eSDan Willemsen			} else {
1722*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
1723*1c12ee1eSDan Willemsen			}
1724*1c12ee1eSDan Willemsen			if n < 0 {
1725*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
1726*1c12ee1eSDan Willemsen			}
1727*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfUint32(uint32(v)))
1728*1c12ee1eSDan Willemsen			b = b[n:]
1729*1c12ee1eSDan Willemsen		}
1730*1c12ee1eSDan Willemsen		out.n = n
1731*1c12ee1eSDan Willemsen		return listv, out, nil
1732*1c12ee1eSDan Willemsen	}
1733*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1734*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
1735*1c12ee1eSDan Willemsen	}
1736*1c12ee1eSDan Willemsen	var v uint64
1737*1c12ee1eSDan Willemsen	var n int
1738*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1739*1c12ee1eSDan Willemsen		v = uint64(b[0])
1740*1c12ee1eSDan Willemsen		n = 1
1741*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1742*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1743*1c12ee1eSDan Willemsen		n = 2
1744*1c12ee1eSDan Willemsen	} else {
1745*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1746*1c12ee1eSDan Willemsen	}
1747*1c12ee1eSDan Willemsen	if n < 0 {
1748*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
1749*1c12ee1eSDan Willemsen	}
1750*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfUint32(uint32(v)))
1751*1c12ee1eSDan Willemsen	out.n = n
1752*1c12ee1eSDan Willemsen	return listv, out, nil
1753*1c12ee1eSDan Willemsen}
1754*1c12ee1eSDan Willemsen
1755*1c12ee1eSDan Willemsenvar coderUint32SliceValue = valueCoderFuncs{
1756*1c12ee1eSDan Willemsen	size:      sizeUint32SliceValue,
1757*1c12ee1eSDan Willemsen	marshal:   appendUint32SliceValue,
1758*1c12ee1eSDan Willemsen	unmarshal: consumeUint32SliceValue,
1759*1c12ee1eSDan Willemsen	merge:     mergeListValue,
1760*1c12ee1eSDan Willemsen}
1761*1c12ee1eSDan Willemsen
1762*1c12ee1eSDan Willemsen// sizeUint32PackedSliceValue returns the size of wire encoding a []uint32 value as a packed repeated Uint32.
1763*1c12ee1eSDan Willemsenfunc sizeUint32PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
1764*1c12ee1eSDan Willemsen	list := listv.List()
1765*1c12ee1eSDan Willemsen	llen := list.Len()
1766*1c12ee1eSDan Willemsen	if llen == 0 {
1767*1c12ee1eSDan Willemsen		return 0
1768*1c12ee1eSDan Willemsen	}
1769*1c12ee1eSDan Willemsen	n := 0
1770*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
1771*1c12ee1eSDan Willemsen		v := list.Get(i)
1772*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(uint32(v.Uint())))
1773*1c12ee1eSDan Willemsen	}
1774*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
1775*1c12ee1eSDan Willemsen}
1776*1c12ee1eSDan Willemsen
1777*1c12ee1eSDan Willemsen// appendUint32PackedSliceValue encodes a []uint32 value as a packed repeated Uint32.
1778*1c12ee1eSDan Willemsenfunc appendUint32PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
1779*1c12ee1eSDan Willemsen	list := listv.List()
1780*1c12ee1eSDan Willemsen	llen := list.Len()
1781*1c12ee1eSDan Willemsen	if llen == 0 {
1782*1c12ee1eSDan Willemsen		return b, nil
1783*1c12ee1eSDan Willemsen	}
1784*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
1785*1c12ee1eSDan Willemsen	n := 0
1786*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
1787*1c12ee1eSDan Willemsen		v := list.Get(i)
1788*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(uint32(v.Uint())))
1789*1c12ee1eSDan Willemsen	}
1790*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
1791*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
1792*1c12ee1eSDan Willemsen		v := list.Get(i)
1793*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
1794*1c12ee1eSDan Willemsen	}
1795*1c12ee1eSDan Willemsen	return b, nil
1796*1c12ee1eSDan Willemsen}
1797*1c12ee1eSDan Willemsen
1798*1c12ee1eSDan Willemsenvar coderUint32PackedSliceValue = valueCoderFuncs{
1799*1c12ee1eSDan Willemsen	size:      sizeUint32PackedSliceValue,
1800*1c12ee1eSDan Willemsen	marshal:   appendUint32PackedSliceValue,
1801*1c12ee1eSDan Willemsen	unmarshal: consumeUint32SliceValue,
1802*1c12ee1eSDan Willemsen	merge:     mergeListValue,
1803*1c12ee1eSDan Willemsen}
1804*1c12ee1eSDan Willemsen
1805*1c12ee1eSDan Willemsen// sizeInt64 returns the size of wire encoding a int64 pointer as a Int64.
1806*1c12ee1eSDan Willemsenfunc sizeInt64(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1807*1c12ee1eSDan Willemsen	v := *p.Int64()
1808*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
1809*1c12ee1eSDan Willemsen}
1810*1c12ee1eSDan Willemsen
1811*1c12ee1eSDan Willemsen// appendInt64 wire encodes a int64 pointer as a Int64.
1812*1c12ee1eSDan Willemsenfunc appendInt64(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1813*1c12ee1eSDan Willemsen	v := *p.Int64()
1814*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1815*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
1816*1c12ee1eSDan Willemsen	return b, nil
1817*1c12ee1eSDan Willemsen}
1818*1c12ee1eSDan Willemsen
1819*1c12ee1eSDan Willemsen// consumeInt64 wire decodes a int64 pointer as a Int64.
1820*1c12ee1eSDan Willemsenfunc consumeInt64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1821*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1822*1c12ee1eSDan Willemsen		return out, errUnknown
1823*1c12ee1eSDan Willemsen	}
1824*1c12ee1eSDan Willemsen	var v uint64
1825*1c12ee1eSDan Willemsen	var n int
1826*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1827*1c12ee1eSDan Willemsen		v = uint64(b[0])
1828*1c12ee1eSDan Willemsen		n = 1
1829*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1830*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1831*1c12ee1eSDan Willemsen		n = 2
1832*1c12ee1eSDan Willemsen	} else {
1833*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1834*1c12ee1eSDan Willemsen	}
1835*1c12ee1eSDan Willemsen	if n < 0 {
1836*1c12ee1eSDan Willemsen		return out, errDecode
1837*1c12ee1eSDan Willemsen	}
1838*1c12ee1eSDan Willemsen	*p.Int64() = int64(v)
1839*1c12ee1eSDan Willemsen	out.n = n
1840*1c12ee1eSDan Willemsen	return out, nil
1841*1c12ee1eSDan Willemsen}
1842*1c12ee1eSDan Willemsen
1843*1c12ee1eSDan Willemsenvar coderInt64 = pointerCoderFuncs{
1844*1c12ee1eSDan Willemsen	size:      sizeInt64,
1845*1c12ee1eSDan Willemsen	marshal:   appendInt64,
1846*1c12ee1eSDan Willemsen	unmarshal: consumeInt64,
1847*1c12ee1eSDan Willemsen	merge:     mergeInt64,
1848*1c12ee1eSDan Willemsen}
1849*1c12ee1eSDan Willemsen
1850*1c12ee1eSDan Willemsen// sizeInt64NoZero returns the size of wire encoding a int64 pointer as a Int64.
1851*1c12ee1eSDan Willemsen// The zero value is not encoded.
1852*1c12ee1eSDan Willemsenfunc sizeInt64NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1853*1c12ee1eSDan Willemsen	v := *p.Int64()
1854*1c12ee1eSDan Willemsen	if v == 0 {
1855*1c12ee1eSDan Willemsen		return 0
1856*1c12ee1eSDan Willemsen	}
1857*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
1858*1c12ee1eSDan Willemsen}
1859*1c12ee1eSDan Willemsen
1860*1c12ee1eSDan Willemsen// appendInt64NoZero wire encodes a int64 pointer as a Int64.
1861*1c12ee1eSDan Willemsen// The zero value is not encoded.
1862*1c12ee1eSDan Willemsenfunc appendInt64NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1863*1c12ee1eSDan Willemsen	v := *p.Int64()
1864*1c12ee1eSDan Willemsen	if v == 0 {
1865*1c12ee1eSDan Willemsen		return b, nil
1866*1c12ee1eSDan Willemsen	}
1867*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1868*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
1869*1c12ee1eSDan Willemsen	return b, nil
1870*1c12ee1eSDan Willemsen}
1871*1c12ee1eSDan Willemsen
1872*1c12ee1eSDan Willemsenvar coderInt64NoZero = pointerCoderFuncs{
1873*1c12ee1eSDan Willemsen	size:      sizeInt64NoZero,
1874*1c12ee1eSDan Willemsen	marshal:   appendInt64NoZero,
1875*1c12ee1eSDan Willemsen	unmarshal: consumeInt64,
1876*1c12ee1eSDan Willemsen	merge:     mergeInt64NoZero,
1877*1c12ee1eSDan Willemsen}
1878*1c12ee1eSDan Willemsen
1879*1c12ee1eSDan Willemsen// sizeInt64Ptr returns the size of wire encoding a *int64 pointer as a Int64.
1880*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
1881*1c12ee1eSDan Willemsenfunc sizeInt64Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1882*1c12ee1eSDan Willemsen	v := **p.Int64Ptr()
1883*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(uint64(v))
1884*1c12ee1eSDan Willemsen}
1885*1c12ee1eSDan Willemsen
1886*1c12ee1eSDan Willemsen// appendInt64Ptr wire encodes a *int64 pointer as a Int64.
1887*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
1888*1c12ee1eSDan Willemsenfunc appendInt64Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1889*1c12ee1eSDan Willemsen	v := **p.Int64Ptr()
1890*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
1891*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v))
1892*1c12ee1eSDan Willemsen	return b, nil
1893*1c12ee1eSDan Willemsen}
1894*1c12ee1eSDan Willemsen
1895*1c12ee1eSDan Willemsen// consumeInt64Ptr wire decodes a *int64 pointer as a Int64.
1896*1c12ee1eSDan Willemsenfunc consumeInt64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1897*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1898*1c12ee1eSDan Willemsen		return out, errUnknown
1899*1c12ee1eSDan Willemsen	}
1900*1c12ee1eSDan Willemsen	var v uint64
1901*1c12ee1eSDan Willemsen	var n int
1902*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1903*1c12ee1eSDan Willemsen		v = uint64(b[0])
1904*1c12ee1eSDan Willemsen		n = 1
1905*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1906*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1907*1c12ee1eSDan Willemsen		n = 2
1908*1c12ee1eSDan Willemsen	} else {
1909*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1910*1c12ee1eSDan Willemsen	}
1911*1c12ee1eSDan Willemsen	if n < 0 {
1912*1c12ee1eSDan Willemsen		return out, errDecode
1913*1c12ee1eSDan Willemsen	}
1914*1c12ee1eSDan Willemsen	vp := p.Int64Ptr()
1915*1c12ee1eSDan Willemsen	if *vp == nil {
1916*1c12ee1eSDan Willemsen		*vp = new(int64)
1917*1c12ee1eSDan Willemsen	}
1918*1c12ee1eSDan Willemsen	**vp = int64(v)
1919*1c12ee1eSDan Willemsen	out.n = n
1920*1c12ee1eSDan Willemsen	return out, nil
1921*1c12ee1eSDan Willemsen}
1922*1c12ee1eSDan Willemsen
1923*1c12ee1eSDan Willemsenvar coderInt64Ptr = pointerCoderFuncs{
1924*1c12ee1eSDan Willemsen	size:      sizeInt64Ptr,
1925*1c12ee1eSDan Willemsen	marshal:   appendInt64Ptr,
1926*1c12ee1eSDan Willemsen	unmarshal: consumeInt64Ptr,
1927*1c12ee1eSDan Willemsen	merge:     mergeInt64Ptr,
1928*1c12ee1eSDan Willemsen}
1929*1c12ee1eSDan Willemsen
1930*1c12ee1eSDan Willemsen// sizeInt64Slice returns the size of wire encoding a []int64 pointer as a repeated Int64.
1931*1c12ee1eSDan Willemsenfunc sizeInt64Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
1932*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
1933*1c12ee1eSDan Willemsen	for _, v := range s {
1934*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(uint64(v))
1935*1c12ee1eSDan Willemsen	}
1936*1c12ee1eSDan Willemsen	return size
1937*1c12ee1eSDan Willemsen}
1938*1c12ee1eSDan Willemsen
1939*1c12ee1eSDan Willemsen// appendInt64Slice encodes a []int64 pointer as a repeated Int64.
1940*1c12ee1eSDan Willemsenfunc appendInt64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
1941*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
1942*1c12ee1eSDan Willemsen	for _, v := range s {
1943*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
1944*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v))
1945*1c12ee1eSDan Willemsen	}
1946*1c12ee1eSDan Willemsen	return b, nil
1947*1c12ee1eSDan Willemsen}
1948*1c12ee1eSDan Willemsen
1949*1c12ee1eSDan Willemsen// consumeInt64Slice wire decodes a []int64 pointer as a repeated Int64.
1950*1c12ee1eSDan Willemsenfunc consumeInt64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
1951*1c12ee1eSDan Willemsen	sp := p.Int64Slice()
1952*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
1953*1c12ee1eSDan Willemsen		s := *sp
1954*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
1955*1c12ee1eSDan Willemsen		if n < 0 {
1956*1c12ee1eSDan Willemsen			return out, errDecode
1957*1c12ee1eSDan Willemsen		}
1958*1c12ee1eSDan Willemsen		for len(b) > 0 {
1959*1c12ee1eSDan Willemsen			var v uint64
1960*1c12ee1eSDan Willemsen			var n int
1961*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
1962*1c12ee1eSDan Willemsen				v = uint64(b[0])
1963*1c12ee1eSDan Willemsen				n = 1
1964*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
1965*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1966*1c12ee1eSDan Willemsen				n = 2
1967*1c12ee1eSDan Willemsen			} else {
1968*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
1969*1c12ee1eSDan Willemsen			}
1970*1c12ee1eSDan Willemsen			if n < 0 {
1971*1c12ee1eSDan Willemsen				return out, errDecode
1972*1c12ee1eSDan Willemsen			}
1973*1c12ee1eSDan Willemsen			s = append(s, int64(v))
1974*1c12ee1eSDan Willemsen			b = b[n:]
1975*1c12ee1eSDan Willemsen		}
1976*1c12ee1eSDan Willemsen		*sp = s
1977*1c12ee1eSDan Willemsen		out.n = n
1978*1c12ee1eSDan Willemsen		return out, nil
1979*1c12ee1eSDan Willemsen	}
1980*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
1981*1c12ee1eSDan Willemsen		return out, errUnknown
1982*1c12ee1eSDan Willemsen	}
1983*1c12ee1eSDan Willemsen	var v uint64
1984*1c12ee1eSDan Willemsen	var n int
1985*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
1986*1c12ee1eSDan Willemsen		v = uint64(b[0])
1987*1c12ee1eSDan Willemsen		n = 1
1988*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
1989*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
1990*1c12ee1eSDan Willemsen		n = 2
1991*1c12ee1eSDan Willemsen	} else {
1992*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
1993*1c12ee1eSDan Willemsen	}
1994*1c12ee1eSDan Willemsen	if n < 0 {
1995*1c12ee1eSDan Willemsen		return out, errDecode
1996*1c12ee1eSDan Willemsen	}
1997*1c12ee1eSDan Willemsen	*sp = append(*sp, int64(v))
1998*1c12ee1eSDan Willemsen	out.n = n
1999*1c12ee1eSDan Willemsen	return out, nil
2000*1c12ee1eSDan Willemsen}
2001*1c12ee1eSDan Willemsen
2002*1c12ee1eSDan Willemsenvar coderInt64Slice = pointerCoderFuncs{
2003*1c12ee1eSDan Willemsen	size:      sizeInt64Slice,
2004*1c12ee1eSDan Willemsen	marshal:   appendInt64Slice,
2005*1c12ee1eSDan Willemsen	unmarshal: consumeInt64Slice,
2006*1c12ee1eSDan Willemsen	merge:     mergeInt64Slice,
2007*1c12ee1eSDan Willemsen}
2008*1c12ee1eSDan Willemsen
2009*1c12ee1eSDan Willemsen// sizeInt64PackedSlice returns the size of wire encoding a []int64 pointer as a packed repeated Int64.
2010*1c12ee1eSDan Willemsenfunc sizeInt64PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2011*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
2012*1c12ee1eSDan Willemsen	if len(s) == 0 {
2013*1c12ee1eSDan Willemsen		return 0
2014*1c12ee1eSDan Willemsen	}
2015*1c12ee1eSDan Willemsen	n := 0
2016*1c12ee1eSDan Willemsen	for _, v := range s {
2017*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v))
2018*1c12ee1eSDan Willemsen	}
2019*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
2020*1c12ee1eSDan Willemsen}
2021*1c12ee1eSDan Willemsen
2022*1c12ee1eSDan Willemsen// appendInt64PackedSlice encodes a []int64 pointer as a packed repeated Int64.
2023*1c12ee1eSDan Willemsenfunc appendInt64PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2024*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
2025*1c12ee1eSDan Willemsen	if len(s) == 0 {
2026*1c12ee1eSDan Willemsen		return b, nil
2027*1c12ee1eSDan Willemsen	}
2028*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2029*1c12ee1eSDan Willemsen	n := 0
2030*1c12ee1eSDan Willemsen	for _, v := range s {
2031*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v))
2032*1c12ee1eSDan Willemsen	}
2033*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
2034*1c12ee1eSDan Willemsen	for _, v := range s {
2035*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v))
2036*1c12ee1eSDan Willemsen	}
2037*1c12ee1eSDan Willemsen	return b, nil
2038*1c12ee1eSDan Willemsen}
2039*1c12ee1eSDan Willemsen
2040*1c12ee1eSDan Willemsenvar coderInt64PackedSlice = pointerCoderFuncs{
2041*1c12ee1eSDan Willemsen	size:      sizeInt64PackedSlice,
2042*1c12ee1eSDan Willemsen	marshal:   appendInt64PackedSlice,
2043*1c12ee1eSDan Willemsen	unmarshal: consumeInt64Slice,
2044*1c12ee1eSDan Willemsen	merge:     mergeInt64Slice,
2045*1c12ee1eSDan Willemsen}
2046*1c12ee1eSDan Willemsen
2047*1c12ee1eSDan Willemsen// sizeInt64Value returns the size of wire encoding a int64 value as a Int64.
2048*1c12ee1eSDan Willemsenfunc sizeInt64Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
2049*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(uint64(v.Int()))
2050*1c12ee1eSDan Willemsen}
2051*1c12ee1eSDan Willemsen
2052*1c12ee1eSDan Willemsen// appendInt64Value encodes a int64 value as a Int64.
2053*1c12ee1eSDan Willemsenfunc appendInt64Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2054*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
2055*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(v.Int()))
2056*1c12ee1eSDan Willemsen	return b, nil
2057*1c12ee1eSDan Willemsen}
2058*1c12ee1eSDan Willemsen
2059*1c12ee1eSDan Willemsen// consumeInt64Value decodes a int64 value as a Int64.
2060*1c12ee1eSDan Willemsenfunc consumeInt64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
2061*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2062*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
2063*1c12ee1eSDan Willemsen	}
2064*1c12ee1eSDan Willemsen	var v uint64
2065*1c12ee1eSDan Willemsen	var n int
2066*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2067*1c12ee1eSDan Willemsen		v = uint64(b[0])
2068*1c12ee1eSDan Willemsen		n = 1
2069*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2070*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2071*1c12ee1eSDan Willemsen		n = 2
2072*1c12ee1eSDan Willemsen	} else {
2073*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2074*1c12ee1eSDan Willemsen	}
2075*1c12ee1eSDan Willemsen	if n < 0 {
2076*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
2077*1c12ee1eSDan Willemsen	}
2078*1c12ee1eSDan Willemsen	out.n = n
2079*1c12ee1eSDan Willemsen	return protoreflect.ValueOfInt64(int64(v)), out, nil
2080*1c12ee1eSDan Willemsen}
2081*1c12ee1eSDan Willemsen
2082*1c12ee1eSDan Willemsenvar coderInt64Value = valueCoderFuncs{
2083*1c12ee1eSDan Willemsen	size:      sizeInt64Value,
2084*1c12ee1eSDan Willemsen	marshal:   appendInt64Value,
2085*1c12ee1eSDan Willemsen	unmarshal: consumeInt64Value,
2086*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
2087*1c12ee1eSDan Willemsen}
2088*1c12ee1eSDan Willemsen
2089*1c12ee1eSDan Willemsen// sizeInt64SliceValue returns the size of wire encoding a []int64 value as a repeated Int64.
2090*1c12ee1eSDan Willemsenfunc sizeInt64SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
2091*1c12ee1eSDan Willemsen	list := listv.List()
2092*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
2093*1c12ee1eSDan Willemsen		v := list.Get(i)
2094*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(uint64(v.Int()))
2095*1c12ee1eSDan Willemsen	}
2096*1c12ee1eSDan Willemsen	return size
2097*1c12ee1eSDan Willemsen}
2098*1c12ee1eSDan Willemsen
2099*1c12ee1eSDan Willemsen// appendInt64SliceValue encodes a []int64 value as a repeated Int64.
2100*1c12ee1eSDan Willemsenfunc appendInt64SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2101*1c12ee1eSDan Willemsen	list := listv.List()
2102*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
2103*1c12ee1eSDan Willemsen		v := list.Get(i)
2104*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
2105*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v.Int()))
2106*1c12ee1eSDan Willemsen	}
2107*1c12ee1eSDan Willemsen	return b, nil
2108*1c12ee1eSDan Willemsen}
2109*1c12ee1eSDan Willemsen
2110*1c12ee1eSDan Willemsen// consumeInt64SliceValue wire decodes a []int64 value as a repeated Int64.
2111*1c12ee1eSDan Willemsenfunc consumeInt64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
2112*1c12ee1eSDan Willemsen	list := listv.List()
2113*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
2114*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
2115*1c12ee1eSDan Willemsen		if n < 0 {
2116*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
2117*1c12ee1eSDan Willemsen		}
2118*1c12ee1eSDan Willemsen		for len(b) > 0 {
2119*1c12ee1eSDan Willemsen			var v uint64
2120*1c12ee1eSDan Willemsen			var n int
2121*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
2122*1c12ee1eSDan Willemsen				v = uint64(b[0])
2123*1c12ee1eSDan Willemsen				n = 1
2124*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
2125*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2126*1c12ee1eSDan Willemsen				n = 2
2127*1c12ee1eSDan Willemsen			} else {
2128*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
2129*1c12ee1eSDan Willemsen			}
2130*1c12ee1eSDan Willemsen			if n < 0 {
2131*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
2132*1c12ee1eSDan Willemsen			}
2133*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfInt64(int64(v)))
2134*1c12ee1eSDan Willemsen			b = b[n:]
2135*1c12ee1eSDan Willemsen		}
2136*1c12ee1eSDan Willemsen		out.n = n
2137*1c12ee1eSDan Willemsen		return listv, out, nil
2138*1c12ee1eSDan Willemsen	}
2139*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2140*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
2141*1c12ee1eSDan Willemsen	}
2142*1c12ee1eSDan Willemsen	var v uint64
2143*1c12ee1eSDan Willemsen	var n int
2144*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2145*1c12ee1eSDan Willemsen		v = uint64(b[0])
2146*1c12ee1eSDan Willemsen		n = 1
2147*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2148*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2149*1c12ee1eSDan Willemsen		n = 2
2150*1c12ee1eSDan Willemsen	} else {
2151*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2152*1c12ee1eSDan Willemsen	}
2153*1c12ee1eSDan Willemsen	if n < 0 {
2154*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
2155*1c12ee1eSDan Willemsen	}
2156*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfInt64(int64(v)))
2157*1c12ee1eSDan Willemsen	out.n = n
2158*1c12ee1eSDan Willemsen	return listv, out, nil
2159*1c12ee1eSDan Willemsen}
2160*1c12ee1eSDan Willemsen
2161*1c12ee1eSDan Willemsenvar coderInt64SliceValue = valueCoderFuncs{
2162*1c12ee1eSDan Willemsen	size:      sizeInt64SliceValue,
2163*1c12ee1eSDan Willemsen	marshal:   appendInt64SliceValue,
2164*1c12ee1eSDan Willemsen	unmarshal: consumeInt64SliceValue,
2165*1c12ee1eSDan Willemsen	merge:     mergeListValue,
2166*1c12ee1eSDan Willemsen}
2167*1c12ee1eSDan Willemsen
2168*1c12ee1eSDan Willemsen// sizeInt64PackedSliceValue returns the size of wire encoding a []int64 value as a packed repeated Int64.
2169*1c12ee1eSDan Willemsenfunc sizeInt64PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
2170*1c12ee1eSDan Willemsen	list := listv.List()
2171*1c12ee1eSDan Willemsen	llen := list.Len()
2172*1c12ee1eSDan Willemsen	if llen == 0 {
2173*1c12ee1eSDan Willemsen		return 0
2174*1c12ee1eSDan Willemsen	}
2175*1c12ee1eSDan Willemsen	n := 0
2176*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
2177*1c12ee1eSDan Willemsen		v := list.Get(i)
2178*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v.Int()))
2179*1c12ee1eSDan Willemsen	}
2180*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
2181*1c12ee1eSDan Willemsen}
2182*1c12ee1eSDan Willemsen
2183*1c12ee1eSDan Willemsen// appendInt64PackedSliceValue encodes a []int64 value as a packed repeated Int64.
2184*1c12ee1eSDan Willemsenfunc appendInt64PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2185*1c12ee1eSDan Willemsen	list := listv.List()
2186*1c12ee1eSDan Willemsen	llen := list.Len()
2187*1c12ee1eSDan Willemsen	if llen == 0 {
2188*1c12ee1eSDan Willemsen		return b, nil
2189*1c12ee1eSDan Willemsen	}
2190*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
2191*1c12ee1eSDan Willemsen	n := 0
2192*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
2193*1c12ee1eSDan Willemsen		v := list.Get(i)
2194*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(uint64(v.Int()))
2195*1c12ee1eSDan Willemsen	}
2196*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
2197*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
2198*1c12ee1eSDan Willemsen		v := list.Get(i)
2199*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, uint64(v.Int()))
2200*1c12ee1eSDan Willemsen	}
2201*1c12ee1eSDan Willemsen	return b, nil
2202*1c12ee1eSDan Willemsen}
2203*1c12ee1eSDan Willemsen
2204*1c12ee1eSDan Willemsenvar coderInt64PackedSliceValue = valueCoderFuncs{
2205*1c12ee1eSDan Willemsen	size:      sizeInt64PackedSliceValue,
2206*1c12ee1eSDan Willemsen	marshal:   appendInt64PackedSliceValue,
2207*1c12ee1eSDan Willemsen	unmarshal: consumeInt64SliceValue,
2208*1c12ee1eSDan Willemsen	merge:     mergeListValue,
2209*1c12ee1eSDan Willemsen}
2210*1c12ee1eSDan Willemsen
2211*1c12ee1eSDan Willemsen// sizeSint64 returns the size of wire encoding a int64 pointer as a Sint64.
2212*1c12ee1eSDan Willemsenfunc sizeSint64(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2213*1c12ee1eSDan Willemsen	v := *p.Int64()
2214*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
2215*1c12ee1eSDan Willemsen}
2216*1c12ee1eSDan Willemsen
2217*1c12ee1eSDan Willemsen// appendSint64 wire encodes a int64 pointer as a Sint64.
2218*1c12ee1eSDan Willemsenfunc appendSint64(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2219*1c12ee1eSDan Willemsen	v := *p.Int64()
2220*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2221*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
2222*1c12ee1eSDan Willemsen	return b, nil
2223*1c12ee1eSDan Willemsen}
2224*1c12ee1eSDan Willemsen
2225*1c12ee1eSDan Willemsen// consumeSint64 wire decodes a int64 pointer as a Sint64.
2226*1c12ee1eSDan Willemsenfunc consumeSint64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
2227*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2228*1c12ee1eSDan Willemsen		return out, errUnknown
2229*1c12ee1eSDan Willemsen	}
2230*1c12ee1eSDan Willemsen	var v uint64
2231*1c12ee1eSDan Willemsen	var n int
2232*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2233*1c12ee1eSDan Willemsen		v = uint64(b[0])
2234*1c12ee1eSDan Willemsen		n = 1
2235*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2236*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2237*1c12ee1eSDan Willemsen		n = 2
2238*1c12ee1eSDan Willemsen	} else {
2239*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2240*1c12ee1eSDan Willemsen	}
2241*1c12ee1eSDan Willemsen	if n < 0 {
2242*1c12ee1eSDan Willemsen		return out, errDecode
2243*1c12ee1eSDan Willemsen	}
2244*1c12ee1eSDan Willemsen	*p.Int64() = protowire.DecodeZigZag(v)
2245*1c12ee1eSDan Willemsen	out.n = n
2246*1c12ee1eSDan Willemsen	return out, nil
2247*1c12ee1eSDan Willemsen}
2248*1c12ee1eSDan Willemsen
2249*1c12ee1eSDan Willemsenvar coderSint64 = pointerCoderFuncs{
2250*1c12ee1eSDan Willemsen	size:      sizeSint64,
2251*1c12ee1eSDan Willemsen	marshal:   appendSint64,
2252*1c12ee1eSDan Willemsen	unmarshal: consumeSint64,
2253*1c12ee1eSDan Willemsen	merge:     mergeInt64,
2254*1c12ee1eSDan Willemsen}
2255*1c12ee1eSDan Willemsen
2256*1c12ee1eSDan Willemsen// sizeSint64NoZero returns the size of wire encoding a int64 pointer as a Sint64.
2257*1c12ee1eSDan Willemsen// The zero value is not encoded.
2258*1c12ee1eSDan Willemsenfunc sizeSint64NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2259*1c12ee1eSDan Willemsen	v := *p.Int64()
2260*1c12ee1eSDan Willemsen	if v == 0 {
2261*1c12ee1eSDan Willemsen		return 0
2262*1c12ee1eSDan Willemsen	}
2263*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
2264*1c12ee1eSDan Willemsen}
2265*1c12ee1eSDan Willemsen
2266*1c12ee1eSDan Willemsen// appendSint64NoZero wire encodes a int64 pointer as a Sint64.
2267*1c12ee1eSDan Willemsen// The zero value is not encoded.
2268*1c12ee1eSDan Willemsenfunc appendSint64NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2269*1c12ee1eSDan Willemsen	v := *p.Int64()
2270*1c12ee1eSDan Willemsen	if v == 0 {
2271*1c12ee1eSDan Willemsen		return b, nil
2272*1c12ee1eSDan Willemsen	}
2273*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2274*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
2275*1c12ee1eSDan Willemsen	return b, nil
2276*1c12ee1eSDan Willemsen}
2277*1c12ee1eSDan Willemsen
2278*1c12ee1eSDan Willemsenvar coderSint64NoZero = pointerCoderFuncs{
2279*1c12ee1eSDan Willemsen	size:      sizeSint64NoZero,
2280*1c12ee1eSDan Willemsen	marshal:   appendSint64NoZero,
2281*1c12ee1eSDan Willemsen	unmarshal: consumeSint64,
2282*1c12ee1eSDan Willemsen	merge:     mergeInt64NoZero,
2283*1c12ee1eSDan Willemsen}
2284*1c12ee1eSDan Willemsen
2285*1c12ee1eSDan Willemsen// sizeSint64Ptr returns the size of wire encoding a *int64 pointer as a Sint64.
2286*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
2287*1c12ee1eSDan Willemsenfunc sizeSint64Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2288*1c12ee1eSDan Willemsen	v := **p.Int64Ptr()
2289*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
2290*1c12ee1eSDan Willemsen}
2291*1c12ee1eSDan Willemsen
2292*1c12ee1eSDan Willemsen// appendSint64Ptr wire encodes a *int64 pointer as a Sint64.
2293*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
2294*1c12ee1eSDan Willemsenfunc appendSint64Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2295*1c12ee1eSDan Willemsen	v := **p.Int64Ptr()
2296*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2297*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
2298*1c12ee1eSDan Willemsen	return b, nil
2299*1c12ee1eSDan Willemsen}
2300*1c12ee1eSDan Willemsen
2301*1c12ee1eSDan Willemsen// consumeSint64Ptr wire decodes a *int64 pointer as a Sint64.
2302*1c12ee1eSDan Willemsenfunc consumeSint64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
2303*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2304*1c12ee1eSDan Willemsen		return out, errUnknown
2305*1c12ee1eSDan Willemsen	}
2306*1c12ee1eSDan Willemsen	var v uint64
2307*1c12ee1eSDan Willemsen	var n int
2308*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2309*1c12ee1eSDan Willemsen		v = uint64(b[0])
2310*1c12ee1eSDan Willemsen		n = 1
2311*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2312*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2313*1c12ee1eSDan Willemsen		n = 2
2314*1c12ee1eSDan Willemsen	} else {
2315*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2316*1c12ee1eSDan Willemsen	}
2317*1c12ee1eSDan Willemsen	if n < 0 {
2318*1c12ee1eSDan Willemsen		return out, errDecode
2319*1c12ee1eSDan Willemsen	}
2320*1c12ee1eSDan Willemsen	vp := p.Int64Ptr()
2321*1c12ee1eSDan Willemsen	if *vp == nil {
2322*1c12ee1eSDan Willemsen		*vp = new(int64)
2323*1c12ee1eSDan Willemsen	}
2324*1c12ee1eSDan Willemsen	**vp = protowire.DecodeZigZag(v)
2325*1c12ee1eSDan Willemsen	out.n = n
2326*1c12ee1eSDan Willemsen	return out, nil
2327*1c12ee1eSDan Willemsen}
2328*1c12ee1eSDan Willemsen
2329*1c12ee1eSDan Willemsenvar coderSint64Ptr = pointerCoderFuncs{
2330*1c12ee1eSDan Willemsen	size:      sizeSint64Ptr,
2331*1c12ee1eSDan Willemsen	marshal:   appendSint64Ptr,
2332*1c12ee1eSDan Willemsen	unmarshal: consumeSint64Ptr,
2333*1c12ee1eSDan Willemsen	merge:     mergeInt64Ptr,
2334*1c12ee1eSDan Willemsen}
2335*1c12ee1eSDan Willemsen
2336*1c12ee1eSDan Willemsen// sizeSint64Slice returns the size of wire encoding a []int64 pointer as a repeated Sint64.
2337*1c12ee1eSDan Willemsenfunc sizeSint64Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2338*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
2339*1c12ee1eSDan Willemsen	for _, v := range s {
2340*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
2341*1c12ee1eSDan Willemsen	}
2342*1c12ee1eSDan Willemsen	return size
2343*1c12ee1eSDan Willemsen}
2344*1c12ee1eSDan Willemsen
2345*1c12ee1eSDan Willemsen// appendSint64Slice encodes a []int64 pointer as a repeated Sint64.
2346*1c12ee1eSDan Willemsenfunc appendSint64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2347*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
2348*1c12ee1eSDan Willemsen	for _, v := range s {
2349*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
2350*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
2351*1c12ee1eSDan Willemsen	}
2352*1c12ee1eSDan Willemsen	return b, nil
2353*1c12ee1eSDan Willemsen}
2354*1c12ee1eSDan Willemsen
2355*1c12ee1eSDan Willemsen// consumeSint64Slice wire decodes a []int64 pointer as a repeated Sint64.
2356*1c12ee1eSDan Willemsenfunc consumeSint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
2357*1c12ee1eSDan Willemsen	sp := p.Int64Slice()
2358*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
2359*1c12ee1eSDan Willemsen		s := *sp
2360*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
2361*1c12ee1eSDan Willemsen		if n < 0 {
2362*1c12ee1eSDan Willemsen			return out, errDecode
2363*1c12ee1eSDan Willemsen		}
2364*1c12ee1eSDan Willemsen		for len(b) > 0 {
2365*1c12ee1eSDan Willemsen			var v uint64
2366*1c12ee1eSDan Willemsen			var n int
2367*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
2368*1c12ee1eSDan Willemsen				v = uint64(b[0])
2369*1c12ee1eSDan Willemsen				n = 1
2370*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
2371*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2372*1c12ee1eSDan Willemsen				n = 2
2373*1c12ee1eSDan Willemsen			} else {
2374*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
2375*1c12ee1eSDan Willemsen			}
2376*1c12ee1eSDan Willemsen			if n < 0 {
2377*1c12ee1eSDan Willemsen				return out, errDecode
2378*1c12ee1eSDan Willemsen			}
2379*1c12ee1eSDan Willemsen			s = append(s, protowire.DecodeZigZag(v))
2380*1c12ee1eSDan Willemsen			b = b[n:]
2381*1c12ee1eSDan Willemsen		}
2382*1c12ee1eSDan Willemsen		*sp = s
2383*1c12ee1eSDan Willemsen		out.n = n
2384*1c12ee1eSDan Willemsen		return out, nil
2385*1c12ee1eSDan Willemsen	}
2386*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2387*1c12ee1eSDan Willemsen		return out, errUnknown
2388*1c12ee1eSDan Willemsen	}
2389*1c12ee1eSDan Willemsen	var v uint64
2390*1c12ee1eSDan Willemsen	var n int
2391*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2392*1c12ee1eSDan Willemsen		v = uint64(b[0])
2393*1c12ee1eSDan Willemsen		n = 1
2394*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2395*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2396*1c12ee1eSDan Willemsen		n = 2
2397*1c12ee1eSDan Willemsen	} else {
2398*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2399*1c12ee1eSDan Willemsen	}
2400*1c12ee1eSDan Willemsen	if n < 0 {
2401*1c12ee1eSDan Willemsen		return out, errDecode
2402*1c12ee1eSDan Willemsen	}
2403*1c12ee1eSDan Willemsen	*sp = append(*sp, protowire.DecodeZigZag(v))
2404*1c12ee1eSDan Willemsen	out.n = n
2405*1c12ee1eSDan Willemsen	return out, nil
2406*1c12ee1eSDan Willemsen}
2407*1c12ee1eSDan Willemsen
2408*1c12ee1eSDan Willemsenvar coderSint64Slice = pointerCoderFuncs{
2409*1c12ee1eSDan Willemsen	size:      sizeSint64Slice,
2410*1c12ee1eSDan Willemsen	marshal:   appendSint64Slice,
2411*1c12ee1eSDan Willemsen	unmarshal: consumeSint64Slice,
2412*1c12ee1eSDan Willemsen	merge:     mergeInt64Slice,
2413*1c12ee1eSDan Willemsen}
2414*1c12ee1eSDan Willemsen
2415*1c12ee1eSDan Willemsen// sizeSint64PackedSlice returns the size of wire encoding a []int64 pointer as a packed repeated Sint64.
2416*1c12ee1eSDan Willemsenfunc sizeSint64PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2417*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
2418*1c12ee1eSDan Willemsen	if len(s) == 0 {
2419*1c12ee1eSDan Willemsen		return 0
2420*1c12ee1eSDan Willemsen	}
2421*1c12ee1eSDan Willemsen	n := 0
2422*1c12ee1eSDan Willemsen	for _, v := range s {
2423*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(v))
2424*1c12ee1eSDan Willemsen	}
2425*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
2426*1c12ee1eSDan Willemsen}
2427*1c12ee1eSDan Willemsen
2428*1c12ee1eSDan Willemsen// appendSint64PackedSlice encodes a []int64 pointer as a packed repeated Sint64.
2429*1c12ee1eSDan Willemsenfunc appendSint64PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2430*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
2431*1c12ee1eSDan Willemsen	if len(s) == 0 {
2432*1c12ee1eSDan Willemsen		return b, nil
2433*1c12ee1eSDan Willemsen	}
2434*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2435*1c12ee1eSDan Willemsen	n := 0
2436*1c12ee1eSDan Willemsen	for _, v := range s {
2437*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(v))
2438*1c12ee1eSDan Willemsen	}
2439*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
2440*1c12ee1eSDan Willemsen	for _, v := range s {
2441*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
2442*1c12ee1eSDan Willemsen	}
2443*1c12ee1eSDan Willemsen	return b, nil
2444*1c12ee1eSDan Willemsen}
2445*1c12ee1eSDan Willemsen
2446*1c12ee1eSDan Willemsenvar coderSint64PackedSlice = pointerCoderFuncs{
2447*1c12ee1eSDan Willemsen	size:      sizeSint64PackedSlice,
2448*1c12ee1eSDan Willemsen	marshal:   appendSint64PackedSlice,
2449*1c12ee1eSDan Willemsen	unmarshal: consumeSint64Slice,
2450*1c12ee1eSDan Willemsen	merge:     mergeInt64Slice,
2451*1c12ee1eSDan Willemsen}
2452*1c12ee1eSDan Willemsen
2453*1c12ee1eSDan Willemsen// sizeSint64Value returns the size of wire encoding a int64 value as a Sint64.
2454*1c12ee1eSDan Willemsenfunc sizeSint64Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
2455*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
2456*1c12ee1eSDan Willemsen}
2457*1c12ee1eSDan Willemsen
2458*1c12ee1eSDan Willemsen// appendSint64Value encodes a int64 value as a Sint64.
2459*1c12ee1eSDan Willemsenfunc appendSint64Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2460*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
2461*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
2462*1c12ee1eSDan Willemsen	return b, nil
2463*1c12ee1eSDan Willemsen}
2464*1c12ee1eSDan Willemsen
2465*1c12ee1eSDan Willemsen// consumeSint64Value decodes a int64 value as a Sint64.
2466*1c12ee1eSDan Willemsenfunc consumeSint64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
2467*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2468*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
2469*1c12ee1eSDan Willemsen	}
2470*1c12ee1eSDan Willemsen	var v uint64
2471*1c12ee1eSDan Willemsen	var n int
2472*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2473*1c12ee1eSDan Willemsen		v = uint64(b[0])
2474*1c12ee1eSDan Willemsen		n = 1
2475*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2476*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2477*1c12ee1eSDan Willemsen		n = 2
2478*1c12ee1eSDan Willemsen	} else {
2479*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2480*1c12ee1eSDan Willemsen	}
2481*1c12ee1eSDan Willemsen	if n < 0 {
2482*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
2483*1c12ee1eSDan Willemsen	}
2484*1c12ee1eSDan Willemsen	out.n = n
2485*1c12ee1eSDan Willemsen	return protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)), out, nil
2486*1c12ee1eSDan Willemsen}
2487*1c12ee1eSDan Willemsen
2488*1c12ee1eSDan Willemsenvar coderSint64Value = valueCoderFuncs{
2489*1c12ee1eSDan Willemsen	size:      sizeSint64Value,
2490*1c12ee1eSDan Willemsen	marshal:   appendSint64Value,
2491*1c12ee1eSDan Willemsen	unmarshal: consumeSint64Value,
2492*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
2493*1c12ee1eSDan Willemsen}
2494*1c12ee1eSDan Willemsen
2495*1c12ee1eSDan Willemsen// sizeSint64SliceValue returns the size of wire encoding a []int64 value as a repeated Sint64.
2496*1c12ee1eSDan Willemsenfunc sizeSint64SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
2497*1c12ee1eSDan Willemsen	list := listv.List()
2498*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
2499*1c12ee1eSDan Willemsen		v := list.Get(i)
2500*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
2501*1c12ee1eSDan Willemsen	}
2502*1c12ee1eSDan Willemsen	return size
2503*1c12ee1eSDan Willemsen}
2504*1c12ee1eSDan Willemsen
2505*1c12ee1eSDan Willemsen// appendSint64SliceValue encodes a []int64 value as a repeated Sint64.
2506*1c12ee1eSDan Willemsenfunc appendSint64SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2507*1c12ee1eSDan Willemsen	list := listv.List()
2508*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
2509*1c12ee1eSDan Willemsen		v := list.Get(i)
2510*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
2511*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
2512*1c12ee1eSDan Willemsen	}
2513*1c12ee1eSDan Willemsen	return b, nil
2514*1c12ee1eSDan Willemsen}
2515*1c12ee1eSDan Willemsen
2516*1c12ee1eSDan Willemsen// consumeSint64SliceValue wire decodes a []int64 value as a repeated Sint64.
2517*1c12ee1eSDan Willemsenfunc consumeSint64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
2518*1c12ee1eSDan Willemsen	list := listv.List()
2519*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
2520*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
2521*1c12ee1eSDan Willemsen		if n < 0 {
2522*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
2523*1c12ee1eSDan Willemsen		}
2524*1c12ee1eSDan Willemsen		for len(b) > 0 {
2525*1c12ee1eSDan Willemsen			var v uint64
2526*1c12ee1eSDan Willemsen			var n int
2527*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
2528*1c12ee1eSDan Willemsen				v = uint64(b[0])
2529*1c12ee1eSDan Willemsen				n = 1
2530*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
2531*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2532*1c12ee1eSDan Willemsen				n = 2
2533*1c12ee1eSDan Willemsen			} else {
2534*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
2535*1c12ee1eSDan Willemsen			}
2536*1c12ee1eSDan Willemsen			if n < 0 {
2537*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
2538*1c12ee1eSDan Willemsen			}
2539*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)))
2540*1c12ee1eSDan Willemsen			b = b[n:]
2541*1c12ee1eSDan Willemsen		}
2542*1c12ee1eSDan Willemsen		out.n = n
2543*1c12ee1eSDan Willemsen		return listv, out, nil
2544*1c12ee1eSDan Willemsen	}
2545*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2546*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
2547*1c12ee1eSDan Willemsen	}
2548*1c12ee1eSDan Willemsen	var v uint64
2549*1c12ee1eSDan Willemsen	var n int
2550*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2551*1c12ee1eSDan Willemsen		v = uint64(b[0])
2552*1c12ee1eSDan Willemsen		n = 1
2553*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2554*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2555*1c12ee1eSDan Willemsen		n = 2
2556*1c12ee1eSDan Willemsen	} else {
2557*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2558*1c12ee1eSDan Willemsen	}
2559*1c12ee1eSDan Willemsen	if n < 0 {
2560*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
2561*1c12ee1eSDan Willemsen	}
2562*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)))
2563*1c12ee1eSDan Willemsen	out.n = n
2564*1c12ee1eSDan Willemsen	return listv, out, nil
2565*1c12ee1eSDan Willemsen}
2566*1c12ee1eSDan Willemsen
2567*1c12ee1eSDan Willemsenvar coderSint64SliceValue = valueCoderFuncs{
2568*1c12ee1eSDan Willemsen	size:      sizeSint64SliceValue,
2569*1c12ee1eSDan Willemsen	marshal:   appendSint64SliceValue,
2570*1c12ee1eSDan Willemsen	unmarshal: consumeSint64SliceValue,
2571*1c12ee1eSDan Willemsen	merge:     mergeListValue,
2572*1c12ee1eSDan Willemsen}
2573*1c12ee1eSDan Willemsen
2574*1c12ee1eSDan Willemsen// sizeSint64PackedSliceValue returns the size of wire encoding a []int64 value as a packed repeated Sint64.
2575*1c12ee1eSDan Willemsenfunc sizeSint64PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
2576*1c12ee1eSDan Willemsen	list := listv.List()
2577*1c12ee1eSDan Willemsen	llen := list.Len()
2578*1c12ee1eSDan Willemsen	if llen == 0 {
2579*1c12ee1eSDan Willemsen		return 0
2580*1c12ee1eSDan Willemsen	}
2581*1c12ee1eSDan Willemsen	n := 0
2582*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
2583*1c12ee1eSDan Willemsen		v := list.Get(i)
2584*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
2585*1c12ee1eSDan Willemsen	}
2586*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
2587*1c12ee1eSDan Willemsen}
2588*1c12ee1eSDan Willemsen
2589*1c12ee1eSDan Willemsen// appendSint64PackedSliceValue encodes a []int64 value as a packed repeated Sint64.
2590*1c12ee1eSDan Willemsenfunc appendSint64PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2591*1c12ee1eSDan Willemsen	list := listv.List()
2592*1c12ee1eSDan Willemsen	llen := list.Len()
2593*1c12ee1eSDan Willemsen	if llen == 0 {
2594*1c12ee1eSDan Willemsen		return b, nil
2595*1c12ee1eSDan Willemsen	}
2596*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
2597*1c12ee1eSDan Willemsen	n := 0
2598*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
2599*1c12ee1eSDan Willemsen		v := list.Get(i)
2600*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
2601*1c12ee1eSDan Willemsen	}
2602*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
2603*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
2604*1c12ee1eSDan Willemsen		v := list.Get(i)
2605*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
2606*1c12ee1eSDan Willemsen	}
2607*1c12ee1eSDan Willemsen	return b, nil
2608*1c12ee1eSDan Willemsen}
2609*1c12ee1eSDan Willemsen
2610*1c12ee1eSDan Willemsenvar coderSint64PackedSliceValue = valueCoderFuncs{
2611*1c12ee1eSDan Willemsen	size:      sizeSint64PackedSliceValue,
2612*1c12ee1eSDan Willemsen	marshal:   appendSint64PackedSliceValue,
2613*1c12ee1eSDan Willemsen	unmarshal: consumeSint64SliceValue,
2614*1c12ee1eSDan Willemsen	merge:     mergeListValue,
2615*1c12ee1eSDan Willemsen}
2616*1c12ee1eSDan Willemsen
2617*1c12ee1eSDan Willemsen// sizeUint64 returns the size of wire encoding a uint64 pointer as a Uint64.
2618*1c12ee1eSDan Willemsenfunc sizeUint64(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2619*1c12ee1eSDan Willemsen	v := *p.Uint64()
2620*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(v)
2621*1c12ee1eSDan Willemsen}
2622*1c12ee1eSDan Willemsen
2623*1c12ee1eSDan Willemsen// appendUint64 wire encodes a uint64 pointer as a Uint64.
2624*1c12ee1eSDan Willemsenfunc appendUint64(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2625*1c12ee1eSDan Willemsen	v := *p.Uint64()
2626*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2627*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, v)
2628*1c12ee1eSDan Willemsen	return b, nil
2629*1c12ee1eSDan Willemsen}
2630*1c12ee1eSDan Willemsen
2631*1c12ee1eSDan Willemsen// consumeUint64 wire decodes a uint64 pointer as a Uint64.
2632*1c12ee1eSDan Willemsenfunc consumeUint64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
2633*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2634*1c12ee1eSDan Willemsen		return out, errUnknown
2635*1c12ee1eSDan Willemsen	}
2636*1c12ee1eSDan Willemsen	var v uint64
2637*1c12ee1eSDan Willemsen	var n int
2638*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2639*1c12ee1eSDan Willemsen		v = uint64(b[0])
2640*1c12ee1eSDan Willemsen		n = 1
2641*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2642*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2643*1c12ee1eSDan Willemsen		n = 2
2644*1c12ee1eSDan Willemsen	} else {
2645*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2646*1c12ee1eSDan Willemsen	}
2647*1c12ee1eSDan Willemsen	if n < 0 {
2648*1c12ee1eSDan Willemsen		return out, errDecode
2649*1c12ee1eSDan Willemsen	}
2650*1c12ee1eSDan Willemsen	*p.Uint64() = v
2651*1c12ee1eSDan Willemsen	out.n = n
2652*1c12ee1eSDan Willemsen	return out, nil
2653*1c12ee1eSDan Willemsen}
2654*1c12ee1eSDan Willemsen
2655*1c12ee1eSDan Willemsenvar coderUint64 = pointerCoderFuncs{
2656*1c12ee1eSDan Willemsen	size:      sizeUint64,
2657*1c12ee1eSDan Willemsen	marshal:   appendUint64,
2658*1c12ee1eSDan Willemsen	unmarshal: consumeUint64,
2659*1c12ee1eSDan Willemsen	merge:     mergeUint64,
2660*1c12ee1eSDan Willemsen}
2661*1c12ee1eSDan Willemsen
2662*1c12ee1eSDan Willemsen// sizeUint64NoZero returns the size of wire encoding a uint64 pointer as a Uint64.
2663*1c12ee1eSDan Willemsen// The zero value is not encoded.
2664*1c12ee1eSDan Willemsenfunc sizeUint64NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2665*1c12ee1eSDan Willemsen	v := *p.Uint64()
2666*1c12ee1eSDan Willemsen	if v == 0 {
2667*1c12ee1eSDan Willemsen		return 0
2668*1c12ee1eSDan Willemsen	}
2669*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(v)
2670*1c12ee1eSDan Willemsen}
2671*1c12ee1eSDan Willemsen
2672*1c12ee1eSDan Willemsen// appendUint64NoZero wire encodes a uint64 pointer as a Uint64.
2673*1c12ee1eSDan Willemsen// The zero value is not encoded.
2674*1c12ee1eSDan Willemsenfunc appendUint64NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2675*1c12ee1eSDan Willemsen	v := *p.Uint64()
2676*1c12ee1eSDan Willemsen	if v == 0 {
2677*1c12ee1eSDan Willemsen		return b, nil
2678*1c12ee1eSDan Willemsen	}
2679*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2680*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, v)
2681*1c12ee1eSDan Willemsen	return b, nil
2682*1c12ee1eSDan Willemsen}
2683*1c12ee1eSDan Willemsen
2684*1c12ee1eSDan Willemsenvar coderUint64NoZero = pointerCoderFuncs{
2685*1c12ee1eSDan Willemsen	size:      sizeUint64NoZero,
2686*1c12ee1eSDan Willemsen	marshal:   appendUint64NoZero,
2687*1c12ee1eSDan Willemsen	unmarshal: consumeUint64,
2688*1c12ee1eSDan Willemsen	merge:     mergeUint64NoZero,
2689*1c12ee1eSDan Willemsen}
2690*1c12ee1eSDan Willemsen
2691*1c12ee1eSDan Willemsen// sizeUint64Ptr returns the size of wire encoding a *uint64 pointer as a Uint64.
2692*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
2693*1c12ee1eSDan Willemsenfunc sizeUint64Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2694*1c12ee1eSDan Willemsen	v := **p.Uint64Ptr()
2695*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeVarint(v)
2696*1c12ee1eSDan Willemsen}
2697*1c12ee1eSDan Willemsen
2698*1c12ee1eSDan Willemsen// appendUint64Ptr wire encodes a *uint64 pointer as a Uint64.
2699*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
2700*1c12ee1eSDan Willemsenfunc appendUint64Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2701*1c12ee1eSDan Willemsen	v := **p.Uint64Ptr()
2702*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2703*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, v)
2704*1c12ee1eSDan Willemsen	return b, nil
2705*1c12ee1eSDan Willemsen}
2706*1c12ee1eSDan Willemsen
2707*1c12ee1eSDan Willemsen// consumeUint64Ptr wire decodes a *uint64 pointer as a Uint64.
2708*1c12ee1eSDan Willemsenfunc consumeUint64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
2709*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2710*1c12ee1eSDan Willemsen		return out, errUnknown
2711*1c12ee1eSDan Willemsen	}
2712*1c12ee1eSDan Willemsen	var v uint64
2713*1c12ee1eSDan Willemsen	var n int
2714*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2715*1c12ee1eSDan Willemsen		v = uint64(b[0])
2716*1c12ee1eSDan Willemsen		n = 1
2717*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2718*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2719*1c12ee1eSDan Willemsen		n = 2
2720*1c12ee1eSDan Willemsen	} else {
2721*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2722*1c12ee1eSDan Willemsen	}
2723*1c12ee1eSDan Willemsen	if n < 0 {
2724*1c12ee1eSDan Willemsen		return out, errDecode
2725*1c12ee1eSDan Willemsen	}
2726*1c12ee1eSDan Willemsen	vp := p.Uint64Ptr()
2727*1c12ee1eSDan Willemsen	if *vp == nil {
2728*1c12ee1eSDan Willemsen		*vp = new(uint64)
2729*1c12ee1eSDan Willemsen	}
2730*1c12ee1eSDan Willemsen	**vp = v
2731*1c12ee1eSDan Willemsen	out.n = n
2732*1c12ee1eSDan Willemsen	return out, nil
2733*1c12ee1eSDan Willemsen}
2734*1c12ee1eSDan Willemsen
2735*1c12ee1eSDan Willemsenvar coderUint64Ptr = pointerCoderFuncs{
2736*1c12ee1eSDan Willemsen	size:      sizeUint64Ptr,
2737*1c12ee1eSDan Willemsen	marshal:   appendUint64Ptr,
2738*1c12ee1eSDan Willemsen	unmarshal: consumeUint64Ptr,
2739*1c12ee1eSDan Willemsen	merge:     mergeUint64Ptr,
2740*1c12ee1eSDan Willemsen}
2741*1c12ee1eSDan Willemsen
2742*1c12ee1eSDan Willemsen// sizeUint64Slice returns the size of wire encoding a []uint64 pointer as a repeated Uint64.
2743*1c12ee1eSDan Willemsenfunc sizeUint64Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2744*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
2745*1c12ee1eSDan Willemsen	for _, v := range s {
2746*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeVarint(v)
2747*1c12ee1eSDan Willemsen	}
2748*1c12ee1eSDan Willemsen	return size
2749*1c12ee1eSDan Willemsen}
2750*1c12ee1eSDan Willemsen
2751*1c12ee1eSDan Willemsen// appendUint64Slice encodes a []uint64 pointer as a repeated Uint64.
2752*1c12ee1eSDan Willemsenfunc appendUint64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2753*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
2754*1c12ee1eSDan Willemsen	for _, v := range s {
2755*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
2756*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, v)
2757*1c12ee1eSDan Willemsen	}
2758*1c12ee1eSDan Willemsen	return b, nil
2759*1c12ee1eSDan Willemsen}
2760*1c12ee1eSDan Willemsen
2761*1c12ee1eSDan Willemsen// consumeUint64Slice wire decodes a []uint64 pointer as a repeated Uint64.
2762*1c12ee1eSDan Willemsenfunc consumeUint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
2763*1c12ee1eSDan Willemsen	sp := p.Uint64Slice()
2764*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
2765*1c12ee1eSDan Willemsen		s := *sp
2766*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
2767*1c12ee1eSDan Willemsen		if n < 0 {
2768*1c12ee1eSDan Willemsen			return out, errDecode
2769*1c12ee1eSDan Willemsen		}
2770*1c12ee1eSDan Willemsen		for len(b) > 0 {
2771*1c12ee1eSDan Willemsen			var v uint64
2772*1c12ee1eSDan Willemsen			var n int
2773*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
2774*1c12ee1eSDan Willemsen				v = uint64(b[0])
2775*1c12ee1eSDan Willemsen				n = 1
2776*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
2777*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2778*1c12ee1eSDan Willemsen				n = 2
2779*1c12ee1eSDan Willemsen			} else {
2780*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
2781*1c12ee1eSDan Willemsen			}
2782*1c12ee1eSDan Willemsen			if n < 0 {
2783*1c12ee1eSDan Willemsen				return out, errDecode
2784*1c12ee1eSDan Willemsen			}
2785*1c12ee1eSDan Willemsen			s = append(s, v)
2786*1c12ee1eSDan Willemsen			b = b[n:]
2787*1c12ee1eSDan Willemsen		}
2788*1c12ee1eSDan Willemsen		*sp = s
2789*1c12ee1eSDan Willemsen		out.n = n
2790*1c12ee1eSDan Willemsen		return out, nil
2791*1c12ee1eSDan Willemsen	}
2792*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2793*1c12ee1eSDan Willemsen		return out, errUnknown
2794*1c12ee1eSDan Willemsen	}
2795*1c12ee1eSDan Willemsen	var v uint64
2796*1c12ee1eSDan Willemsen	var n int
2797*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2798*1c12ee1eSDan Willemsen		v = uint64(b[0])
2799*1c12ee1eSDan Willemsen		n = 1
2800*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2801*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2802*1c12ee1eSDan Willemsen		n = 2
2803*1c12ee1eSDan Willemsen	} else {
2804*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2805*1c12ee1eSDan Willemsen	}
2806*1c12ee1eSDan Willemsen	if n < 0 {
2807*1c12ee1eSDan Willemsen		return out, errDecode
2808*1c12ee1eSDan Willemsen	}
2809*1c12ee1eSDan Willemsen	*sp = append(*sp, v)
2810*1c12ee1eSDan Willemsen	out.n = n
2811*1c12ee1eSDan Willemsen	return out, nil
2812*1c12ee1eSDan Willemsen}
2813*1c12ee1eSDan Willemsen
2814*1c12ee1eSDan Willemsenvar coderUint64Slice = pointerCoderFuncs{
2815*1c12ee1eSDan Willemsen	size:      sizeUint64Slice,
2816*1c12ee1eSDan Willemsen	marshal:   appendUint64Slice,
2817*1c12ee1eSDan Willemsen	unmarshal: consumeUint64Slice,
2818*1c12ee1eSDan Willemsen	merge:     mergeUint64Slice,
2819*1c12ee1eSDan Willemsen}
2820*1c12ee1eSDan Willemsen
2821*1c12ee1eSDan Willemsen// sizeUint64PackedSlice returns the size of wire encoding a []uint64 pointer as a packed repeated Uint64.
2822*1c12ee1eSDan Willemsenfunc sizeUint64PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
2823*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
2824*1c12ee1eSDan Willemsen	if len(s) == 0 {
2825*1c12ee1eSDan Willemsen		return 0
2826*1c12ee1eSDan Willemsen	}
2827*1c12ee1eSDan Willemsen	n := 0
2828*1c12ee1eSDan Willemsen	for _, v := range s {
2829*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(v)
2830*1c12ee1eSDan Willemsen	}
2831*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
2832*1c12ee1eSDan Willemsen}
2833*1c12ee1eSDan Willemsen
2834*1c12ee1eSDan Willemsen// appendUint64PackedSlice encodes a []uint64 pointer as a packed repeated Uint64.
2835*1c12ee1eSDan Willemsenfunc appendUint64PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
2836*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
2837*1c12ee1eSDan Willemsen	if len(s) == 0 {
2838*1c12ee1eSDan Willemsen		return b, nil
2839*1c12ee1eSDan Willemsen	}
2840*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
2841*1c12ee1eSDan Willemsen	n := 0
2842*1c12ee1eSDan Willemsen	for _, v := range s {
2843*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(v)
2844*1c12ee1eSDan Willemsen	}
2845*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
2846*1c12ee1eSDan Willemsen	for _, v := range s {
2847*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, v)
2848*1c12ee1eSDan Willemsen	}
2849*1c12ee1eSDan Willemsen	return b, nil
2850*1c12ee1eSDan Willemsen}
2851*1c12ee1eSDan Willemsen
2852*1c12ee1eSDan Willemsenvar coderUint64PackedSlice = pointerCoderFuncs{
2853*1c12ee1eSDan Willemsen	size:      sizeUint64PackedSlice,
2854*1c12ee1eSDan Willemsen	marshal:   appendUint64PackedSlice,
2855*1c12ee1eSDan Willemsen	unmarshal: consumeUint64Slice,
2856*1c12ee1eSDan Willemsen	merge:     mergeUint64Slice,
2857*1c12ee1eSDan Willemsen}
2858*1c12ee1eSDan Willemsen
2859*1c12ee1eSDan Willemsen// sizeUint64Value returns the size of wire encoding a uint64 value as a Uint64.
2860*1c12ee1eSDan Willemsenfunc sizeUint64Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
2861*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeVarint(v.Uint())
2862*1c12ee1eSDan Willemsen}
2863*1c12ee1eSDan Willemsen
2864*1c12ee1eSDan Willemsen// appendUint64Value encodes a uint64 value as a Uint64.
2865*1c12ee1eSDan Willemsenfunc appendUint64Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2866*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
2867*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, v.Uint())
2868*1c12ee1eSDan Willemsen	return b, nil
2869*1c12ee1eSDan Willemsen}
2870*1c12ee1eSDan Willemsen
2871*1c12ee1eSDan Willemsen// consumeUint64Value decodes a uint64 value as a Uint64.
2872*1c12ee1eSDan Willemsenfunc consumeUint64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
2873*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2874*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
2875*1c12ee1eSDan Willemsen	}
2876*1c12ee1eSDan Willemsen	var v uint64
2877*1c12ee1eSDan Willemsen	var n int
2878*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2879*1c12ee1eSDan Willemsen		v = uint64(b[0])
2880*1c12ee1eSDan Willemsen		n = 1
2881*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2882*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2883*1c12ee1eSDan Willemsen		n = 2
2884*1c12ee1eSDan Willemsen	} else {
2885*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2886*1c12ee1eSDan Willemsen	}
2887*1c12ee1eSDan Willemsen	if n < 0 {
2888*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
2889*1c12ee1eSDan Willemsen	}
2890*1c12ee1eSDan Willemsen	out.n = n
2891*1c12ee1eSDan Willemsen	return protoreflect.ValueOfUint64(v), out, nil
2892*1c12ee1eSDan Willemsen}
2893*1c12ee1eSDan Willemsen
2894*1c12ee1eSDan Willemsenvar coderUint64Value = valueCoderFuncs{
2895*1c12ee1eSDan Willemsen	size:      sizeUint64Value,
2896*1c12ee1eSDan Willemsen	marshal:   appendUint64Value,
2897*1c12ee1eSDan Willemsen	unmarshal: consumeUint64Value,
2898*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
2899*1c12ee1eSDan Willemsen}
2900*1c12ee1eSDan Willemsen
2901*1c12ee1eSDan Willemsen// sizeUint64SliceValue returns the size of wire encoding a []uint64 value as a repeated Uint64.
2902*1c12ee1eSDan Willemsenfunc sizeUint64SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
2903*1c12ee1eSDan Willemsen	list := listv.List()
2904*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
2905*1c12ee1eSDan Willemsen		v := list.Get(i)
2906*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeVarint(v.Uint())
2907*1c12ee1eSDan Willemsen	}
2908*1c12ee1eSDan Willemsen	return size
2909*1c12ee1eSDan Willemsen}
2910*1c12ee1eSDan Willemsen
2911*1c12ee1eSDan Willemsen// appendUint64SliceValue encodes a []uint64 value as a repeated Uint64.
2912*1c12ee1eSDan Willemsenfunc appendUint64SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2913*1c12ee1eSDan Willemsen	list := listv.List()
2914*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
2915*1c12ee1eSDan Willemsen		v := list.Get(i)
2916*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
2917*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, v.Uint())
2918*1c12ee1eSDan Willemsen	}
2919*1c12ee1eSDan Willemsen	return b, nil
2920*1c12ee1eSDan Willemsen}
2921*1c12ee1eSDan Willemsen
2922*1c12ee1eSDan Willemsen// consumeUint64SliceValue wire decodes a []uint64 value as a repeated Uint64.
2923*1c12ee1eSDan Willemsenfunc consumeUint64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
2924*1c12ee1eSDan Willemsen	list := listv.List()
2925*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
2926*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
2927*1c12ee1eSDan Willemsen		if n < 0 {
2928*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
2929*1c12ee1eSDan Willemsen		}
2930*1c12ee1eSDan Willemsen		for len(b) > 0 {
2931*1c12ee1eSDan Willemsen			var v uint64
2932*1c12ee1eSDan Willemsen			var n int
2933*1c12ee1eSDan Willemsen			if len(b) >= 1 && b[0] < 0x80 {
2934*1c12ee1eSDan Willemsen				v = uint64(b[0])
2935*1c12ee1eSDan Willemsen				n = 1
2936*1c12ee1eSDan Willemsen			} else if len(b) >= 2 && b[1] < 128 {
2937*1c12ee1eSDan Willemsen				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2938*1c12ee1eSDan Willemsen				n = 2
2939*1c12ee1eSDan Willemsen			} else {
2940*1c12ee1eSDan Willemsen				v, n = protowire.ConsumeVarint(b)
2941*1c12ee1eSDan Willemsen			}
2942*1c12ee1eSDan Willemsen			if n < 0 {
2943*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
2944*1c12ee1eSDan Willemsen			}
2945*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfUint64(v))
2946*1c12ee1eSDan Willemsen			b = b[n:]
2947*1c12ee1eSDan Willemsen		}
2948*1c12ee1eSDan Willemsen		out.n = n
2949*1c12ee1eSDan Willemsen		return listv, out, nil
2950*1c12ee1eSDan Willemsen	}
2951*1c12ee1eSDan Willemsen	if wtyp != protowire.VarintType {
2952*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
2953*1c12ee1eSDan Willemsen	}
2954*1c12ee1eSDan Willemsen	var v uint64
2955*1c12ee1eSDan Willemsen	var n int
2956*1c12ee1eSDan Willemsen	if len(b) >= 1 && b[0] < 0x80 {
2957*1c12ee1eSDan Willemsen		v = uint64(b[0])
2958*1c12ee1eSDan Willemsen		n = 1
2959*1c12ee1eSDan Willemsen	} else if len(b) >= 2 && b[1] < 128 {
2960*1c12ee1eSDan Willemsen		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
2961*1c12ee1eSDan Willemsen		n = 2
2962*1c12ee1eSDan Willemsen	} else {
2963*1c12ee1eSDan Willemsen		v, n = protowire.ConsumeVarint(b)
2964*1c12ee1eSDan Willemsen	}
2965*1c12ee1eSDan Willemsen	if n < 0 {
2966*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
2967*1c12ee1eSDan Willemsen	}
2968*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfUint64(v))
2969*1c12ee1eSDan Willemsen	out.n = n
2970*1c12ee1eSDan Willemsen	return listv, out, nil
2971*1c12ee1eSDan Willemsen}
2972*1c12ee1eSDan Willemsen
2973*1c12ee1eSDan Willemsenvar coderUint64SliceValue = valueCoderFuncs{
2974*1c12ee1eSDan Willemsen	size:      sizeUint64SliceValue,
2975*1c12ee1eSDan Willemsen	marshal:   appendUint64SliceValue,
2976*1c12ee1eSDan Willemsen	unmarshal: consumeUint64SliceValue,
2977*1c12ee1eSDan Willemsen	merge:     mergeListValue,
2978*1c12ee1eSDan Willemsen}
2979*1c12ee1eSDan Willemsen
2980*1c12ee1eSDan Willemsen// sizeUint64PackedSliceValue returns the size of wire encoding a []uint64 value as a packed repeated Uint64.
2981*1c12ee1eSDan Willemsenfunc sizeUint64PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
2982*1c12ee1eSDan Willemsen	list := listv.List()
2983*1c12ee1eSDan Willemsen	llen := list.Len()
2984*1c12ee1eSDan Willemsen	if llen == 0 {
2985*1c12ee1eSDan Willemsen		return 0
2986*1c12ee1eSDan Willemsen	}
2987*1c12ee1eSDan Willemsen	n := 0
2988*1c12ee1eSDan Willemsen	for i, llen := 0, llen; i < llen; i++ {
2989*1c12ee1eSDan Willemsen		v := list.Get(i)
2990*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(v.Uint())
2991*1c12ee1eSDan Willemsen	}
2992*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
2993*1c12ee1eSDan Willemsen}
2994*1c12ee1eSDan Willemsen
2995*1c12ee1eSDan Willemsen// appendUint64PackedSliceValue encodes a []uint64 value as a packed repeated Uint64.
2996*1c12ee1eSDan Willemsenfunc appendUint64PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
2997*1c12ee1eSDan Willemsen	list := listv.List()
2998*1c12ee1eSDan Willemsen	llen := list.Len()
2999*1c12ee1eSDan Willemsen	if llen == 0 {
3000*1c12ee1eSDan Willemsen		return b, nil
3001*1c12ee1eSDan Willemsen	}
3002*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3003*1c12ee1eSDan Willemsen	n := 0
3004*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
3005*1c12ee1eSDan Willemsen		v := list.Get(i)
3006*1c12ee1eSDan Willemsen		n += protowire.SizeVarint(v.Uint())
3007*1c12ee1eSDan Willemsen	}
3008*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3009*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
3010*1c12ee1eSDan Willemsen		v := list.Get(i)
3011*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, v.Uint())
3012*1c12ee1eSDan Willemsen	}
3013*1c12ee1eSDan Willemsen	return b, nil
3014*1c12ee1eSDan Willemsen}
3015*1c12ee1eSDan Willemsen
3016*1c12ee1eSDan Willemsenvar coderUint64PackedSliceValue = valueCoderFuncs{
3017*1c12ee1eSDan Willemsen	size:      sizeUint64PackedSliceValue,
3018*1c12ee1eSDan Willemsen	marshal:   appendUint64PackedSliceValue,
3019*1c12ee1eSDan Willemsen	unmarshal: consumeUint64SliceValue,
3020*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3021*1c12ee1eSDan Willemsen}
3022*1c12ee1eSDan Willemsen
3023*1c12ee1eSDan Willemsen// sizeSfixed32 returns the size of wire encoding a int32 pointer as a Sfixed32.
3024*1c12ee1eSDan Willemsenfunc sizeSfixed32(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3025*1c12ee1eSDan Willemsen
3026*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3027*1c12ee1eSDan Willemsen}
3028*1c12ee1eSDan Willemsen
3029*1c12ee1eSDan Willemsen// appendSfixed32 wire encodes a int32 pointer as a Sfixed32.
3030*1c12ee1eSDan Willemsenfunc appendSfixed32(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3031*1c12ee1eSDan Willemsen	v := *p.Int32()
3032*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3033*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, uint32(v))
3034*1c12ee1eSDan Willemsen	return b, nil
3035*1c12ee1eSDan Willemsen}
3036*1c12ee1eSDan Willemsen
3037*1c12ee1eSDan Willemsen// consumeSfixed32 wire decodes a int32 pointer as a Sfixed32.
3038*1c12ee1eSDan Willemsenfunc consumeSfixed32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3039*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3040*1c12ee1eSDan Willemsen		return out, errUnknown
3041*1c12ee1eSDan Willemsen	}
3042*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3043*1c12ee1eSDan Willemsen	if n < 0 {
3044*1c12ee1eSDan Willemsen		return out, errDecode
3045*1c12ee1eSDan Willemsen	}
3046*1c12ee1eSDan Willemsen	*p.Int32() = int32(v)
3047*1c12ee1eSDan Willemsen	out.n = n
3048*1c12ee1eSDan Willemsen	return out, nil
3049*1c12ee1eSDan Willemsen}
3050*1c12ee1eSDan Willemsen
3051*1c12ee1eSDan Willemsenvar coderSfixed32 = pointerCoderFuncs{
3052*1c12ee1eSDan Willemsen	size:      sizeSfixed32,
3053*1c12ee1eSDan Willemsen	marshal:   appendSfixed32,
3054*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32,
3055*1c12ee1eSDan Willemsen	merge:     mergeInt32,
3056*1c12ee1eSDan Willemsen}
3057*1c12ee1eSDan Willemsen
3058*1c12ee1eSDan Willemsen// sizeSfixed32NoZero returns the size of wire encoding a int32 pointer as a Sfixed32.
3059*1c12ee1eSDan Willemsen// The zero value is not encoded.
3060*1c12ee1eSDan Willemsenfunc sizeSfixed32NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3061*1c12ee1eSDan Willemsen	v := *p.Int32()
3062*1c12ee1eSDan Willemsen	if v == 0 {
3063*1c12ee1eSDan Willemsen		return 0
3064*1c12ee1eSDan Willemsen	}
3065*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3066*1c12ee1eSDan Willemsen}
3067*1c12ee1eSDan Willemsen
3068*1c12ee1eSDan Willemsen// appendSfixed32NoZero wire encodes a int32 pointer as a Sfixed32.
3069*1c12ee1eSDan Willemsen// The zero value is not encoded.
3070*1c12ee1eSDan Willemsenfunc appendSfixed32NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3071*1c12ee1eSDan Willemsen	v := *p.Int32()
3072*1c12ee1eSDan Willemsen	if v == 0 {
3073*1c12ee1eSDan Willemsen		return b, nil
3074*1c12ee1eSDan Willemsen	}
3075*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3076*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, uint32(v))
3077*1c12ee1eSDan Willemsen	return b, nil
3078*1c12ee1eSDan Willemsen}
3079*1c12ee1eSDan Willemsen
3080*1c12ee1eSDan Willemsenvar coderSfixed32NoZero = pointerCoderFuncs{
3081*1c12ee1eSDan Willemsen	size:      sizeSfixed32NoZero,
3082*1c12ee1eSDan Willemsen	marshal:   appendSfixed32NoZero,
3083*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32,
3084*1c12ee1eSDan Willemsen	merge:     mergeInt32NoZero,
3085*1c12ee1eSDan Willemsen}
3086*1c12ee1eSDan Willemsen
3087*1c12ee1eSDan Willemsen// sizeSfixed32Ptr returns the size of wire encoding a *int32 pointer as a Sfixed32.
3088*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
3089*1c12ee1eSDan Willemsenfunc sizeSfixed32Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3090*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3091*1c12ee1eSDan Willemsen}
3092*1c12ee1eSDan Willemsen
3093*1c12ee1eSDan Willemsen// appendSfixed32Ptr wire encodes a *int32 pointer as a Sfixed32.
3094*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
3095*1c12ee1eSDan Willemsenfunc appendSfixed32Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3096*1c12ee1eSDan Willemsen	v := **p.Int32Ptr()
3097*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3098*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, uint32(v))
3099*1c12ee1eSDan Willemsen	return b, nil
3100*1c12ee1eSDan Willemsen}
3101*1c12ee1eSDan Willemsen
3102*1c12ee1eSDan Willemsen// consumeSfixed32Ptr wire decodes a *int32 pointer as a Sfixed32.
3103*1c12ee1eSDan Willemsenfunc consumeSfixed32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3104*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3105*1c12ee1eSDan Willemsen		return out, errUnknown
3106*1c12ee1eSDan Willemsen	}
3107*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3108*1c12ee1eSDan Willemsen	if n < 0 {
3109*1c12ee1eSDan Willemsen		return out, errDecode
3110*1c12ee1eSDan Willemsen	}
3111*1c12ee1eSDan Willemsen	vp := p.Int32Ptr()
3112*1c12ee1eSDan Willemsen	if *vp == nil {
3113*1c12ee1eSDan Willemsen		*vp = new(int32)
3114*1c12ee1eSDan Willemsen	}
3115*1c12ee1eSDan Willemsen	**vp = int32(v)
3116*1c12ee1eSDan Willemsen	out.n = n
3117*1c12ee1eSDan Willemsen	return out, nil
3118*1c12ee1eSDan Willemsen}
3119*1c12ee1eSDan Willemsen
3120*1c12ee1eSDan Willemsenvar coderSfixed32Ptr = pointerCoderFuncs{
3121*1c12ee1eSDan Willemsen	size:      sizeSfixed32Ptr,
3122*1c12ee1eSDan Willemsen	marshal:   appendSfixed32Ptr,
3123*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32Ptr,
3124*1c12ee1eSDan Willemsen	merge:     mergeInt32Ptr,
3125*1c12ee1eSDan Willemsen}
3126*1c12ee1eSDan Willemsen
3127*1c12ee1eSDan Willemsen// sizeSfixed32Slice returns the size of wire encoding a []int32 pointer as a repeated Sfixed32.
3128*1c12ee1eSDan Willemsenfunc sizeSfixed32Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3129*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
3130*1c12ee1eSDan Willemsen	size = len(s) * (f.tagsize + protowire.SizeFixed32())
3131*1c12ee1eSDan Willemsen	return size
3132*1c12ee1eSDan Willemsen}
3133*1c12ee1eSDan Willemsen
3134*1c12ee1eSDan Willemsen// appendSfixed32Slice encodes a []int32 pointer as a repeated Sfixed32.
3135*1c12ee1eSDan Willemsenfunc appendSfixed32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3136*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
3137*1c12ee1eSDan Willemsen	for _, v := range s {
3138*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
3139*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, uint32(v))
3140*1c12ee1eSDan Willemsen	}
3141*1c12ee1eSDan Willemsen	return b, nil
3142*1c12ee1eSDan Willemsen}
3143*1c12ee1eSDan Willemsen
3144*1c12ee1eSDan Willemsen// consumeSfixed32Slice wire decodes a []int32 pointer as a repeated Sfixed32.
3145*1c12ee1eSDan Willemsenfunc consumeSfixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3146*1c12ee1eSDan Willemsen	sp := p.Int32Slice()
3147*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
3148*1c12ee1eSDan Willemsen		s := *sp
3149*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
3150*1c12ee1eSDan Willemsen		if n < 0 {
3151*1c12ee1eSDan Willemsen			return out, errDecode
3152*1c12ee1eSDan Willemsen		}
3153*1c12ee1eSDan Willemsen		for len(b) > 0 {
3154*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed32(b)
3155*1c12ee1eSDan Willemsen			if n < 0 {
3156*1c12ee1eSDan Willemsen				return out, errDecode
3157*1c12ee1eSDan Willemsen			}
3158*1c12ee1eSDan Willemsen			s = append(s, int32(v))
3159*1c12ee1eSDan Willemsen			b = b[n:]
3160*1c12ee1eSDan Willemsen		}
3161*1c12ee1eSDan Willemsen		*sp = s
3162*1c12ee1eSDan Willemsen		out.n = n
3163*1c12ee1eSDan Willemsen		return out, nil
3164*1c12ee1eSDan Willemsen	}
3165*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3166*1c12ee1eSDan Willemsen		return out, errUnknown
3167*1c12ee1eSDan Willemsen	}
3168*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3169*1c12ee1eSDan Willemsen	if n < 0 {
3170*1c12ee1eSDan Willemsen		return out, errDecode
3171*1c12ee1eSDan Willemsen	}
3172*1c12ee1eSDan Willemsen	*sp = append(*sp, int32(v))
3173*1c12ee1eSDan Willemsen	out.n = n
3174*1c12ee1eSDan Willemsen	return out, nil
3175*1c12ee1eSDan Willemsen}
3176*1c12ee1eSDan Willemsen
3177*1c12ee1eSDan Willemsenvar coderSfixed32Slice = pointerCoderFuncs{
3178*1c12ee1eSDan Willemsen	size:      sizeSfixed32Slice,
3179*1c12ee1eSDan Willemsen	marshal:   appendSfixed32Slice,
3180*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32Slice,
3181*1c12ee1eSDan Willemsen	merge:     mergeInt32Slice,
3182*1c12ee1eSDan Willemsen}
3183*1c12ee1eSDan Willemsen
3184*1c12ee1eSDan Willemsen// sizeSfixed32PackedSlice returns the size of wire encoding a []int32 pointer as a packed repeated Sfixed32.
3185*1c12ee1eSDan Willemsenfunc sizeSfixed32PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3186*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
3187*1c12ee1eSDan Willemsen	if len(s) == 0 {
3188*1c12ee1eSDan Willemsen		return 0
3189*1c12ee1eSDan Willemsen	}
3190*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed32()
3191*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
3192*1c12ee1eSDan Willemsen}
3193*1c12ee1eSDan Willemsen
3194*1c12ee1eSDan Willemsen// appendSfixed32PackedSlice encodes a []int32 pointer as a packed repeated Sfixed32.
3195*1c12ee1eSDan Willemsenfunc appendSfixed32PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3196*1c12ee1eSDan Willemsen	s := *p.Int32Slice()
3197*1c12ee1eSDan Willemsen	if len(s) == 0 {
3198*1c12ee1eSDan Willemsen		return b, nil
3199*1c12ee1eSDan Willemsen	}
3200*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3201*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed32()
3202*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3203*1c12ee1eSDan Willemsen	for _, v := range s {
3204*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, uint32(v))
3205*1c12ee1eSDan Willemsen	}
3206*1c12ee1eSDan Willemsen	return b, nil
3207*1c12ee1eSDan Willemsen}
3208*1c12ee1eSDan Willemsen
3209*1c12ee1eSDan Willemsenvar coderSfixed32PackedSlice = pointerCoderFuncs{
3210*1c12ee1eSDan Willemsen	size:      sizeSfixed32PackedSlice,
3211*1c12ee1eSDan Willemsen	marshal:   appendSfixed32PackedSlice,
3212*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32Slice,
3213*1c12ee1eSDan Willemsen	merge:     mergeInt32Slice,
3214*1c12ee1eSDan Willemsen}
3215*1c12ee1eSDan Willemsen
3216*1c12ee1eSDan Willemsen// sizeSfixed32Value returns the size of wire encoding a int32 value as a Sfixed32.
3217*1c12ee1eSDan Willemsenfunc sizeSfixed32Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
3218*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeFixed32()
3219*1c12ee1eSDan Willemsen}
3220*1c12ee1eSDan Willemsen
3221*1c12ee1eSDan Willemsen// appendSfixed32Value encodes a int32 value as a Sfixed32.
3222*1c12ee1eSDan Willemsenfunc appendSfixed32Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3223*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3224*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, uint32(v.Int()))
3225*1c12ee1eSDan Willemsen	return b, nil
3226*1c12ee1eSDan Willemsen}
3227*1c12ee1eSDan Willemsen
3228*1c12ee1eSDan Willemsen// consumeSfixed32Value decodes a int32 value as a Sfixed32.
3229*1c12ee1eSDan Willemsenfunc consumeSfixed32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
3230*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3231*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
3232*1c12ee1eSDan Willemsen	}
3233*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3234*1c12ee1eSDan Willemsen	if n < 0 {
3235*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
3236*1c12ee1eSDan Willemsen	}
3237*1c12ee1eSDan Willemsen	out.n = n
3238*1c12ee1eSDan Willemsen	return protoreflect.ValueOfInt32(int32(v)), out, nil
3239*1c12ee1eSDan Willemsen}
3240*1c12ee1eSDan Willemsen
3241*1c12ee1eSDan Willemsenvar coderSfixed32Value = valueCoderFuncs{
3242*1c12ee1eSDan Willemsen	size:      sizeSfixed32Value,
3243*1c12ee1eSDan Willemsen	marshal:   appendSfixed32Value,
3244*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32Value,
3245*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
3246*1c12ee1eSDan Willemsen}
3247*1c12ee1eSDan Willemsen
3248*1c12ee1eSDan Willemsen// sizeSfixed32SliceValue returns the size of wire encoding a []int32 value as a repeated Sfixed32.
3249*1c12ee1eSDan Willemsenfunc sizeSfixed32SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
3250*1c12ee1eSDan Willemsen	list := listv.List()
3251*1c12ee1eSDan Willemsen	size = list.Len() * (tagsize + protowire.SizeFixed32())
3252*1c12ee1eSDan Willemsen	return size
3253*1c12ee1eSDan Willemsen}
3254*1c12ee1eSDan Willemsen
3255*1c12ee1eSDan Willemsen// appendSfixed32SliceValue encodes a []int32 value as a repeated Sfixed32.
3256*1c12ee1eSDan Willemsenfunc appendSfixed32SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3257*1c12ee1eSDan Willemsen	list := listv.List()
3258*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
3259*1c12ee1eSDan Willemsen		v := list.Get(i)
3260*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
3261*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, uint32(v.Int()))
3262*1c12ee1eSDan Willemsen	}
3263*1c12ee1eSDan Willemsen	return b, nil
3264*1c12ee1eSDan Willemsen}
3265*1c12ee1eSDan Willemsen
3266*1c12ee1eSDan Willemsen// consumeSfixed32SliceValue wire decodes a []int32 value as a repeated Sfixed32.
3267*1c12ee1eSDan Willemsenfunc consumeSfixed32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
3268*1c12ee1eSDan Willemsen	list := listv.List()
3269*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
3270*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
3271*1c12ee1eSDan Willemsen		if n < 0 {
3272*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
3273*1c12ee1eSDan Willemsen		}
3274*1c12ee1eSDan Willemsen		for len(b) > 0 {
3275*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed32(b)
3276*1c12ee1eSDan Willemsen			if n < 0 {
3277*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
3278*1c12ee1eSDan Willemsen			}
3279*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfInt32(int32(v)))
3280*1c12ee1eSDan Willemsen			b = b[n:]
3281*1c12ee1eSDan Willemsen		}
3282*1c12ee1eSDan Willemsen		out.n = n
3283*1c12ee1eSDan Willemsen		return listv, out, nil
3284*1c12ee1eSDan Willemsen	}
3285*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3286*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
3287*1c12ee1eSDan Willemsen	}
3288*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3289*1c12ee1eSDan Willemsen	if n < 0 {
3290*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
3291*1c12ee1eSDan Willemsen	}
3292*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfInt32(int32(v)))
3293*1c12ee1eSDan Willemsen	out.n = n
3294*1c12ee1eSDan Willemsen	return listv, out, nil
3295*1c12ee1eSDan Willemsen}
3296*1c12ee1eSDan Willemsen
3297*1c12ee1eSDan Willemsenvar coderSfixed32SliceValue = valueCoderFuncs{
3298*1c12ee1eSDan Willemsen	size:      sizeSfixed32SliceValue,
3299*1c12ee1eSDan Willemsen	marshal:   appendSfixed32SliceValue,
3300*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32SliceValue,
3301*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3302*1c12ee1eSDan Willemsen}
3303*1c12ee1eSDan Willemsen
3304*1c12ee1eSDan Willemsen// sizeSfixed32PackedSliceValue returns the size of wire encoding a []int32 value as a packed repeated Sfixed32.
3305*1c12ee1eSDan Willemsenfunc sizeSfixed32PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
3306*1c12ee1eSDan Willemsen	list := listv.List()
3307*1c12ee1eSDan Willemsen	llen := list.Len()
3308*1c12ee1eSDan Willemsen	if llen == 0 {
3309*1c12ee1eSDan Willemsen		return 0
3310*1c12ee1eSDan Willemsen	}
3311*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed32()
3312*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
3313*1c12ee1eSDan Willemsen}
3314*1c12ee1eSDan Willemsen
3315*1c12ee1eSDan Willemsen// appendSfixed32PackedSliceValue encodes a []int32 value as a packed repeated Sfixed32.
3316*1c12ee1eSDan Willemsenfunc appendSfixed32PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3317*1c12ee1eSDan Willemsen	list := listv.List()
3318*1c12ee1eSDan Willemsen	llen := list.Len()
3319*1c12ee1eSDan Willemsen	if llen == 0 {
3320*1c12ee1eSDan Willemsen		return b, nil
3321*1c12ee1eSDan Willemsen	}
3322*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3323*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed32()
3324*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3325*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
3326*1c12ee1eSDan Willemsen		v := list.Get(i)
3327*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, uint32(v.Int()))
3328*1c12ee1eSDan Willemsen	}
3329*1c12ee1eSDan Willemsen	return b, nil
3330*1c12ee1eSDan Willemsen}
3331*1c12ee1eSDan Willemsen
3332*1c12ee1eSDan Willemsenvar coderSfixed32PackedSliceValue = valueCoderFuncs{
3333*1c12ee1eSDan Willemsen	size:      sizeSfixed32PackedSliceValue,
3334*1c12ee1eSDan Willemsen	marshal:   appendSfixed32PackedSliceValue,
3335*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed32SliceValue,
3336*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3337*1c12ee1eSDan Willemsen}
3338*1c12ee1eSDan Willemsen
3339*1c12ee1eSDan Willemsen// sizeFixed32 returns the size of wire encoding a uint32 pointer as a Fixed32.
3340*1c12ee1eSDan Willemsenfunc sizeFixed32(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3341*1c12ee1eSDan Willemsen
3342*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3343*1c12ee1eSDan Willemsen}
3344*1c12ee1eSDan Willemsen
3345*1c12ee1eSDan Willemsen// appendFixed32 wire encodes a uint32 pointer as a Fixed32.
3346*1c12ee1eSDan Willemsenfunc appendFixed32(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3347*1c12ee1eSDan Willemsen	v := *p.Uint32()
3348*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3349*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, v)
3350*1c12ee1eSDan Willemsen	return b, nil
3351*1c12ee1eSDan Willemsen}
3352*1c12ee1eSDan Willemsen
3353*1c12ee1eSDan Willemsen// consumeFixed32 wire decodes a uint32 pointer as a Fixed32.
3354*1c12ee1eSDan Willemsenfunc consumeFixed32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3355*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3356*1c12ee1eSDan Willemsen		return out, errUnknown
3357*1c12ee1eSDan Willemsen	}
3358*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3359*1c12ee1eSDan Willemsen	if n < 0 {
3360*1c12ee1eSDan Willemsen		return out, errDecode
3361*1c12ee1eSDan Willemsen	}
3362*1c12ee1eSDan Willemsen	*p.Uint32() = v
3363*1c12ee1eSDan Willemsen	out.n = n
3364*1c12ee1eSDan Willemsen	return out, nil
3365*1c12ee1eSDan Willemsen}
3366*1c12ee1eSDan Willemsen
3367*1c12ee1eSDan Willemsenvar coderFixed32 = pointerCoderFuncs{
3368*1c12ee1eSDan Willemsen	size:      sizeFixed32,
3369*1c12ee1eSDan Willemsen	marshal:   appendFixed32,
3370*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32,
3371*1c12ee1eSDan Willemsen	merge:     mergeUint32,
3372*1c12ee1eSDan Willemsen}
3373*1c12ee1eSDan Willemsen
3374*1c12ee1eSDan Willemsen// sizeFixed32NoZero returns the size of wire encoding a uint32 pointer as a Fixed32.
3375*1c12ee1eSDan Willemsen// The zero value is not encoded.
3376*1c12ee1eSDan Willemsenfunc sizeFixed32NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3377*1c12ee1eSDan Willemsen	v := *p.Uint32()
3378*1c12ee1eSDan Willemsen	if v == 0 {
3379*1c12ee1eSDan Willemsen		return 0
3380*1c12ee1eSDan Willemsen	}
3381*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3382*1c12ee1eSDan Willemsen}
3383*1c12ee1eSDan Willemsen
3384*1c12ee1eSDan Willemsen// appendFixed32NoZero wire encodes a uint32 pointer as a Fixed32.
3385*1c12ee1eSDan Willemsen// The zero value is not encoded.
3386*1c12ee1eSDan Willemsenfunc appendFixed32NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3387*1c12ee1eSDan Willemsen	v := *p.Uint32()
3388*1c12ee1eSDan Willemsen	if v == 0 {
3389*1c12ee1eSDan Willemsen		return b, nil
3390*1c12ee1eSDan Willemsen	}
3391*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3392*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, v)
3393*1c12ee1eSDan Willemsen	return b, nil
3394*1c12ee1eSDan Willemsen}
3395*1c12ee1eSDan Willemsen
3396*1c12ee1eSDan Willemsenvar coderFixed32NoZero = pointerCoderFuncs{
3397*1c12ee1eSDan Willemsen	size:      sizeFixed32NoZero,
3398*1c12ee1eSDan Willemsen	marshal:   appendFixed32NoZero,
3399*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32,
3400*1c12ee1eSDan Willemsen	merge:     mergeUint32NoZero,
3401*1c12ee1eSDan Willemsen}
3402*1c12ee1eSDan Willemsen
3403*1c12ee1eSDan Willemsen// sizeFixed32Ptr returns the size of wire encoding a *uint32 pointer as a Fixed32.
3404*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
3405*1c12ee1eSDan Willemsenfunc sizeFixed32Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3406*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3407*1c12ee1eSDan Willemsen}
3408*1c12ee1eSDan Willemsen
3409*1c12ee1eSDan Willemsen// appendFixed32Ptr wire encodes a *uint32 pointer as a Fixed32.
3410*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
3411*1c12ee1eSDan Willemsenfunc appendFixed32Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3412*1c12ee1eSDan Willemsen	v := **p.Uint32Ptr()
3413*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3414*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, v)
3415*1c12ee1eSDan Willemsen	return b, nil
3416*1c12ee1eSDan Willemsen}
3417*1c12ee1eSDan Willemsen
3418*1c12ee1eSDan Willemsen// consumeFixed32Ptr wire decodes a *uint32 pointer as a Fixed32.
3419*1c12ee1eSDan Willemsenfunc consumeFixed32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3420*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3421*1c12ee1eSDan Willemsen		return out, errUnknown
3422*1c12ee1eSDan Willemsen	}
3423*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3424*1c12ee1eSDan Willemsen	if n < 0 {
3425*1c12ee1eSDan Willemsen		return out, errDecode
3426*1c12ee1eSDan Willemsen	}
3427*1c12ee1eSDan Willemsen	vp := p.Uint32Ptr()
3428*1c12ee1eSDan Willemsen	if *vp == nil {
3429*1c12ee1eSDan Willemsen		*vp = new(uint32)
3430*1c12ee1eSDan Willemsen	}
3431*1c12ee1eSDan Willemsen	**vp = v
3432*1c12ee1eSDan Willemsen	out.n = n
3433*1c12ee1eSDan Willemsen	return out, nil
3434*1c12ee1eSDan Willemsen}
3435*1c12ee1eSDan Willemsen
3436*1c12ee1eSDan Willemsenvar coderFixed32Ptr = pointerCoderFuncs{
3437*1c12ee1eSDan Willemsen	size:      sizeFixed32Ptr,
3438*1c12ee1eSDan Willemsen	marshal:   appendFixed32Ptr,
3439*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32Ptr,
3440*1c12ee1eSDan Willemsen	merge:     mergeUint32Ptr,
3441*1c12ee1eSDan Willemsen}
3442*1c12ee1eSDan Willemsen
3443*1c12ee1eSDan Willemsen// sizeFixed32Slice returns the size of wire encoding a []uint32 pointer as a repeated Fixed32.
3444*1c12ee1eSDan Willemsenfunc sizeFixed32Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3445*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
3446*1c12ee1eSDan Willemsen	size = len(s) * (f.tagsize + protowire.SizeFixed32())
3447*1c12ee1eSDan Willemsen	return size
3448*1c12ee1eSDan Willemsen}
3449*1c12ee1eSDan Willemsen
3450*1c12ee1eSDan Willemsen// appendFixed32Slice encodes a []uint32 pointer as a repeated Fixed32.
3451*1c12ee1eSDan Willemsenfunc appendFixed32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3452*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
3453*1c12ee1eSDan Willemsen	for _, v := range s {
3454*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
3455*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, v)
3456*1c12ee1eSDan Willemsen	}
3457*1c12ee1eSDan Willemsen	return b, nil
3458*1c12ee1eSDan Willemsen}
3459*1c12ee1eSDan Willemsen
3460*1c12ee1eSDan Willemsen// consumeFixed32Slice wire decodes a []uint32 pointer as a repeated Fixed32.
3461*1c12ee1eSDan Willemsenfunc consumeFixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3462*1c12ee1eSDan Willemsen	sp := p.Uint32Slice()
3463*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
3464*1c12ee1eSDan Willemsen		s := *sp
3465*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
3466*1c12ee1eSDan Willemsen		if n < 0 {
3467*1c12ee1eSDan Willemsen			return out, errDecode
3468*1c12ee1eSDan Willemsen		}
3469*1c12ee1eSDan Willemsen		for len(b) > 0 {
3470*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed32(b)
3471*1c12ee1eSDan Willemsen			if n < 0 {
3472*1c12ee1eSDan Willemsen				return out, errDecode
3473*1c12ee1eSDan Willemsen			}
3474*1c12ee1eSDan Willemsen			s = append(s, v)
3475*1c12ee1eSDan Willemsen			b = b[n:]
3476*1c12ee1eSDan Willemsen		}
3477*1c12ee1eSDan Willemsen		*sp = s
3478*1c12ee1eSDan Willemsen		out.n = n
3479*1c12ee1eSDan Willemsen		return out, nil
3480*1c12ee1eSDan Willemsen	}
3481*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3482*1c12ee1eSDan Willemsen		return out, errUnknown
3483*1c12ee1eSDan Willemsen	}
3484*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3485*1c12ee1eSDan Willemsen	if n < 0 {
3486*1c12ee1eSDan Willemsen		return out, errDecode
3487*1c12ee1eSDan Willemsen	}
3488*1c12ee1eSDan Willemsen	*sp = append(*sp, v)
3489*1c12ee1eSDan Willemsen	out.n = n
3490*1c12ee1eSDan Willemsen	return out, nil
3491*1c12ee1eSDan Willemsen}
3492*1c12ee1eSDan Willemsen
3493*1c12ee1eSDan Willemsenvar coderFixed32Slice = pointerCoderFuncs{
3494*1c12ee1eSDan Willemsen	size:      sizeFixed32Slice,
3495*1c12ee1eSDan Willemsen	marshal:   appendFixed32Slice,
3496*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32Slice,
3497*1c12ee1eSDan Willemsen	merge:     mergeUint32Slice,
3498*1c12ee1eSDan Willemsen}
3499*1c12ee1eSDan Willemsen
3500*1c12ee1eSDan Willemsen// sizeFixed32PackedSlice returns the size of wire encoding a []uint32 pointer as a packed repeated Fixed32.
3501*1c12ee1eSDan Willemsenfunc sizeFixed32PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3502*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
3503*1c12ee1eSDan Willemsen	if len(s) == 0 {
3504*1c12ee1eSDan Willemsen		return 0
3505*1c12ee1eSDan Willemsen	}
3506*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed32()
3507*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
3508*1c12ee1eSDan Willemsen}
3509*1c12ee1eSDan Willemsen
3510*1c12ee1eSDan Willemsen// appendFixed32PackedSlice encodes a []uint32 pointer as a packed repeated Fixed32.
3511*1c12ee1eSDan Willemsenfunc appendFixed32PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3512*1c12ee1eSDan Willemsen	s := *p.Uint32Slice()
3513*1c12ee1eSDan Willemsen	if len(s) == 0 {
3514*1c12ee1eSDan Willemsen		return b, nil
3515*1c12ee1eSDan Willemsen	}
3516*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3517*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed32()
3518*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3519*1c12ee1eSDan Willemsen	for _, v := range s {
3520*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, v)
3521*1c12ee1eSDan Willemsen	}
3522*1c12ee1eSDan Willemsen	return b, nil
3523*1c12ee1eSDan Willemsen}
3524*1c12ee1eSDan Willemsen
3525*1c12ee1eSDan Willemsenvar coderFixed32PackedSlice = pointerCoderFuncs{
3526*1c12ee1eSDan Willemsen	size:      sizeFixed32PackedSlice,
3527*1c12ee1eSDan Willemsen	marshal:   appendFixed32PackedSlice,
3528*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32Slice,
3529*1c12ee1eSDan Willemsen	merge:     mergeUint32Slice,
3530*1c12ee1eSDan Willemsen}
3531*1c12ee1eSDan Willemsen
3532*1c12ee1eSDan Willemsen// sizeFixed32Value returns the size of wire encoding a uint32 value as a Fixed32.
3533*1c12ee1eSDan Willemsenfunc sizeFixed32Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
3534*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeFixed32()
3535*1c12ee1eSDan Willemsen}
3536*1c12ee1eSDan Willemsen
3537*1c12ee1eSDan Willemsen// appendFixed32Value encodes a uint32 value as a Fixed32.
3538*1c12ee1eSDan Willemsenfunc appendFixed32Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3539*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3540*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, uint32(v.Uint()))
3541*1c12ee1eSDan Willemsen	return b, nil
3542*1c12ee1eSDan Willemsen}
3543*1c12ee1eSDan Willemsen
3544*1c12ee1eSDan Willemsen// consumeFixed32Value decodes a uint32 value as a Fixed32.
3545*1c12ee1eSDan Willemsenfunc consumeFixed32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
3546*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3547*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
3548*1c12ee1eSDan Willemsen	}
3549*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3550*1c12ee1eSDan Willemsen	if n < 0 {
3551*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
3552*1c12ee1eSDan Willemsen	}
3553*1c12ee1eSDan Willemsen	out.n = n
3554*1c12ee1eSDan Willemsen	return protoreflect.ValueOfUint32(uint32(v)), out, nil
3555*1c12ee1eSDan Willemsen}
3556*1c12ee1eSDan Willemsen
3557*1c12ee1eSDan Willemsenvar coderFixed32Value = valueCoderFuncs{
3558*1c12ee1eSDan Willemsen	size:      sizeFixed32Value,
3559*1c12ee1eSDan Willemsen	marshal:   appendFixed32Value,
3560*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32Value,
3561*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
3562*1c12ee1eSDan Willemsen}
3563*1c12ee1eSDan Willemsen
3564*1c12ee1eSDan Willemsen// sizeFixed32SliceValue returns the size of wire encoding a []uint32 value as a repeated Fixed32.
3565*1c12ee1eSDan Willemsenfunc sizeFixed32SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
3566*1c12ee1eSDan Willemsen	list := listv.List()
3567*1c12ee1eSDan Willemsen	size = list.Len() * (tagsize + protowire.SizeFixed32())
3568*1c12ee1eSDan Willemsen	return size
3569*1c12ee1eSDan Willemsen}
3570*1c12ee1eSDan Willemsen
3571*1c12ee1eSDan Willemsen// appendFixed32SliceValue encodes a []uint32 value as a repeated Fixed32.
3572*1c12ee1eSDan Willemsenfunc appendFixed32SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3573*1c12ee1eSDan Willemsen	list := listv.List()
3574*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
3575*1c12ee1eSDan Willemsen		v := list.Get(i)
3576*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
3577*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, uint32(v.Uint()))
3578*1c12ee1eSDan Willemsen	}
3579*1c12ee1eSDan Willemsen	return b, nil
3580*1c12ee1eSDan Willemsen}
3581*1c12ee1eSDan Willemsen
3582*1c12ee1eSDan Willemsen// consumeFixed32SliceValue wire decodes a []uint32 value as a repeated Fixed32.
3583*1c12ee1eSDan Willemsenfunc consumeFixed32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
3584*1c12ee1eSDan Willemsen	list := listv.List()
3585*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
3586*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
3587*1c12ee1eSDan Willemsen		if n < 0 {
3588*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
3589*1c12ee1eSDan Willemsen		}
3590*1c12ee1eSDan Willemsen		for len(b) > 0 {
3591*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed32(b)
3592*1c12ee1eSDan Willemsen			if n < 0 {
3593*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
3594*1c12ee1eSDan Willemsen			}
3595*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfUint32(uint32(v)))
3596*1c12ee1eSDan Willemsen			b = b[n:]
3597*1c12ee1eSDan Willemsen		}
3598*1c12ee1eSDan Willemsen		out.n = n
3599*1c12ee1eSDan Willemsen		return listv, out, nil
3600*1c12ee1eSDan Willemsen	}
3601*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3602*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
3603*1c12ee1eSDan Willemsen	}
3604*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3605*1c12ee1eSDan Willemsen	if n < 0 {
3606*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
3607*1c12ee1eSDan Willemsen	}
3608*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfUint32(uint32(v)))
3609*1c12ee1eSDan Willemsen	out.n = n
3610*1c12ee1eSDan Willemsen	return listv, out, nil
3611*1c12ee1eSDan Willemsen}
3612*1c12ee1eSDan Willemsen
3613*1c12ee1eSDan Willemsenvar coderFixed32SliceValue = valueCoderFuncs{
3614*1c12ee1eSDan Willemsen	size:      sizeFixed32SliceValue,
3615*1c12ee1eSDan Willemsen	marshal:   appendFixed32SliceValue,
3616*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32SliceValue,
3617*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3618*1c12ee1eSDan Willemsen}
3619*1c12ee1eSDan Willemsen
3620*1c12ee1eSDan Willemsen// sizeFixed32PackedSliceValue returns the size of wire encoding a []uint32 value as a packed repeated Fixed32.
3621*1c12ee1eSDan Willemsenfunc sizeFixed32PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
3622*1c12ee1eSDan Willemsen	list := listv.List()
3623*1c12ee1eSDan Willemsen	llen := list.Len()
3624*1c12ee1eSDan Willemsen	if llen == 0 {
3625*1c12ee1eSDan Willemsen		return 0
3626*1c12ee1eSDan Willemsen	}
3627*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed32()
3628*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
3629*1c12ee1eSDan Willemsen}
3630*1c12ee1eSDan Willemsen
3631*1c12ee1eSDan Willemsen// appendFixed32PackedSliceValue encodes a []uint32 value as a packed repeated Fixed32.
3632*1c12ee1eSDan Willemsenfunc appendFixed32PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3633*1c12ee1eSDan Willemsen	list := listv.List()
3634*1c12ee1eSDan Willemsen	llen := list.Len()
3635*1c12ee1eSDan Willemsen	if llen == 0 {
3636*1c12ee1eSDan Willemsen		return b, nil
3637*1c12ee1eSDan Willemsen	}
3638*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3639*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed32()
3640*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3641*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
3642*1c12ee1eSDan Willemsen		v := list.Get(i)
3643*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, uint32(v.Uint()))
3644*1c12ee1eSDan Willemsen	}
3645*1c12ee1eSDan Willemsen	return b, nil
3646*1c12ee1eSDan Willemsen}
3647*1c12ee1eSDan Willemsen
3648*1c12ee1eSDan Willemsenvar coderFixed32PackedSliceValue = valueCoderFuncs{
3649*1c12ee1eSDan Willemsen	size:      sizeFixed32PackedSliceValue,
3650*1c12ee1eSDan Willemsen	marshal:   appendFixed32PackedSliceValue,
3651*1c12ee1eSDan Willemsen	unmarshal: consumeFixed32SliceValue,
3652*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3653*1c12ee1eSDan Willemsen}
3654*1c12ee1eSDan Willemsen
3655*1c12ee1eSDan Willemsen// sizeFloat returns the size of wire encoding a float32 pointer as a Float.
3656*1c12ee1eSDan Willemsenfunc sizeFloat(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3657*1c12ee1eSDan Willemsen
3658*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3659*1c12ee1eSDan Willemsen}
3660*1c12ee1eSDan Willemsen
3661*1c12ee1eSDan Willemsen// appendFloat wire encodes a float32 pointer as a Float.
3662*1c12ee1eSDan Willemsenfunc appendFloat(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3663*1c12ee1eSDan Willemsen	v := *p.Float32()
3664*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3665*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, math.Float32bits(v))
3666*1c12ee1eSDan Willemsen	return b, nil
3667*1c12ee1eSDan Willemsen}
3668*1c12ee1eSDan Willemsen
3669*1c12ee1eSDan Willemsen// consumeFloat wire decodes a float32 pointer as a Float.
3670*1c12ee1eSDan Willemsenfunc consumeFloat(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3671*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3672*1c12ee1eSDan Willemsen		return out, errUnknown
3673*1c12ee1eSDan Willemsen	}
3674*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3675*1c12ee1eSDan Willemsen	if n < 0 {
3676*1c12ee1eSDan Willemsen		return out, errDecode
3677*1c12ee1eSDan Willemsen	}
3678*1c12ee1eSDan Willemsen	*p.Float32() = math.Float32frombits(v)
3679*1c12ee1eSDan Willemsen	out.n = n
3680*1c12ee1eSDan Willemsen	return out, nil
3681*1c12ee1eSDan Willemsen}
3682*1c12ee1eSDan Willemsen
3683*1c12ee1eSDan Willemsenvar coderFloat = pointerCoderFuncs{
3684*1c12ee1eSDan Willemsen	size:      sizeFloat,
3685*1c12ee1eSDan Willemsen	marshal:   appendFloat,
3686*1c12ee1eSDan Willemsen	unmarshal: consumeFloat,
3687*1c12ee1eSDan Willemsen	merge:     mergeFloat32,
3688*1c12ee1eSDan Willemsen}
3689*1c12ee1eSDan Willemsen
3690*1c12ee1eSDan Willemsen// sizeFloatNoZero returns the size of wire encoding a float32 pointer as a Float.
3691*1c12ee1eSDan Willemsen// The zero value is not encoded.
3692*1c12ee1eSDan Willemsenfunc sizeFloatNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3693*1c12ee1eSDan Willemsen	v := *p.Float32()
3694*1c12ee1eSDan Willemsen	if v == 0 && !math.Signbit(float64(v)) {
3695*1c12ee1eSDan Willemsen		return 0
3696*1c12ee1eSDan Willemsen	}
3697*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3698*1c12ee1eSDan Willemsen}
3699*1c12ee1eSDan Willemsen
3700*1c12ee1eSDan Willemsen// appendFloatNoZero wire encodes a float32 pointer as a Float.
3701*1c12ee1eSDan Willemsen// The zero value is not encoded.
3702*1c12ee1eSDan Willemsenfunc appendFloatNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3703*1c12ee1eSDan Willemsen	v := *p.Float32()
3704*1c12ee1eSDan Willemsen	if v == 0 && !math.Signbit(float64(v)) {
3705*1c12ee1eSDan Willemsen		return b, nil
3706*1c12ee1eSDan Willemsen	}
3707*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3708*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, math.Float32bits(v))
3709*1c12ee1eSDan Willemsen	return b, nil
3710*1c12ee1eSDan Willemsen}
3711*1c12ee1eSDan Willemsen
3712*1c12ee1eSDan Willemsenvar coderFloatNoZero = pointerCoderFuncs{
3713*1c12ee1eSDan Willemsen	size:      sizeFloatNoZero,
3714*1c12ee1eSDan Willemsen	marshal:   appendFloatNoZero,
3715*1c12ee1eSDan Willemsen	unmarshal: consumeFloat,
3716*1c12ee1eSDan Willemsen	merge:     mergeFloat32NoZero,
3717*1c12ee1eSDan Willemsen}
3718*1c12ee1eSDan Willemsen
3719*1c12ee1eSDan Willemsen// sizeFloatPtr returns the size of wire encoding a *float32 pointer as a Float.
3720*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
3721*1c12ee1eSDan Willemsenfunc sizeFloatPtr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3722*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed32()
3723*1c12ee1eSDan Willemsen}
3724*1c12ee1eSDan Willemsen
3725*1c12ee1eSDan Willemsen// appendFloatPtr wire encodes a *float32 pointer as a Float.
3726*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
3727*1c12ee1eSDan Willemsenfunc appendFloatPtr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3728*1c12ee1eSDan Willemsen	v := **p.Float32Ptr()
3729*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3730*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, math.Float32bits(v))
3731*1c12ee1eSDan Willemsen	return b, nil
3732*1c12ee1eSDan Willemsen}
3733*1c12ee1eSDan Willemsen
3734*1c12ee1eSDan Willemsen// consumeFloatPtr wire decodes a *float32 pointer as a Float.
3735*1c12ee1eSDan Willemsenfunc consumeFloatPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3736*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3737*1c12ee1eSDan Willemsen		return out, errUnknown
3738*1c12ee1eSDan Willemsen	}
3739*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3740*1c12ee1eSDan Willemsen	if n < 0 {
3741*1c12ee1eSDan Willemsen		return out, errDecode
3742*1c12ee1eSDan Willemsen	}
3743*1c12ee1eSDan Willemsen	vp := p.Float32Ptr()
3744*1c12ee1eSDan Willemsen	if *vp == nil {
3745*1c12ee1eSDan Willemsen		*vp = new(float32)
3746*1c12ee1eSDan Willemsen	}
3747*1c12ee1eSDan Willemsen	**vp = math.Float32frombits(v)
3748*1c12ee1eSDan Willemsen	out.n = n
3749*1c12ee1eSDan Willemsen	return out, nil
3750*1c12ee1eSDan Willemsen}
3751*1c12ee1eSDan Willemsen
3752*1c12ee1eSDan Willemsenvar coderFloatPtr = pointerCoderFuncs{
3753*1c12ee1eSDan Willemsen	size:      sizeFloatPtr,
3754*1c12ee1eSDan Willemsen	marshal:   appendFloatPtr,
3755*1c12ee1eSDan Willemsen	unmarshal: consumeFloatPtr,
3756*1c12ee1eSDan Willemsen	merge:     mergeFloat32Ptr,
3757*1c12ee1eSDan Willemsen}
3758*1c12ee1eSDan Willemsen
3759*1c12ee1eSDan Willemsen// sizeFloatSlice returns the size of wire encoding a []float32 pointer as a repeated Float.
3760*1c12ee1eSDan Willemsenfunc sizeFloatSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3761*1c12ee1eSDan Willemsen	s := *p.Float32Slice()
3762*1c12ee1eSDan Willemsen	size = len(s) * (f.tagsize + protowire.SizeFixed32())
3763*1c12ee1eSDan Willemsen	return size
3764*1c12ee1eSDan Willemsen}
3765*1c12ee1eSDan Willemsen
3766*1c12ee1eSDan Willemsen// appendFloatSlice encodes a []float32 pointer as a repeated Float.
3767*1c12ee1eSDan Willemsenfunc appendFloatSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3768*1c12ee1eSDan Willemsen	s := *p.Float32Slice()
3769*1c12ee1eSDan Willemsen	for _, v := range s {
3770*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
3771*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, math.Float32bits(v))
3772*1c12ee1eSDan Willemsen	}
3773*1c12ee1eSDan Willemsen	return b, nil
3774*1c12ee1eSDan Willemsen}
3775*1c12ee1eSDan Willemsen
3776*1c12ee1eSDan Willemsen// consumeFloatSlice wire decodes a []float32 pointer as a repeated Float.
3777*1c12ee1eSDan Willemsenfunc consumeFloatSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3778*1c12ee1eSDan Willemsen	sp := p.Float32Slice()
3779*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
3780*1c12ee1eSDan Willemsen		s := *sp
3781*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
3782*1c12ee1eSDan Willemsen		if n < 0 {
3783*1c12ee1eSDan Willemsen			return out, errDecode
3784*1c12ee1eSDan Willemsen		}
3785*1c12ee1eSDan Willemsen		for len(b) > 0 {
3786*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed32(b)
3787*1c12ee1eSDan Willemsen			if n < 0 {
3788*1c12ee1eSDan Willemsen				return out, errDecode
3789*1c12ee1eSDan Willemsen			}
3790*1c12ee1eSDan Willemsen			s = append(s, math.Float32frombits(v))
3791*1c12ee1eSDan Willemsen			b = b[n:]
3792*1c12ee1eSDan Willemsen		}
3793*1c12ee1eSDan Willemsen		*sp = s
3794*1c12ee1eSDan Willemsen		out.n = n
3795*1c12ee1eSDan Willemsen		return out, nil
3796*1c12ee1eSDan Willemsen	}
3797*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3798*1c12ee1eSDan Willemsen		return out, errUnknown
3799*1c12ee1eSDan Willemsen	}
3800*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3801*1c12ee1eSDan Willemsen	if n < 0 {
3802*1c12ee1eSDan Willemsen		return out, errDecode
3803*1c12ee1eSDan Willemsen	}
3804*1c12ee1eSDan Willemsen	*sp = append(*sp, math.Float32frombits(v))
3805*1c12ee1eSDan Willemsen	out.n = n
3806*1c12ee1eSDan Willemsen	return out, nil
3807*1c12ee1eSDan Willemsen}
3808*1c12ee1eSDan Willemsen
3809*1c12ee1eSDan Willemsenvar coderFloatSlice = pointerCoderFuncs{
3810*1c12ee1eSDan Willemsen	size:      sizeFloatSlice,
3811*1c12ee1eSDan Willemsen	marshal:   appendFloatSlice,
3812*1c12ee1eSDan Willemsen	unmarshal: consumeFloatSlice,
3813*1c12ee1eSDan Willemsen	merge:     mergeFloat32Slice,
3814*1c12ee1eSDan Willemsen}
3815*1c12ee1eSDan Willemsen
3816*1c12ee1eSDan Willemsen// sizeFloatPackedSlice returns the size of wire encoding a []float32 pointer as a packed repeated Float.
3817*1c12ee1eSDan Willemsenfunc sizeFloatPackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3818*1c12ee1eSDan Willemsen	s := *p.Float32Slice()
3819*1c12ee1eSDan Willemsen	if len(s) == 0 {
3820*1c12ee1eSDan Willemsen		return 0
3821*1c12ee1eSDan Willemsen	}
3822*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed32()
3823*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
3824*1c12ee1eSDan Willemsen}
3825*1c12ee1eSDan Willemsen
3826*1c12ee1eSDan Willemsen// appendFloatPackedSlice encodes a []float32 pointer as a packed repeated Float.
3827*1c12ee1eSDan Willemsenfunc appendFloatPackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3828*1c12ee1eSDan Willemsen	s := *p.Float32Slice()
3829*1c12ee1eSDan Willemsen	if len(s) == 0 {
3830*1c12ee1eSDan Willemsen		return b, nil
3831*1c12ee1eSDan Willemsen	}
3832*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3833*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed32()
3834*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3835*1c12ee1eSDan Willemsen	for _, v := range s {
3836*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, math.Float32bits(v))
3837*1c12ee1eSDan Willemsen	}
3838*1c12ee1eSDan Willemsen	return b, nil
3839*1c12ee1eSDan Willemsen}
3840*1c12ee1eSDan Willemsen
3841*1c12ee1eSDan Willemsenvar coderFloatPackedSlice = pointerCoderFuncs{
3842*1c12ee1eSDan Willemsen	size:      sizeFloatPackedSlice,
3843*1c12ee1eSDan Willemsen	marshal:   appendFloatPackedSlice,
3844*1c12ee1eSDan Willemsen	unmarshal: consumeFloatSlice,
3845*1c12ee1eSDan Willemsen	merge:     mergeFloat32Slice,
3846*1c12ee1eSDan Willemsen}
3847*1c12ee1eSDan Willemsen
3848*1c12ee1eSDan Willemsen// sizeFloatValue returns the size of wire encoding a float32 value as a Float.
3849*1c12ee1eSDan Willemsenfunc sizeFloatValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
3850*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeFixed32()
3851*1c12ee1eSDan Willemsen}
3852*1c12ee1eSDan Willemsen
3853*1c12ee1eSDan Willemsen// appendFloatValue encodes a float32 value as a Float.
3854*1c12ee1eSDan Willemsenfunc appendFloatValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3855*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3856*1c12ee1eSDan Willemsen	b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
3857*1c12ee1eSDan Willemsen	return b, nil
3858*1c12ee1eSDan Willemsen}
3859*1c12ee1eSDan Willemsen
3860*1c12ee1eSDan Willemsen// consumeFloatValue decodes a float32 value as a Float.
3861*1c12ee1eSDan Willemsenfunc consumeFloatValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
3862*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3863*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
3864*1c12ee1eSDan Willemsen	}
3865*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3866*1c12ee1eSDan Willemsen	if n < 0 {
3867*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
3868*1c12ee1eSDan Willemsen	}
3869*1c12ee1eSDan Willemsen	out.n = n
3870*1c12ee1eSDan Willemsen	return protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))), out, nil
3871*1c12ee1eSDan Willemsen}
3872*1c12ee1eSDan Willemsen
3873*1c12ee1eSDan Willemsenvar coderFloatValue = valueCoderFuncs{
3874*1c12ee1eSDan Willemsen	size:      sizeFloatValue,
3875*1c12ee1eSDan Willemsen	marshal:   appendFloatValue,
3876*1c12ee1eSDan Willemsen	unmarshal: consumeFloatValue,
3877*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
3878*1c12ee1eSDan Willemsen}
3879*1c12ee1eSDan Willemsen
3880*1c12ee1eSDan Willemsen// sizeFloatSliceValue returns the size of wire encoding a []float32 value as a repeated Float.
3881*1c12ee1eSDan Willemsenfunc sizeFloatSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
3882*1c12ee1eSDan Willemsen	list := listv.List()
3883*1c12ee1eSDan Willemsen	size = list.Len() * (tagsize + protowire.SizeFixed32())
3884*1c12ee1eSDan Willemsen	return size
3885*1c12ee1eSDan Willemsen}
3886*1c12ee1eSDan Willemsen
3887*1c12ee1eSDan Willemsen// appendFloatSliceValue encodes a []float32 value as a repeated Float.
3888*1c12ee1eSDan Willemsenfunc appendFloatSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3889*1c12ee1eSDan Willemsen	list := listv.List()
3890*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
3891*1c12ee1eSDan Willemsen		v := list.Get(i)
3892*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
3893*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
3894*1c12ee1eSDan Willemsen	}
3895*1c12ee1eSDan Willemsen	return b, nil
3896*1c12ee1eSDan Willemsen}
3897*1c12ee1eSDan Willemsen
3898*1c12ee1eSDan Willemsen// consumeFloatSliceValue wire decodes a []float32 value as a repeated Float.
3899*1c12ee1eSDan Willemsenfunc consumeFloatSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
3900*1c12ee1eSDan Willemsen	list := listv.List()
3901*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
3902*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
3903*1c12ee1eSDan Willemsen		if n < 0 {
3904*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
3905*1c12ee1eSDan Willemsen		}
3906*1c12ee1eSDan Willemsen		for len(b) > 0 {
3907*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed32(b)
3908*1c12ee1eSDan Willemsen			if n < 0 {
3909*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
3910*1c12ee1eSDan Willemsen			}
3911*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
3912*1c12ee1eSDan Willemsen			b = b[n:]
3913*1c12ee1eSDan Willemsen		}
3914*1c12ee1eSDan Willemsen		out.n = n
3915*1c12ee1eSDan Willemsen		return listv, out, nil
3916*1c12ee1eSDan Willemsen	}
3917*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed32Type {
3918*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
3919*1c12ee1eSDan Willemsen	}
3920*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed32(b)
3921*1c12ee1eSDan Willemsen	if n < 0 {
3922*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
3923*1c12ee1eSDan Willemsen	}
3924*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
3925*1c12ee1eSDan Willemsen	out.n = n
3926*1c12ee1eSDan Willemsen	return listv, out, nil
3927*1c12ee1eSDan Willemsen}
3928*1c12ee1eSDan Willemsen
3929*1c12ee1eSDan Willemsenvar coderFloatSliceValue = valueCoderFuncs{
3930*1c12ee1eSDan Willemsen	size:      sizeFloatSliceValue,
3931*1c12ee1eSDan Willemsen	marshal:   appendFloatSliceValue,
3932*1c12ee1eSDan Willemsen	unmarshal: consumeFloatSliceValue,
3933*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3934*1c12ee1eSDan Willemsen}
3935*1c12ee1eSDan Willemsen
3936*1c12ee1eSDan Willemsen// sizeFloatPackedSliceValue returns the size of wire encoding a []float32 value as a packed repeated Float.
3937*1c12ee1eSDan Willemsenfunc sizeFloatPackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
3938*1c12ee1eSDan Willemsen	list := listv.List()
3939*1c12ee1eSDan Willemsen	llen := list.Len()
3940*1c12ee1eSDan Willemsen	if llen == 0 {
3941*1c12ee1eSDan Willemsen		return 0
3942*1c12ee1eSDan Willemsen	}
3943*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed32()
3944*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
3945*1c12ee1eSDan Willemsen}
3946*1c12ee1eSDan Willemsen
3947*1c12ee1eSDan Willemsen// appendFloatPackedSliceValue encodes a []float32 value as a packed repeated Float.
3948*1c12ee1eSDan Willemsenfunc appendFloatPackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
3949*1c12ee1eSDan Willemsen	list := listv.List()
3950*1c12ee1eSDan Willemsen	llen := list.Len()
3951*1c12ee1eSDan Willemsen	if llen == 0 {
3952*1c12ee1eSDan Willemsen		return b, nil
3953*1c12ee1eSDan Willemsen	}
3954*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
3955*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed32()
3956*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
3957*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
3958*1c12ee1eSDan Willemsen		v := list.Get(i)
3959*1c12ee1eSDan Willemsen		b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
3960*1c12ee1eSDan Willemsen	}
3961*1c12ee1eSDan Willemsen	return b, nil
3962*1c12ee1eSDan Willemsen}
3963*1c12ee1eSDan Willemsen
3964*1c12ee1eSDan Willemsenvar coderFloatPackedSliceValue = valueCoderFuncs{
3965*1c12ee1eSDan Willemsen	size:      sizeFloatPackedSliceValue,
3966*1c12ee1eSDan Willemsen	marshal:   appendFloatPackedSliceValue,
3967*1c12ee1eSDan Willemsen	unmarshal: consumeFloatSliceValue,
3968*1c12ee1eSDan Willemsen	merge:     mergeListValue,
3969*1c12ee1eSDan Willemsen}
3970*1c12ee1eSDan Willemsen
3971*1c12ee1eSDan Willemsen// sizeSfixed64 returns the size of wire encoding a int64 pointer as a Sfixed64.
3972*1c12ee1eSDan Willemsenfunc sizeSfixed64(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
3973*1c12ee1eSDan Willemsen
3974*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
3975*1c12ee1eSDan Willemsen}
3976*1c12ee1eSDan Willemsen
3977*1c12ee1eSDan Willemsen// appendSfixed64 wire encodes a int64 pointer as a Sfixed64.
3978*1c12ee1eSDan Willemsenfunc appendSfixed64(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
3979*1c12ee1eSDan Willemsen	v := *p.Int64()
3980*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
3981*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, uint64(v))
3982*1c12ee1eSDan Willemsen	return b, nil
3983*1c12ee1eSDan Willemsen}
3984*1c12ee1eSDan Willemsen
3985*1c12ee1eSDan Willemsen// consumeSfixed64 wire decodes a int64 pointer as a Sfixed64.
3986*1c12ee1eSDan Willemsenfunc consumeSfixed64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
3987*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
3988*1c12ee1eSDan Willemsen		return out, errUnknown
3989*1c12ee1eSDan Willemsen	}
3990*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
3991*1c12ee1eSDan Willemsen	if n < 0 {
3992*1c12ee1eSDan Willemsen		return out, errDecode
3993*1c12ee1eSDan Willemsen	}
3994*1c12ee1eSDan Willemsen	*p.Int64() = int64(v)
3995*1c12ee1eSDan Willemsen	out.n = n
3996*1c12ee1eSDan Willemsen	return out, nil
3997*1c12ee1eSDan Willemsen}
3998*1c12ee1eSDan Willemsen
3999*1c12ee1eSDan Willemsenvar coderSfixed64 = pointerCoderFuncs{
4000*1c12ee1eSDan Willemsen	size:      sizeSfixed64,
4001*1c12ee1eSDan Willemsen	marshal:   appendSfixed64,
4002*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64,
4003*1c12ee1eSDan Willemsen	merge:     mergeInt64,
4004*1c12ee1eSDan Willemsen}
4005*1c12ee1eSDan Willemsen
4006*1c12ee1eSDan Willemsen// sizeSfixed64NoZero returns the size of wire encoding a int64 pointer as a Sfixed64.
4007*1c12ee1eSDan Willemsen// The zero value is not encoded.
4008*1c12ee1eSDan Willemsenfunc sizeSfixed64NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4009*1c12ee1eSDan Willemsen	v := *p.Int64()
4010*1c12ee1eSDan Willemsen	if v == 0 {
4011*1c12ee1eSDan Willemsen		return 0
4012*1c12ee1eSDan Willemsen	}
4013*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4014*1c12ee1eSDan Willemsen}
4015*1c12ee1eSDan Willemsen
4016*1c12ee1eSDan Willemsen// appendSfixed64NoZero wire encodes a int64 pointer as a Sfixed64.
4017*1c12ee1eSDan Willemsen// The zero value is not encoded.
4018*1c12ee1eSDan Willemsenfunc appendSfixed64NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4019*1c12ee1eSDan Willemsen	v := *p.Int64()
4020*1c12ee1eSDan Willemsen	if v == 0 {
4021*1c12ee1eSDan Willemsen		return b, nil
4022*1c12ee1eSDan Willemsen	}
4023*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4024*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, uint64(v))
4025*1c12ee1eSDan Willemsen	return b, nil
4026*1c12ee1eSDan Willemsen}
4027*1c12ee1eSDan Willemsen
4028*1c12ee1eSDan Willemsenvar coderSfixed64NoZero = pointerCoderFuncs{
4029*1c12ee1eSDan Willemsen	size:      sizeSfixed64NoZero,
4030*1c12ee1eSDan Willemsen	marshal:   appendSfixed64NoZero,
4031*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64,
4032*1c12ee1eSDan Willemsen	merge:     mergeInt64NoZero,
4033*1c12ee1eSDan Willemsen}
4034*1c12ee1eSDan Willemsen
4035*1c12ee1eSDan Willemsen// sizeSfixed64Ptr returns the size of wire encoding a *int64 pointer as a Sfixed64.
4036*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
4037*1c12ee1eSDan Willemsenfunc sizeSfixed64Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4038*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4039*1c12ee1eSDan Willemsen}
4040*1c12ee1eSDan Willemsen
4041*1c12ee1eSDan Willemsen// appendSfixed64Ptr wire encodes a *int64 pointer as a Sfixed64.
4042*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
4043*1c12ee1eSDan Willemsenfunc appendSfixed64Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4044*1c12ee1eSDan Willemsen	v := **p.Int64Ptr()
4045*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4046*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, uint64(v))
4047*1c12ee1eSDan Willemsen	return b, nil
4048*1c12ee1eSDan Willemsen}
4049*1c12ee1eSDan Willemsen
4050*1c12ee1eSDan Willemsen// consumeSfixed64Ptr wire decodes a *int64 pointer as a Sfixed64.
4051*1c12ee1eSDan Willemsenfunc consumeSfixed64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4052*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4053*1c12ee1eSDan Willemsen		return out, errUnknown
4054*1c12ee1eSDan Willemsen	}
4055*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4056*1c12ee1eSDan Willemsen	if n < 0 {
4057*1c12ee1eSDan Willemsen		return out, errDecode
4058*1c12ee1eSDan Willemsen	}
4059*1c12ee1eSDan Willemsen	vp := p.Int64Ptr()
4060*1c12ee1eSDan Willemsen	if *vp == nil {
4061*1c12ee1eSDan Willemsen		*vp = new(int64)
4062*1c12ee1eSDan Willemsen	}
4063*1c12ee1eSDan Willemsen	**vp = int64(v)
4064*1c12ee1eSDan Willemsen	out.n = n
4065*1c12ee1eSDan Willemsen	return out, nil
4066*1c12ee1eSDan Willemsen}
4067*1c12ee1eSDan Willemsen
4068*1c12ee1eSDan Willemsenvar coderSfixed64Ptr = pointerCoderFuncs{
4069*1c12ee1eSDan Willemsen	size:      sizeSfixed64Ptr,
4070*1c12ee1eSDan Willemsen	marshal:   appendSfixed64Ptr,
4071*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64Ptr,
4072*1c12ee1eSDan Willemsen	merge:     mergeInt64Ptr,
4073*1c12ee1eSDan Willemsen}
4074*1c12ee1eSDan Willemsen
4075*1c12ee1eSDan Willemsen// sizeSfixed64Slice returns the size of wire encoding a []int64 pointer as a repeated Sfixed64.
4076*1c12ee1eSDan Willemsenfunc sizeSfixed64Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4077*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
4078*1c12ee1eSDan Willemsen	size = len(s) * (f.tagsize + protowire.SizeFixed64())
4079*1c12ee1eSDan Willemsen	return size
4080*1c12ee1eSDan Willemsen}
4081*1c12ee1eSDan Willemsen
4082*1c12ee1eSDan Willemsen// appendSfixed64Slice encodes a []int64 pointer as a repeated Sfixed64.
4083*1c12ee1eSDan Willemsenfunc appendSfixed64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4084*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
4085*1c12ee1eSDan Willemsen	for _, v := range s {
4086*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
4087*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, uint64(v))
4088*1c12ee1eSDan Willemsen	}
4089*1c12ee1eSDan Willemsen	return b, nil
4090*1c12ee1eSDan Willemsen}
4091*1c12ee1eSDan Willemsen
4092*1c12ee1eSDan Willemsen// consumeSfixed64Slice wire decodes a []int64 pointer as a repeated Sfixed64.
4093*1c12ee1eSDan Willemsenfunc consumeSfixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4094*1c12ee1eSDan Willemsen	sp := p.Int64Slice()
4095*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
4096*1c12ee1eSDan Willemsen		s := *sp
4097*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
4098*1c12ee1eSDan Willemsen		if n < 0 {
4099*1c12ee1eSDan Willemsen			return out, errDecode
4100*1c12ee1eSDan Willemsen		}
4101*1c12ee1eSDan Willemsen		for len(b) > 0 {
4102*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed64(b)
4103*1c12ee1eSDan Willemsen			if n < 0 {
4104*1c12ee1eSDan Willemsen				return out, errDecode
4105*1c12ee1eSDan Willemsen			}
4106*1c12ee1eSDan Willemsen			s = append(s, int64(v))
4107*1c12ee1eSDan Willemsen			b = b[n:]
4108*1c12ee1eSDan Willemsen		}
4109*1c12ee1eSDan Willemsen		*sp = s
4110*1c12ee1eSDan Willemsen		out.n = n
4111*1c12ee1eSDan Willemsen		return out, nil
4112*1c12ee1eSDan Willemsen	}
4113*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4114*1c12ee1eSDan Willemsen		return out, errUnknown
4115*1c12ee1eSDan Willemsen	}
4116*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4117*1c12ee1eSDan Willemsen	if n < 0 {
4118*1c12ee1eSDan Willemsen		return out, errDecode
4119*1c12ee1eSDan Willemsen	}
4120*1c12ee1eSDan Willemsen	*sp = append(*sp, int64(v))
4121*1c12ee1eSDan Willemsen	out.n = n
4122*1c12ee1eSDan Willemsen	return out, nil
4123*1c12ee1eSDan Willemsen}
4124*1c12ee1eSDan Willemsen
4125*1c12ee1eSDan Willemsenvar coderSfixed64Slice = pointerCoderFuncs{
4126*1c12ee1eSDan Willemsen	size:      sizeSfixed64Slice,
4127*1c12ee1eSDan Willemsen	marshal:   appendSfixed64Slice,
4128*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64Slice,
4129*1c12ee1eSDan Willemsen	merge:     mergeInt64Slice,
4130*1c12ee1eSDan Willemsen}
4131*1c12ee1eSDan Willemsen
4132*1c12ee1eSDan Willemsen// sizeSfixed64PackedSlice returns the size of wire encoding a []int64 pointer as a packed repeated Sfixed64.
4133*1c12ee1eSDan Willemsenfunc sizeSfixed64PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4134*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
4135*1c12ee1eSDan Willemsen	if len(s) == 0 {
4136*1c12ee1eSDan Willemsen		return 0
4137*1c12ee1eSDan Willemsen	}
4138*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed64()
4139*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
4140*1c12ee1eSDan Willemsen}
4141*1c12ee1eSDan Willemsen
4142*1c12ee1eSDan Willemsen// appendSfixed64PackedSlice encodes a []int64 pointer as a packed repeated Sfixed64.
4143*1c12ee1eSDan Willemsenfunc appendSfixed64PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4144*1c12ee1eSDan Willemsen	s := *p.Int64Slice()
4145*1c12ee1eSDan Willemsen	if len(s) == 0 {
4146*1c12ee1eSDan Willemsen		return b, nil
4147*1c12ee1eSDan Willemsen	}
4148*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4149*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed64()
4150*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
4151*1c12ee1eSDan Willemsen	for _, v := range s {
4152*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, uint64(v))
4153*1c12ee1eSDan Willemsen	}
4154*1c12ee1eSDan Willemsen	return b, nil
4155*1c12ee1eSDan Willemsen}
4156*1c12ee1eSDan Willemsen
4157*1c12ee1eSDan Willemsenvar coderSfixed64PackedSlice = pointerCoderFuncs{
4158*1c12ee1eSDan Willemsen	size:      sizeSfixed64PackedSlice,
4159*1c12ee1eSDan Willemsen	marshal:   appendSfixed64PackedSlice,
4160*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64Slice,
4161*1c12ee1eSDan Willemsen	merge:     mergeInt64Slice,
4162*1c12ee1eSDan Willemsen}
4163*1c12ee1eSDan Willemsen
4164*1c12ee1eSDan Willemsen// sizeSfixed64Value returns the size of wire encoding a int64 value as a Sfixed64.
4165*1c12ee1eSDan Willemsenfunc sizeSfixed64Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
4166*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeFixed64()
4167*1c12ee1eSDan Willemsen}
4168*1c12ee1eSDan Willemsen
4169*1c12ee1eSDan Willemsen// appendSfixed64Value encodes a int64 value as a Sfixed64.
4170*1c12ee1eSDan Willemsenfunc appendSfixed64Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4171*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
4172*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, uint64(v.Int()))
4173*1c12ee1eSDan Willemsen	return b, nil
4174*1c12ee1eSDan Willemsen}
4175*1c12ee1eSDan Willemsen
4176*1c12ee1eSDan Willemsen// consumeSfixed64Value decodes a int64 value as a Sfixed64.
4177*1c12ee1eSDan Willemsenfunc consumeSfixed64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
4178*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4179*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
4180*1c12ee1eSDan Willemsen	}
4181*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4182*1c12ee1eSDan Willemsen	if n < 0 {
4183*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
4184*1c12ee1eSDan Willemsen	}
4185*1c12ee1eSDan Willemsen	out.n = n
4186*1c12ee1eSDan Willemsen	return protoreflect.ValueOfInt64(int64(v)), out, nil
4187*1c12ee1eSDan Willemsen}
4188*1c12ee1eSDan Willemsen
4189*1c12ee1eSDan Willemsenvar coderSfixed64Value = valueCoderFuncs{
4190*1c12ee1eSDan Willemsen	size:      sizeSfixed64Value,
4191*1c12ee1eSDan Willemsen	marshal:   appendSfixed64Value,
4192*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64Value,
4193*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
4194*1c12ee1eSDan Willemsen}
4195*1c12ee1eSDan Willemsen
4196*1c12ee1eSDan Willemsen// sizeSfixed64SliceValue returns the size of wire encoding a []int64 value as a repeated Sfixed64.
4197*1c12ee1eSDan Willemsenfunc sizeSfixed64SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
4198*1c12ee1eSDan Willemsen	list := listv.List()
4199*1c12ee1eSDan Willemsen	size = list.Len() * (tagsize + protowire.SizeFixed64())
4200*1c12ee1eSDan Willemsen	return size
4201*1c12ee1eSDan Willemsen}
4202*1c12ee1eSDan Willemsen
4203*1c12ee1eSDan Willemsen// appendSfixed64SliceValue encodes a []int64 value as a repeated Sfixed64.
4204*1c12ee1eSDan Willemsenfunc appendSfixed64SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4205*1c12ee1eSDan Willemsen	list := listv.List()
4206*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
4207*1c12ee1eSDan Willemsen		v := list.Get(i)
4208*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
4209*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, uint64(v.Int()))
4210*1c12ee1eSDan Willemsen	}
4211*1c12ee1eSDan Willemsen	return b, nil
4212*1c12ee1eSDan Willemsen}
4213*1c12ee1eSDan Willemsen
4214*1c12ee1eSDan Willemsen// consumeSfixed64SliceValue wire decodes a []int64 value as a repeated Sfixed64.
4215*1c12ee1eSDan Willemsenfunc consumeSfixed64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
4216*1c12ee1eSDan Willemsen	list := listv.List()
4217*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
4218*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
4219*1c12ee1eSDan Willemsen		if n < 0 {
4220*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
4221*1c12ee1eSDan Willemsen		}
4222*1c12ee1eSDan Willemsen		for len(b) > 0 {
4223*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed64(b)
4224*1c12ee1eSDan Willemsen			if n < 0 {
4225*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
4226*1c12ee1eSDan Willemsen			}
4227*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfInt64(int64(v)))
4228*1c12ee1eSDan Willemsen			b = b[n:]
4229*1c12ee1eSDan Willemsen		}
4230*1c12ee1eSDan Willemsen		out.n = n
4231*1c12ee1eSDan Willemsen		return listv, out, nil
4232*1c12ee1eSDan Willemsen	}
4233*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4234*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
4235*1c12ee1eSDan Willemsen	}
4236*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4237*1c12ee1eSDan Willemsen	if n < 0 {
4238*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
4239*1c12ee1eSDan Willemsen	}
4240*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfInt64(int64(v)))
4241*1c12ee1eSDan Willemsen	out.n = n
4242*1c12ee1eSDan Willemsen	return listv, out, nil
4243*1c12ee1eSDan Willemsen}
4244*1c12ee1eSDan Willemsen
4245*1c12ee1eSDan Willemsenvar coderSfixed64SliceValue = valueCoderFuncs{
4246*1c12ee1eSDan Willemsen	size:      sizeSfixed64SliceValue,
4247*1c12ee1eSDan Willemsen	marshal:   appendSfixed64SliceValue,
4248*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64SliceValue,
4249*1c12ee1eSDan Willemsen	merge:     mergeListValue,
4250*1c12ee1eSDan Willemsen}
4251*1c12ee1eSDan Willemsen
4252*1c12ee1eSDan Willemsen// sizeSfixed64PackedSliceValue returns the size of wire encoding a []int64 value as a packed repeated Sfixed64.
4253*1c12ee1eSDan Willemsenfunc sizeSfixed64PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
4254*1c12ee1eSDan Willemsen	list := listv.List()
4255*1c12ee1eSDan Willemsen	llen := list.Len()
4256*1c12ee1eSDan Willemsen	if llen == 0 {
4257*1c12ee1eSDan Willemsen		return 0
4258*1c12ee1eSDan Willemsen	}
4259*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed64()
4260*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
4261*1c12ee1eSDan Willemsen}
4262*1c12ee1eSDan Willemsen
4263*1c12ee1eSDan Willemsen// appendSfixed64PackedSliceValue encodes a []int64 value as a packed repeated Sfixed64.
4264*1c12ee1eSDan Willemsenfunc appendSfixed64PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4265*1c12ee1eSDan Willemsen	list := listv.List()
4266*1c12ee1eSDan Willemsen	llen := list.Len()
4267*1c12ee1eSDan Willemsen	if llen == 0 {
4268*1c12ee1eSDan Willemsen		return b, nil
4269*1c12ee1eSDan Willemsen	}
4270*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
4271*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed64()
4272*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
4273*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
4274*1c12ee1eSDan Willemsen		v := list.Get(i)
4275*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, uint64(v.Int()))
4276*1c12ee1eSDan Willemsen	}
4277*1c12ee1eSDan Willemsen	return b, nil
4278*1c12ee1eSDan Willemsen}
4279*1c12ee1eSDan Willemsen
4280*1c12ee1eSDan Willemsenvar coderSfixed64PackedSliceValue = valueCoderFuncs{
4281*1c12ee1eSDan Willemsen	size:      sizeSfixed64PackedSliceValue,
4282*1c12ee1eSDan Willemsen	marshal:   appendSfixed64PackedSliceValue,
4283*1c12ee1eSDan Willemsen	unmarshal: consumeSfixed64SliceValue,
4284*1c12ee1eSDan Willemsen	merge:     mergeListValue,
4285*1c12ee1eSDan Willemsen}
4286*1c12ee1eSDan Willemsen
4287*1c12ee1eSDan Willemsen// sizeFixed64 returns the size of wire encoding a uint64 pointer as a Fixed64.
4288*1c12ee1eSDan Willemsenfunc sizeFixed64(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4289*1c12ee1eSDan Willemsen
4290*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4291*1c12ee1eSDan Willemsen}
4292*1c12ee1eSDan Willemsen
4293*1c12ee1eSDan Willemsen// appendFixed64 wire encodes a uint64 pointer as a Fixed64.
4294*1c12ee1eSDan Willemsenfunc appendFixed64(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4295*1c12ee1eSDan Willemsen	v := *p.Uint64()
4296*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4297*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, v)
4298*1c12ee1eSDan Willemsen	return b, nil
4299*1c12ee1eSDan Willemsen}
4300*1c12ee1eSDan Willemsen
4301*1c12ee1eSDan Willemsen// consumeFixed64 wire decodes a uint64 pointer as a Fixed64.
4302*1c12ee1eSDan Willemsenfunc consumeFixed64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4303*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4304*1c12ee1eSDan Willemsen		return out, errUnknown
4305*1c12ee1eSDan Willemsen	}
4306*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4307*1c12ee1eSDan Willemsen	if n < 0 {
4308*1c12ee1eSDan Willemsen		return out, errDecode
4309*1c12ee1eSDan Willemsen	}
4310*1c12ee1eSDan Willemsen	*p.Uint64() = v
4311*1c12ee1eSDan Willemsen	out.n = n
4312*1c12ee1eSDan Willemsen	return out, nil
4313*1c12ee1eSDan Willemsen}
4314*1c12ee1eSDan Willemsen
4315*1c12ee1eSDan Willemsenvar coderFixed64 = pointerCoderFuncs{
4316*1c12ee1eSDan Willemsen	size:      sizeFixed64,
4317*1c12ee1eSDan Willemsen	marshal:   appendFixed64,
4318*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64,
4319*1c12ee1eSDan Willemsen	merge:     mergeUint64,
4320*1c12ee1eSDan Willemsen}
4321*1c12ee1eSDan Willemsen
4322*1c12ee1eSDan Willemsen// sizeFixed64NoZero returns the size of wire encoding a uint64 pointer as a Fixed64.
4323*1c12ee1eSDan Willemsen// The zero value is not encoded.
4324*1c12ee1eSDan Willemsenfunc sizeFixed64NoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4325*1c12ee1eSDan Willemsen	v := *p.Uint64()
4326*1c12ee1eSDan Willemsen	if v == 0 {
4327*1c12ee1eSDan Willemsen		return 0
4328*1c12ee1eSDan Willemsen	}
4329*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4330*1c12ee1eSDan Willemsen}
4331*1c12ee1eSDan Willemsen
4332*1c12ee1eSDan Willemsen// appendFixed64NoZero wire encodes a uint64 pointer as a Fixed64.
4333*1c12ee1eSDan Willemsen// The zero value is not encoded.
4334*1c12ee1eSDan Willemsenfunc appendFixed64NoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4335*1c12ee1eSDan Willemsen	v := *p.Uint64()
4336*1c12ee1eSDan Willemsen	if v == 0 {
4337*1c12ee1eSDan Willemsen		return b, nil
4338*1c12ee1eSDan Willemsen	}
4339*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4340*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, v)
4341*1c12ee1eSDan Willemsen	return b, nil
4342*1c12ee1eSDan Willemsen}
4343*1c12ee1eSDan Willemsen
4344*1c12ee1eSDan Willemsenvar coderFixed64NoZero = pointerCoderFuncs{
4345*1c12ee1eSDan Willemsen	size:      sizeFixed64NoZero,
4346*1c12ee1eSDan Willemsen	marshal:   appendFixed64NoZero,
4347*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64,
4348*1c12ee1eSDan Willemsen	merge:     mergeUint64NoZero,
4349*1c12ee1eSDan Willemsen}
4350*1c12ee1eSDan Willemsen
4351*1c12ee1eSDan Willemsen// sizeFixed64Ptr returns the size of wire encoding a *uint64 pointer as a Fixed64.
4352*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
4353*1c12ee1eSDan Willemsenfunc sizeFixed64Ptr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4354*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4355*1c12ee1eSDan Willemsen}
4356*1c12ee1eSDan Willemsen
4357*1c12ee1eSDan Willemsen// appendFixed64Ptr wire encodes a *uint64 pointer as a Fixed64.
4358*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
4359*1c12ee1eSDan Willemsenfunc appendFixed64Ptr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4360*1c12ee1eSDan Willemsen	v := **p.Uint64Ptr()
4361*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4362*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, v)
4363*1c12ee1eSDan Willemsen	return b, nil
4364*1c12ee1eSDan Willemsen}
4365*1c12ee1eSDan Willemsen
4366*1c12ee1eSDan Willemsen// consumeFixed64Ptr wire decodes a *uint64 pointer as a Fixed64.
4367*1c12ee1eSDan Willemsenfunc consumeFixed64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4368*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4369*1c12ee1eSDan Willemsen		return out, errUnknown
4370*1c12ee1eSDan Willemsen	}
4371*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4372*1c12ee1eSDan Willemsen	if n < 0 {
4373*1c12ee1eSDan Willemsen		return out, errDecode
4374*1c12ee1eSDan Willemsen	}
4375*1c12ee1eSDan Willemsen	vp := p.Uint64Ptr()
4376*1c12ee1eSDan Willemsen	if *vp == nil {
4377*1c12ee1eSDan Willemsen		*vp = new(uint64)
4378*1c12ee1eSDan Willemsen	}
4379*1c12ee1eSDan Willemsen	**vp = v
4380*1c12ee1eSDan Willemsen	out.n = n
4381*1c12ee1eSDan Willemsen	return out, nil
4382*1c12ee1eSDan Willemsen}
4383*1c12ee1eSDan Willemsen
4384*1c12ee1eSDan Willemsenvar coderFixed64Ptr = pointerCoderFuncs{
4385*1c12ee1eSDan Willemsen	size:      sizeFixed64Ptr,
4386*1c12ee1eSDan Willemsen	marshal:   appendFixed64Ptr,
4387*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64Ptr,
4388*1c12ee1eSDan Willemsen	merge:     mergeUint64Ptr,
4389*1c12ee1eSDan Willemsen}
4390*1c12ee1eSDan Willemsen
4391*1c12ee1eSDan Willemsen// sizeFixed64Slice returns the size of wire encoding a []uint64 pointer as a repeated Fixed64.
4392*1c12ee1eSDan Willemsenfunc sizeFixed64Slice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4393*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
4394*1c12ee1eSDan Willemsen	size = len(s) * (f.tagsize + protowire.SizeFixed64())
4395*1c12ee1eSDan Willemsen	return size
4396*1c12ee1eSDan Willemsen}
4397*1c12ee1eSDan Willemsen
4398*1c12ee1eSDan Willemsen// appendFixed64Slice encodes a []uint64 pointer as a repeated Fixed64.
4399*1c12ee1eSDan Willemsenfunc appendFixed64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4400*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
4401*1c12ee1eSDan Willemsen	for _, v := range s {
4402*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
4403*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, v)
4404*1c12ee1eSDan Willemsen	}
4405*1c12ee1eSDan Willemsen	return b, nil
4406*1c12ee1eSDan Willemsen}
4407*1c12ee1eSDan Willemsen
4408*1c12ee1eSDan Willemsen// consumeFixed64Slice wire decodes a []uint64 pointer as a repeated Fixed64.
4409*1c12ee1eSDan Willemsenfunc consumeFixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4410*1c12ee1eSDan Willemsen	sp := p.Uint64Slice()
4411*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
4412*1c12ee1eSDan Willemsen		s := *sp
4413*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
4414*1c12ee1eSDan Willemsen		if n < 0 {
4415*1c12ee1eSDan Willemsen			return out, errDecode
4416*1c12ee1eSDan Willemsen		}
4417*1c12ee1eSDan Willemsen		for len(b) > 0 {
4418*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed64(b)
4419*1c12ee1eSDan Willemsen			if n < 0 {
4420*1c12ee1eSDan Willemsen				return out, errDecode
4421*1c12ee1eSDan Willemsen			}
4422*1c12ee1eSDan Willemsen			s = append(s, v)
4423*1c12ee1eSDan Willemsen			b = b[n:]
4424*1c12ee1eSDan Willemsen		}
4425*1c12ee1eSDan Willemsen		*sp = s
4426*1c12ee1eSDan Willemsen		out.n = n
4427*1c12ee1eSDan Willemsen		return out, nil
4428*1c12ee1eSDan Willemsen	}
4429*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4430*1c12ee1eSDan Willemsen		return out, errUnknown
4431*1c12ee1eSDan Willemsen	}
4432*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4433*1c12ee1eSDan Willemsen	if n < 0 {
4434*1c12ee1eSDan Willemsen		return out, errDecode
4435*1c12ee1eSDan Willemsen	}
4436*1c12ee1eSDan Willemsen	*sp = append(*sp, v)
4437*1c12ee1eSDan Willemsen	out.n = n
4438*1c12ee1eSDan Willemsen	return out, nil
4439*1c12ee1eSDan Willemsen}
4440*1c12ee1eSDan Willemsen
4441*1c12ee1eSDan Willemsenvar coderFixed64Slice = pointerCoderFuncs{
4442*1c12ee1eSDan Willemsen	size:      sizeFixed64Slice,
4443*1c12ee1eSDan Willemsen	marshal:   appendFixed64Slice,
4444*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64Slice,
4445*1c12ee1eSDan Willemsen	merge:     mergeUint64Slice,
4446*1c12ee1eSDan Willemsen}
4447*1c12ee1eSDan Willemsen
4448*1c12ee1eSDan Willemsen// sizeFixed64PackedSlice returns the size of wire encoding a []uint64 pointer as a packed repeated Fixed64.
4449*1c12ee1eSDan Willemsenfunc sizeFixed64PackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4450*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
4451*1c12ee1eSDan Willemsen	if len(s) == 0 {
4452*1c12ee1eSDan Willemsen		return 0
4453*1c12ee1eSDan Willemsen	}
4454*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed64()
4455*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
4456*1c12ee1eSDan Willemsen}
4457*1c12ee1eSDan Willemsen
4458*1c12ee1eSDan Willemsen// appendFixed64PackedSlice encodes a []uint64 pointer as a packed repeated Fixed64.
4459*1c12ee1eSDan Willemsenfunc appendFixed64PackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4460*1c12ee1eSDan Willemsen	s := *p.Uint64Slice()
4461*1c12ee1eSDan Willemsen	if len(s) == 0 {
4462*1c12ee1eSDan Willemsen		return b, nil
4463*1c12ee1eSDan Willemsen	}
4464*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4465*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed64()
4466*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
4467*1c12ee1eSDan Willemsen	for _, v := range s {
4468*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, v)
4469*1c12ee1eSDan Willemsen	}
4470*1c12ee1eSDan Willemsen	return b, nil
4471*1c12ee1eSDan Willemsen}
4472*1c12ee1eSDan Willemsen
4473*1c12ee1eSDan Willemsenvar coderFixed64PackedSlice = pointerCoderFuncs{
4474*1c12ee1eSDan Willemsen	size:      sizeFixed64PackedSlice,
4475*1c12ee1eSDan Willemsen	marshal:   appendFixed64PackedSlice,
4476*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64Slice,
4477*1c12ee1eSDan Willemsen	merge:     mergeUint64Slice,
4478*1c12ee1eSDan Willemsen}
4479*1c12ee1eSDan Willemsen
4480*1c12ee1eSDan Willemsen// sizeFixed64Value returns the size of wire encoding a uint64 value as a Fixed64.
4481*1c12ee1eSDan Willemsenfunc sizeFixed64Value(v protoreflect.Value, tagsize int, opts marshalOptions) int {
4482*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeFixed64()
4483*1c12ee1eSDan Willemsen}
4484*1c12ee1eSDan Willemsen
4485*1c12ee1eSDan Willemsen// appendFixed64Value encodes a uint64 value as a Fixed64.
4486*1c12ee1eSDan Willemsenfunc appendFixed64Value(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4487*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
4488*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, v.Uint())
4489*1c12ee1eSDan Willemsen	return b, nil
4490*1c12ee1eSDan Willemsen}
4491*1c12ee1eSDan Willemsen
4492*1c12ee1eSDan Willemsen// consumeFixed64Value decodes a uint64 value as a Fixed64.
4493*1c12ee1eSDan Willemsenfunc consumeFixed64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
4494*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4495*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
4496*1c12ee1eSDan Willemsen	}
4497*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4498*1c12ee1eSDan Willemsen	if n < 0 {
4499*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
4500*1c12ee1eSDan Willemsen	}
4501*1c12ee1eSDan Willemsen	out.n = n
4502*1c12ee1eSDan Willemsen	return protoreflect.ValueOfUint64(v), out, nil
4503*1c12ee1eSDan Willemsen}
4504*1c12ee1eSDan Willemsen
4505*1c12ee1eSDan Willemsenvar coderFixed64Value = valueCoderFuncs{
4506*1c12ee1eSDan Willemsen	size:      sizeFixed64Value,
4507*1c12ee1eSDan Willemsen	marshal:   appendFixed64Value,
4508*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64Value,
4509*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
4510*1c12ee1eSDan Willemsen}
4511*1c12ee1eSDan Willemsen
4512*1c12ee1eSDan Willemsen// sizeFixed64SliceValue returns the size of wire encoding a []uint64 value as a repeated Fixed64.
4513*1c12ee1eSDan Willemsenfunc sizeFixed64SliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
4514*1c12ee1eSDan Willemsen	list := listv.List()
4515*1c12ee1eSDan Willemsen	size = list.Len() * (tagsize + protowire.SizeFixed64())
4516*1c12ee1eSDan Willemsen	return size
4517*1c12ee1eSDan Willemsen}
4518*1c12ee1eSDan Willemsen
4519*1c12ee1eSDan Willemsen// appendFixed64SliceValue encodes a []uint64 value as a repeated Fixed64.
4520*1c12ee1eSDan Willemsenfunc appendFixed64SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4521*1c12ee1eSDan Willemsen	list := listv.List()
4522*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
4523*1c12ee1eSDan Willemsen		v := list.Get(i)
4524*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
4525*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, v.Uint())
4526*1c12ee1eSDan Willemsen	}
4527*1c12ee1eSDan Willemsen	return b, nil
4528*1c12ee1eSDan Willemsen}
4529*1c12ee1eSDan Willemsen
4530*1c12ee1eSDan Willemsen// consumeFixed64SliceValue wire decodes a []uint64 value as a repeated Fixed64.
4531*1c12ee1eSDan Willemsenfunc consumeFixed64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
4532*1c12ee1eSDan Willemsen	list := listv.List()
4533*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
4534*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
4535*1c12ee1eSDan Willemsen		if n < 0 {
4536*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
4537*1c12ee1eSDan Willemsen		}
4538*1c12ee1eSDan Willemsen		for len(b) > 0 {
4539*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed64(b)
4540*1c12ee1eSDan Willemsen			if n < 0 {
4541*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
4542*1c12ee1eSDan Willemsen			}
4543*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfUint64(v))
4544*1c12ee1eSDan Willemsen			b = b[n:]
4545*1c12ee1eSDan Willemsen		}
4546*1c12ee1eSDan Willemsen		out.n = n
4547*1c12ee1eSDan Willemsen		return listv, out, nil
4548*1c12ee1eSDan Willemsen	}
4549*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4550*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
4551*1c12ee1eSDan Willemsen	}
4552*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4553*1c12ee1eSDan Willemsen	if n < 0 {
4554*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
4555*1c12ee1eSDan Willemsen	}
4556*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfUint64(v))
4557*1c12ee1eSDan Willemsen	out.n = n
4558*1c12ee1eSDan Willemsen	return listv, out, nil
4559*1c12ee1eSDan Willemsen}
4560*1c12ee1eSDan Willemsen
4561*1c12ee1eSDan Willemsenvar coderFixed64SliceValue = valueCoderFuncs{
4562*1c12ee1eSDan Willemsen	size:      sizeFixed64SliceValue,
4563*1c12ee1eSDan Willemsen	marshal:   appendFixed64SliceValue,
4564*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64SliceValue,
4565*1c12ee1eSDan Willemsen	merge:     mergeListValue,
4566*1c12ee1eSDan Willemsen}
4567*1c12ee1eSDan Willemsen
4568*1c12ee1eSDan Willemsen// sizeFixed64PackedSliceValue returns the size of wire encoding a []uint64 value as a packed repeated Fixed64.
4569*1c12ee1eSDan Willemsenfunc sizeFixed64PackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
4570*1c12ee1eSDan Willemsen	list := listv.List()
4571*1c12ee1eSDan Willemsen	llen := list.Len()
4572*1c12ee1eSDan Willemsen	if llen == 0 {
4573*1c12ee1eSDan Willemsen		return 0
4574*1c12ee1eSDan Willemsen	}
4575*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed64()
4576*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
4577*1c12ee1eSDan Willemsen}
4578*1c12ee1eSDan Willemsen
4579*1c12ee1eSDan Willemsen// appendFixed64PackedSliceValue encodes a []uint64 value as a packed repeated Fixed64.
4580*1c12ee1eSDan Willemsenfunc appendFixed64PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4581*1c12ee1eSDan Willemsen	list := listv.List()
4582*1c12ee1eSDan Willemsen	llen := list.Len()
4583*1c12ee1eSDan Willemsen	if llen == 0 {
4584*1c12ee1eSDan Willemsen		return b, nil
4585*1c12ee1eSDan Willemsen	}
4586*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
4587*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed64()
4588*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
4589*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
4590*1c12ee1eSDan Willemsen		v := list.Get(i)
4591*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, v.Uint())
4592*1c12ee1eSDan Willemsen	}
4593*1c12ee1eSDan Willemsen	return b, nil
4594*1c12ee1eSDan Willemsen}
4595*1c12ee1eSDan Willemsen
4596*1c12ee1eSDan Willemsenvar coderFixed64PackedSliceValue = valueCoderFuncs{
4597*1c12ee1eSDan Willemsen	size:      sizeFixed64PackedSliceValue,
4598*1c12ee1eSDan Willemsen	marshal:   appendFixed64PackedSliceValue,
4599*1c12ee1eSDan Willemsen	unmarshal: consumeFixed64SliceValue,
4600*1c12ee1eSDan Willemsen	merge:     mergeListValue,
4601*1c12ee1eSDan Willemsen}
4602*1c12ee1eSDan Willemsen
4603*1c12ee1eSDan Willemsen// sizeDouble returns the size of wire encoding a float64 pointer as a Double.
4604*1c12ee1eSDan Willemsenfunc sizeDouble(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4605*1c12ee1eSDan Willemsen
4606*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4607*1c12ee1eSDan Willemsen}
4608*1c12ee1eSDan Willemsen
4609*1c12ee1eSDan Willemsen// appendDouble wire encodes a float64 pointer as a Double.
4610*1c12ee1eSDan Willemsenfunc appendDouble(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4611*1c12ee1eSDan Willemsen	v := *p.Float64()
4612*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4613*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, math.Float64bits(v))
4614*1c12ee1eSDan Willemsen	return b, nil
4615*1c12ee1eSDan Willemsen}
4616*1c12ee1eSDan Willemsen
4617*1c12ee1eSDan Willemsen// consumeDouble wire decodes a float64 pointer as a Double.
4618*1c12ee1eSDan Willemsenfunc consumeDouble(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4619*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4620*1c12ee1eSDan Willemsen		return out, errUnknown
4621*1c12ee1eSDan Willemsen	}
4622*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4623*1c12ee1eSDan Willemsen	if n < 0 {
4624*1c12ee1eSDan Willemsen		return out, errDecode
4625*1c12ee1eSDan Willemsen	}
4626*1c12ee1eSDan Willemsen	*p.Float64() = math.Float64frombits(v)
4627*1c12ee1eSDan Willemsen	out.n = n
4628*1c12ee1eSDan Willemsen	return out, nil
4629*1c12ee1eSDan Willemsen}
4630*1c12ee1eSDan Willemsen
4631*1c12ee1eSDan Willemsenvar coderDouble = pointerCoderFuncs{
4632*1c12ee1eSDan Willemsen	size:      sizeDouble,
4633*1c12ee1eSDan Willemsen	marshal:   appendDouble,
4634*1c12ee1eSDan Willemsen	unmarshal: consumeDouble,
4635*1c12ee1eSDan Willemsen	merge:     mergeFloat64,
4636*1c12ee1eSDan Willemsen}
4637*1c12ee1eSDan Willemsen
4638*1c12ee1eSDan Willemsen// sizeDoubleNoZero returns the size of wire encoding a float64 pointer as a Double.
4639*1c12ee1eSDan Willemsen// The zero value is not encoded.
4640*1c12ee1eSDan Willemsenfunc sizeDoubleNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4641*1c12ee1eSDan Willemsen	v := *p.Float64()
4642*1c12ee1eSDan Willemsen	if v == 0 && !math.Signbit(float64(v)) {
4643*1c12ee1eSDan Willemsen		return 0
4644*1c12ee1eSDan Willemsen	}
4645*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4646*1c12ee1eSDan Willemsen}
4647*1c12ee1eSDan Willemsen
4648*1c12ee1eSDan Willemsen// appendDoubleNoZero wire encodes a float64 pointer as a Double.
4649*1c12ee1eSDan Willemsen// The zero value is not encoded.
4650*1c12ee1eSDan Willemsenfunc appendDoubleNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4651*1c12ee1eSDan Willemsen	v := *p.Float64()
4652*1c12ee1eSDan Willemsen	if v == 0 && !math.Signbit(float64(v)) {
4653*1c12ee1eSDan Willemsen		return b, nil
4654*1c12ee1eSDan Willemsen	}
4655*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4656*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, math.Float64bits(v))
4657*1c12ee1eSDan Willemsen	return b, nil
4658*1c12ee1eSDan Willemsen}
4659*1c12ee1eSDan Willemsen
4660*1c12ee1eSDan Willemsenvar coderDoubleNoZero = pointerCoderFuncs{
4661*1c12ee1eSDan Willemsen	size:      sizeDoubleNoZero,
4662*1c12ee1eSDan Willemsen	marshal:   appendDoubleNoZero,
4663*1c12ee1eSDan Willemsen	unmarshal: consumeDouble,
4664*1c12ee1eSDan Willemsen	merge:     mergeFloat64NoZero,
4665*1c12ee1eSDan Willemsen}
4666*1c12ee1eSDan Willemsen
4667*1c12ee1eSDan Willemsen// sizeDoublePtr returns the size of wire encoding a *float64 pointer as a Double.
4668*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
4669*1c12ee1eSDan Willemsenfunc sizeDoublePtr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4670*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeFixed64()
4671*1c12ee1eSDan Willemsen}
4672*1c12ee1eSDan Willemsen
4673*1c12ee1eSDan Willemsen// appendDoublePtr wire encodes a *float64 pointer as a Double.
4674*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
4675*1c12ee1eSDan Willemsenfunc appendDoublePtr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4676*1c12ee1eSDan Willemsen	v := **p.Float64Ptr()
4677*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4678*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, math.Float64bits(v))
4679*1c12ee1eSDan Willemsen	return b, nil
4680*1c12ee1eSDan Willemsen}
4681*1c12ee1eSDan Willemsen
4682*1c12ee1eSDan Willemsen// consumeDoublePtr wire decodes a *float64 pointer as a Double.
4683*1c12ee1eSDan Willemsenfunc consumeDoublePtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4684*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4685*1c12ee1eSDan Willemsen		return out, errUnknown
4686*1c12ee1eSDan Willemsen	}
4687*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4688*1c12ee1eSDan Willemsen	if n < 0 {
4689*1c12ee1eSDan Willemsen		return out, errDecode
4690*1c12ee1eSDan Willemsen	}
4691*1c12ee1eSDan Willemsen	vp := p.Float64Ptr()
4692*1c12ee1eSDan Willemsen	if *vp == nil {
4693*1c12ee1eSDan Willemsen		*vp = new(float64)
4694*1c12ee1eSDan Willemsen	}
4695*1c12ee1eSDan Willemsen	**vp = math.Float64frombits(v)
4696*1c12ee1eSDan Willemsen	out.n = n
4697*1c12ee1eSDan Willemsen	return out, nil
4698*1c12ee1eSDan Willemsen}
4699*1c12ee1eSDan Willemsen
4700*1c12ee1eSDan Willemsenvar coderDoublePtr = pointerCoderFuncs{
4701*1c12ee1eSDan Willemsen	size:      sizeDoublePtr,
4702*1c12ee1eSDan Willemsen	marshal:   appendDoublePtr,
4703*1c12ee1eSDan Willemsen	unmarshal: consumeDoublePtr,
4704*1c12ee1eSDan Willemsen	merge:     mergeFloat64Ptr,
4705*1c12ee1eSDan Willemsen}
4706*1c12ee1eSDan Willemsen
4707*1c12ee1eSDan Willemsen// sizeDoubleSlice returns the size of wire encoding a []float64 pointer as a repeated Double.
4708*1c12ee1eSDan Willemsenfunc sizeDoubleSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4709*1c12ee1eSDan Willemsen	s := *p.Float64Slice()
4710*1c12ee1eSDan Willemsen	size = len(s) * (f.tagsize + protowire.SizeFixed64())
4711*1c12ee1eSDan Willemsen	return size
4712*1c12ee1eSDan Willemsen}
4713*1c12ee1eSDan Willemsen
4714*1c12ee1eSDan Willemsen// appendDoubleSlice encodes a []float64 pointer as a repeated Double.
4715*1c12ee1eSDan Willemsenfunc appendDoubleSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4716*1c12ee1eSDan Willemsen	s := *p.Float64Slice()
4717*1c12ee1eSDan Willemsen	for _, v := range s {
4718*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
4719*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, math.Float64bits(v))
4720*1c12ee1eSDan Willemsen	}
4721*1c12ee1eSDan Willemsen	return b, nil
4722*1c12ee1eSDan Willemsen}
4723*1c12ee1eSDan Willemsen
4724*1c12ee1eSDan Willemsen// consumeDoubleSlice wire decodes a []float64 pointer as a repeated Double.
4725*1c12ee1eSDan Willemsenfunc consumeDoubleSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4726*1c12ee1eSDan Willemsen	sp := p.Float64Slice()
4727*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
4728*1c12ee1eSDan Willemsen		s := *sp
4729*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
4730*1c12ee1eSDan Willemsen		if n < 0 {
4731*1c12ee1eSDan Willemsen			return out, errDecode
4732*1c12ee1eSDan Willemsen		}
4733*1c12ee1eSDan Willemsen		for len(b) > 0 {
4734*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed64(b)
4735*1c12ee1eSDan Willemsen			if n < 0 {
4736*1c12ee1eSDan Willemsen				return out, errDecode
4737*1c12ee1eSDan Willemsen			}
4738*1c12ee1eSDan Willemsen			s = append(s, math.Float64frombits(v))
4739*1c12ee1eSDan Willemsen			b = b[n:]
4740*1c12ee1eSDan Willemsen		}
4741*1c12ee1eSDan Willemsen		*sp = s
4742*1c12ee1eSDan Willemsen		out.n = n
4743*1c12ee1eSDan Willemsen		return out, nil
4744*1c12ee1eSDan Willemsen	}
4745*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4746*1c12ee1eSDan Willemsen		return out, errUnknown
4747*1c12ee1eSDan Willemsen	}
4748*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4749*1c12ee1eSDan Willemsen	if n < 0 {
4750*1c12ee1eSDan Willemsen		return out, errDecode
4751*1c12ee1eSDan Willemsen	}
4752*1c12ee1eSDan Willemsen	*sp = append(*sp, math.Float64frombits(v))
4753*1c12ee1eSDan Willemsen	out.n = n
4754*1c12ee1eSDan Willemsen	return out, nil
4755*1c12ee1eSDan Willemsen}
4756*1c12ee1eSDan Willemsen
4757*1c12ee1eSDan Willemsenvar coderDoubleSlice = pointerCoderFuncs{
4758*1c12ee1eSDan Willemsen	size:      sizeDoubleSlice,
4759*1c12ee1eSDan Willemsen	marshal:   appendDoubleSlice,
4760*1c12ee1eSDan Willemsen	unmarshal: consumeDoubleSlice,
4761*1c12ee1eSDan Willemsen	merge:     mergeFloat64Slice,
4762*1c12ee1eSDan Willemsen}
4763*1c12ee1eSDan Willemsen
4764*1c12ee1eSDan Willemsen// sizeDoublePackedSlice returns the size of wire encoding a []float64 pointer as a packed repeated Double.
4765*1c12ee1eSDan Willemsenfunc sizeDoublePackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4766*1c12ee1eSDan Willemsen	s := *p.Float64Slice()
4767*1c12ee1eSDan Willemsen	if len(s) == 0 {
4768*1c12ee1eSDan Willemsen		return 0
4769*1c12ee1eSDan Willemsen	}
4770*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed64()
4771*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(n)
4772*1c12ee1eSDan Willemsen}
4773*1c12ee1eSDan Willemsen
4774*1c12ee1eSDan Willemsen// appendDoublePackedSlice encodes a []float64 pointer as a packed repeated Double.
4775*1c12ee1eSDan Willemsenfunc appendDoublePackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4776*1c12ee1eSDan Willemsen	s := *p.Float64Slice()
4777*1c12ee1eSDan Willemsen	if len(s) == 0 {
4778*1c12ee1eSDan Willemsen		return b, nil
4779*1c12ee1eSDan Willemsen	}
4780*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4781*1c12ee1eSDan Willemsen	n := len(s) * protowire.SizeFixed64()
4782*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
4783*1c12ee1eSDan Willemsen	for _, v := range s {
4784*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, math.Float64bits(v))
4785*1c12ee1eSDan Willemsen	}
4786*1c12ee1eSDan Willemsen	return b, nil
4787*1c12ee1eSDan Willemsen}
4788*1c12ee1eSDan Willemsen
4789*1c12ee1eSDan Willemsenvar coderDoublePackedSlice = pointerCoderFuncs{
4790*1c12ee1eSDan Willemsen	size:      sizeDoublePackedSlice,
4791*1c12ee1eSDan Willemsen	marshal:   appendDoublePackedSlice,
4792*1c12ee1eSDan Willemsen	unmarshal: consumeDoubleSlice,
4793*1c12ee1eSDan Willemsen	merge:     mergeFloat64Slice,
4794*1c12ee1eSDan Willemsen}
4795*1c12ee1eSDan Willemsen
4796*1c12ee1eSDan Willemsen// sizeDoubleValue returns the size of wire encoding a float64 value as a Double.
4797*1c12ee1eSDan Willemsenfunc sizeDoubleValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
4798*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeFixed64()
4799*1c12ee1eSDan Willemsen}
4800*1c12ee1eSDan Willemsen
4801*1c12ee1eSDan Willemsen// appendDoubleValue encodes a float64 value as a Double.
4802*1c12ee1eSDan Willemsenfunc appendDoubleValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4803*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
4804*1c12ee1eSDan Willemsen	b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
4805*1c12ee1eSDan Willemsen	return b, nil
4806*1c12ee1eSDan Willemsen}
4807*1c12ee1eSDan Willemsen
4808*1c12ee1eSDan Willemsen// consumeDoubleValue decodes a float64 value as a Double.
4809*1c12ee1eSDan Willemsenfunc consumeDoubleValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
4810*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4811*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
4812*1c12ee1eSDan Willemsen	}
4813*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4814*1c12ee1eSDan Willemsen	if n < 0 {
4815*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
4816*1c12ee1eSDan Willemsen	}
4817*1c12ee1eSDan Willemsen	out.n = n
4818*1c12ee1eSDan Willemsen	return protoreflect.ValueOfFloat64(math.Float64frombits(v)), out, nil
4819*1c12ee1eSDan Willemsen}
4820*1c12ee1eSDan Willemsen
4821*1c12ee1eSDan Willemsenvar coderDoubleValue = valueCoderFuncs{
4822*1c12ee1eSDan Willemsen	size:      sizeDoubleValue,
4823*1c12ee1eSDan Willemsen	marshal:   appendDoubleValue,
4824*1c12ee1eSDan Willemsen	unmarshal: consumeDoubleValue,
4825*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
4826*1c12ee1eSDan Willemsen}
4827*1c12ee1eSDan Willemsen
4828*1c12ee1eSDan Willemsen// sizeDoubleSliceValue returns the size of wire encoding a []float64 value as a repeated Double.
4829*1c12ee1eSDan Willemsenfunc sizeDoubleSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
4830*1c12ee1eSDan Willemsen	list := listv.List()
4831*1c12ee1eSDan Willemsen	size = list.Len() * (tagsize + protowire.SizeFixed64())
4832*1c12ee1eSDan Willemsen	return size
4833*1c12ee1eSDan Willemsen}
4834*1c12ee1eSDan Willemsen
4835*1c12ee1eSDan Willemsen// appendDoubleSliceValue encodes a []float64 value as a repeated Double.
4836*1c12ee1eSDan Willemsenfunc appendDoubleSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4837*1c12ee1eSDan Willemsen	list := listv.List()
4838*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
4839*1c12ee1eSDan Willemsen		v := list.Get(i)
4840*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
4841*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
4842*1c12ee1eSDan Willemsen	}
4843*1c12ee1eSDan Willemsen	return b, nil
4844*1c12ee1eSDan Willemsen}
4845*1c12ee1eSDan Willemsen
4846*1c12ee1eSDan Willemsen// consumeDoubleSliceValue wire decodes a []float64 value as a repeated Double.
4847*1c12ee1eSDan Willemsenfunc consumeDoubleSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
4848*1c12ee1eSDan Willemsen	list := listv.List()
4849*1c12ee1eSDan Willemsen	if wtyp == protowire.BytesType {
4850*1c12ee1eSDan Willemsen		b, n := protowire.ConsumeBytes(b)
4851*1c12ee1eSDan Willemsen		if n < 0 {
4852*1c12ee1eSDan Willemsen			return protoreflect.Value{}, out, errDecode
4853*1c12ee1eSDan Willemsen		}
4854*1c12ee1eSDan Willemsen		for len(b) > 0 {
4855*1c12ee1eSDan Willemsen			v, n := protowire.ConsumeFixed64(b)
4856*1c12ee1eSDan Willemsen			if n < 0 {
4857*1c12ee1eSDan Willemsen				return protoreflect.Value{}, out, errDecode
4858*1c12ee1eSDan Willemsen			}
4859*1c12ee1eSDan Willemsen			list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
4860*1c12ee1eSDan Willemsen			b = b[n:]
4861*1c12ee1eSDan Willemsen		}
4862*1c12ee1eSDan Willemsen		out.n = n
4863*1c12ee1eSDan Willemsen		return listv, out, nil
4864*1c12ee1eSDan Willemsen	}
4865*1c12ee1eSDan Willemsen	if wtyp != protowire.Fixed64Type {
4866*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
4867*1c12ee1eSDan Willemsen	}
4868*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeFixed64(b)
4869*1c12ee1eSDan Willemsen	if n < 0 {
4870*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
4871*1c12ee1eSDan Willemsen	}
4872*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
4873*1c12ee1eSDan Willemsen	out.n = n
4874*1c12ee1eSDan Willemsen	return listv, out, nil
4875*1c12ee1eSDan Willemsen}
4876*1c12ee1eSDan Willemsen
4877*1c12ee1eSDan Willemsenvar coderDoubleSliceValue = valueCoderFuncs{
4878*1c12ee1eSDan Willemsen	size:      sizeDoubleSliceValue,
4879*1c12ee1eSDan Willemsen	marshal:   appendDoubleSliceValue,
4880*1c12ee1eSDan Willemsen	unmarshal: consumeDoubleSliceValue,
4881*1c12ee1eSDan Willemsen	merge:     mergeListValue,
4882*1c12ee1eSDan Willemsen}
4883*1c12ee1eSDan Willemsen
4884*1c12ee1eSDan Willemsen// sizeDoublePackedSliceValue returns the size of wire encoding a []float64 value as a packed repeated Double.
4885*1c12ee1eSDan Willemsenfunc sizeDoublePackedSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
4886*1c12ee1eSDan Willemsen	list := listv.List()
4887*1c12ee1eSDan Willemsen	llen := list.Len()
4888*1c12ee1eSDan Willemsen	if llen == 0 {
4889*1c12ee1eSDan Willemsen		return 0
4890*1c12ee1eSDan Willemsen	}
4891*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed64()
4892*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(n)
4893*1c12ee1eSDan Willemsen}
4894*1c12ee1eSDan Willemsen
4895*1c12ee1eSDan Willemsen// appendDoublePackedSliceValue encodes a []float64 value as a packed repeated Double.
4896*1c12ee1eSDan Willemsenfunc appendDoublePackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
4897*1c12ee1eSDan Willemsen	list := listv.List()
4898*1c12ee1eSDan Willemsen	llen := list.Len()
4899*1c12ee1eSDan Willemsen	if llen == 0 {
4900*1c12ee1eSDan Willemsen		return b, nil
4901*1c12ee1eSDan Willemsen	}
4902*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
4903*1c12ee1eSDan Willemsen	n := llen * protowire.SizeFixed64()
4904*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, uint64(n))
4905*1c12ee1eSDan Willemsen	for i := 0; i < llen; i++ {
4906*1c12ee1eSDan Willemsen		v := list.Get(i)
4907*1c12ee1eSDan Willemsen		b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
4908*1c12ee1eSDan Willemsen	}
4909*1c12ee1eSDan Willemsen	return b, nil
4910*1c12ee1eSDan Willemsen}
4911*1c12ee1eSDan Willemsen
4912*1c12ee1eSDan Willemsenvar coderDoublePackedSliceValue = valueCoderFuncs{
4913*1c12ee1eSDan Willemsen	size:      sizeDoublePackedSliceValue,
4914*1c12ee1eSDan Willemsen	marshal:   appendDoublePackedSliceValue,
4915*1c12ee1eSDan Willemsen	unmarshal: consumeDoubleSliceValue,
4916*1c12ee1eSDan Willemsen	merge:     mergeListValue,
4917*1c12ee1eSDan Willemsen}
4918*1c12ee1eSDan Willemsen
4919*1c12ee1eSDan Willemsen// sizeString returns the size of wire encoding a string pointer as a String.
4920*1c12ee1eSDan Willemsenfunc sizeString(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4921*1c12ee1eSDan Willemsen	v := *p.String()
4922*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(len(v))
4923*1c12ee1eSDan Willemsen}
4924*1c12ee1eSDan Willemsen
4925*1c12ee1eSDan Willemsen// appendString wire encodes a string pointer as a String.
4926*1c12ee1eSDan Willemsenfunc appendString(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4927*1c12ee1eSDan Willemsen	v := *p.String()
4928*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4929*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v)
4930*1c12ee1eSDan Willemsen	return b, nil
4931*1c12ee1eSDan Willemsen}
4932*1c12ee1eSDan Willemsen
4933*1c12ee1eSDan Willemsen// consumeString wire decodes a string pointer as a String.
4934*1c12ee1eSDan Willemsenfunc consumeString(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4935*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
4936*1c12ee1eSDan Willemsen		return out, errUnknown
4937*1c12ee1eSDan Willemsen	}
4938*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
4939*1c12ee1eSDan Willemsen	if n < 0 {
4940*1c12ee1eSDan Willemsen		return out, errDecode
4941*1c12ee1eSDan Willemsen	}
4942*1c12ee1eSDan Willemsen	*p.String() = string(v)
4943*1c12ee1eSDan Willemsen	out.n = n
4944*1c12ee1eSDan Willemsen	return out, nil
4945*1c12ee1eSDan Willemsen}
4946*1c12ee1eSDan Willemsen
4947*1c12ee1eSDan Willemsenvar coderString = pointerCoderFuncs{
4948*1c12ee1eSDan Willemsen	size:      sizeString,
4949*1c12ee1eSDan Willemsen	marshal:   appendString,
4950*1c12ee1eSDan Willemsen	unmarshal: consumeString,
4951*1c12ee1eSDan Willemsen	merge:     mergeString,
4952*1c12ee1eSDan Willemsen}
4953*1c12ee1eSDan Willemsen
4954*1c12ee1eSDan Willemsen// appendStringValidateUTF8 wire encodes a string pointer as a String.
4955*1c12ee1eSDan Willemsenfunc appendStringValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
4956*1c12ee1eSDan Willemsen	v := *p.String()
4957*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
4958*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v)
4959*1c12ee1eSDan Willemsen	if !utf8.ValidString(v) {
4960*1c12ee1eSDan Willemsen		return b, errInvalidUTF8{}
4961*1c12ee1eSDan Willemsen	}
4962*1c12ee1eSDan Willemsen	return b, nil
4963*1c12ee1eSDan Willemsen}
4964*1c12ee1eSDan Willemsen
4965*1c12ee1eSDan Willemsen// consumeStringValidateUTF8 wire decodes a string pointer as a String.
4966*1c12ee1eSDan Willemsenfunc consumeStringValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
4967*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
4968*1c12ee1eSDan Willemsen		return out, errUnknown
4969*1c12ee1eSDan Willemsen	}
4970*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
4971*1c12ee1eSDan Willemsen	if n < 0 {
4972*1c12ee1eSDan Willemsen		return out, errDecode
4973*1c12ee1eSDan Willemsen	}
4974*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
4975*1c12ee1eSDan Willemsen		return out, errInvalidUTF8{}
4976*1c12ee1eSDan Willemsen	}
4977*1c12ee1eSDan Willemsen	*p.String() = string(v)
4978*1c12ee1eSDan Willemsen	out.n = n
4979*1c12ee1eSDan Willemsen	return out, nil
4980*1c12ee1eSDan Willemsen}
4981*1c12ee1eSDan Willemsen
4982*1c12ee1eSDan Willemsenvar coderStringValidateUTF8 = pointerCoderFuncs{
4983*1c12ee1eSDan Willemsen	size:      sizeString,
4984*1c12ee1eSDan Willemsen	marshal:   appendStringValidateUTF8,
4985*1c12ee1eSDan Willemsen	unmarshal: consumeStringValidateUTF8,
4986*1c12ee1eSDan Willemsen	merge:     mergeString,
4987*1c12ee1eSDan Willemsen}
4988*1c12ee1eSDan Willemsen
4989*1c12ee1eSDan Willemsen// sizeStringNoZero returns the size of wire encoding a string pointer as a String.
4990*1c12ee1eSDan Willemsen// The zero value is not encoded.
4991*1c12ee1eSDan Willemsenfunc sizeStringNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
4992*1c12ee1eSDan Willemsen	v := *p.String()
4993*1c12ee1eSDan Willemsen	if len(v) == 0 {
4994*1c12ee1eSDan Willemsen		return 0
4995*1c12ee1eSDan Willemsen	}
4996*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(len(v))
4997*1c12ee1eSDan Willemsen}
4998*1c12ee1eSDan Willemsen
4999*1c12ee1eSDan Willemsen// appendStringNoZero wire encodes a string pointer as a String.
5000*1c12ee1eSDan Willemsen// The zero value is not encoded.
5001*1c12ee1eSDan Willemsenfunc appendStringNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5002*1c12ee1eSDan Willemsen	v := *p.String()
5003*1c12ee1eSDan Willemsen	if len(v) == 0 {
5004*1c12ee1eSDan Willemsen		return b, nil
5005*1c12ee1eSDan Willemsen	}
5006*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5007*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v)
5008*1c12ee1eSDan Willemsen	return b, nil
5009*1c12ee1eSDan Willemsen}
5010*1c12ee1eSDan Willemsen
5011*1c12ee1eSDan Willemsenvar coderStringNoZero = pointerCoderFuncs{
5012*1c12ee1eSDan Willemsen	size:      sizeStringNoZero,
5013*1c12ee1eSDan Willemsen	marshal:   appendStringNoZero,
5014*1c12ee1eSDan Willemsen	unmarshal: consumeString,
5015*1c12ee1eSDan Willemsen	merge:     mergeStringNoZero,
5016*1c12ee1eSDan Willemsen}
5017*1c12ee1eSDan Willemsen
5018*1c12ee1eSDan Willemsen// appendStringNoZeroValidateUTF8 wire encodes a string pointer as a String.
5019*1c12ee1eSDan Willemsen// The zero value is not encoded.
5020*1c12ee1eSDan Willemsenfunc appendStringNoZeroValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5021*1c12ee1eSDan Willemsen	v := *p.String()
5022*1c12ee1eSDan Willemsen	if len(v) == 0 {
5023*1c12ee1eSDan Willemsen		return b, nil
5024*1c12ee1eSDan Willemsen	}
5025*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5026*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v)
5027*1c12ee1eSDan Willemsen	if !utf8.ValidString(v) {
5028*1c12ee1eSDan Willemsen		return b, errInvalidUTF8{}
5029*1c12ee1eSDan Willemsen	}
5030*1c12ee1eSDan Willemsen	return b, nil
5031*1c12ee1eSDan Willemsen}
5032*1c12ee1eSDan Willemsen
5033*1c12ee1eSDan Willemsenvar coderStringNoZeroValidateUTF8 = pointerCoderFuncs{
5034*1c12ee1eSDan Willemsen	size:      sizeStringNoZero,
5035*1c12ee1eSDan Willemsen	marshal:   appendStringNoZeroValidateUTF8,
5036*1c12ee1eSDan Willemsen	unmarshal: consumeStringValidateUTF8,
5037*1c12ee1eSDan Willemsen	merge:     mergeStringNoZero,
5038*1c12ee1eSDan Willemsen}
5039*1c12ee1eSDan Willemsen
5040*1c12ee1eSDan Willemsen// sizeStringPtr returns the size of wire encoding a *string pointer as a String.
5041*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
5042*1c12ee1eSDan Willemsenfunc sizeStringPtr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
5043*1c12ee1eSDan Willemsen	v := **p.StringPtr()
5044*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(len(v))
5045*1c12ee1eSDan Willemsen}
5046*1c12ee1eSDan Willemsen
5047*1c12ee1eSDan Willemsen// appendStringPtr wire encodes a *string pointer as a String.
5048*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
5049*1c12ee1eSDan Willemsenfunc appendStringPtr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5050*1c12ee1eSDan Willemsen	v := **p.StringPtr()
5051*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5052*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v)
5053*1c12ee1eSDan Willemsen	return b, nil
5054*1c12ee1eSDan Willemsen}
5055*1c12ee1eSDan Willemsen
5056*1c12ee1eSDan Willemsen// consumeStringPtr wire decodes a *string pointer as a String.
5057*1c12ee1eSDan Willemsenfunc consumeStringPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5058*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5059*1c12ee1eSDan Willemsen		return out, errUnknown
5060*1c12ee1eSDan Willemsen	}
5061*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5062*1c12ee1eSDan Willemsen	if n < 0 {
5063*1c12ee1eSDan Willemsen		return out, errDecode
5064*1c12ee1eSDan Willemsen	}
5065*1c12ee1eSDan Willemsen	vp := p.StringPtr()
5066*1c12ee1eSDan Willemsen	if *vp == nil {
5067*1c12ee1eSDan Willemsen		*vp = new(string)
5068*1c12ee1eSDan Willemsen	}
5069*1c12ee1eSDan Willemsen	**vp = string(v)
5070*1c12ee1eSDan Willemsen	out.n = n
5071*1c12ee1eSDan Willemsen	return out, nil
5072*1c12ee1eSDan Willemsen}
5073*1c12ee1eSDan Willemsen
5074*1c12ee1eSDan Willemsenvar coderStringPtr = pointerCoderFuncs{
5075*1c12ee1eSDan Willemsen	size:      sizeStringPtr,
5076*1c12ee1eSDan Willemsen	marshal:   appendStringPtr,
5077*1c12ee1eSDan Willemsen	unmarshal: consumeStringPtr,
5078*1c12ee1eSDan Willemsen	merge:     mergeStringPtr,
5079*1c12ee1eSDan Willemsen}
5080*1c12ee1eSDan Willemsen
5081*1c12ee1eSDan Willemsen// appendStringPtrValidateUTF8 wire encodes a *string pointer as a String.
5082*1c12ee1eSDan Willemsen// It panics if the pointer is nil.
5083*1c12ee1eSDan Willemsenfunc appendStringPtrValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5084*1c12ee1eSDan Willemsen	v := **p.StringPtr()
5085*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5086*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v)
5087*1c12ee1eSDan Willemsen	if !utf8.ValidString(v) {
5088*1c12ee1eSDan Willemsen		return b, errInvalidUTF8{}
5089*1c12ee1eSDan Willemsen	}
5090*1c12ee1eSDan Willemsen	return b, nil
5091*1c12ee1eSDan Willemsen}
5092*1c12ee1eSDan Willemsen
5093*1c12ee1eSDan Willemsen// consumeStringPtrValidateUTF8 wire decodes a *string pointer as a String.
5094*1c12ee1eSDan Willemsenfunc consumeStringPtrValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5095*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5096*1c12ee1eSDan Willemsen		return out, errUnknown
5097*1c12ee1eSDan Willemsen	}
5098*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5099*1c12ee1eSDan Willemsen	if n < 0 {
5100*1c12ee1eSDan Willemsen		return out, errDecode
5101*1c12ee1eSDan Willemsen	}
5102*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5103*1c12ee1eSDan Willemsen		return out, errInvalidUTF8{}
5104*1c12ee1eSDan Willemsen	}
5105*1c12ee1eSDan Willemsen	vp := p.StringPtr()
5106*1c12ee1eSDan Willemsen	if *vp == nil {
5107*1c12ee1eSDan Willemsen		*vp = new(string)
5108*1c12ee1eSDan Willemsen	}
5109*1c12ee1eSDan Willemsen	**vp = string(v)
5110*1c12ee1eSDan Willemsen	out.n = n
5111*1c12ee1eSDan Willemsen	return out, nil
5112*1c12ee1eSDan Willemsen}
5113*1c12ee1eSDan Willemsen
5114*1c12ee1eSDan Willemsenvar coderStringPtrValidateUTF8 = pointerCoderFuncs{
5115*1c12ee1eSDan Willemsen	size:      sizeStringPtr,
5116*1c12ee1eSDan Willemsen	marshal:   appendStringPtrValidateUTF8,
5117*1c12ee1eSDan Willemsen	unmarshal: consumeStringPtrValidateUTF8,
5118*1c12ee1eSDan Willemsen	merge:     mergeStringPtr,
5119*1c12ee1eSDan Willemsen}
5120*1c12ee1eSDan Willemsen
5121*1c12ee1eSDan Willemsen// sizeStringSlice returns the size of wire encoding a []string pointer as a repeated String.
5122*1c12ee1eSDan Willemsenfunc sizeStringSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
5123*1c12ee1eSDan Willemsen	s := *p.StringSlice()
5124*1c12ee1eSDan Willemsen	for _, v := range s {
5125*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeBytes(len(v))
5126*1c12ee1eSDan Willemsen	}
5127*1c12ee1eSDan Willemsen	return size
5128*1c12ee1eSDan Willemsen}
5129*1c12ee1eSDan Willemsen
5130*1c12ee1eSDan Willemsen// appendStringSlice encodes a []string pointer as a repeated String.
5131*1c12ee1eSDan Willemsenfunc appendStringSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5132*1c12ee1eSDan Willemsen	s := *p.StringSlice()
5133*1c12ee1eSDan Willemsen	for _, v := range s {
5134*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
5135*1c12ee1eSDan Willemsen		b = protowire.AppendString(b, v)
5136*1c12ee1eSDan Willemsen	}
5137*1c12ee1eSDan Willemsen	return b, nil
5138*1c12ee1eSDan Willemsen}
5139*1c12ee1eSDan Willemsen
5140*1c12ee1eSDan Willemsen// consumeStringSlice wire decodes a []string pointer as a repeated String.
5141*1c12ee1eSDan Willemsenfunc consumeStringSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5142*1c12ee1eSDan Willemsen	sp := p.StringSlice()
5143*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5144*1c12ee1eSDan Willemsen		return out, errUnknown
5145*1c12ee1eSDan Willemsen	}
5146*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5147*1c12ee1eSDan Willemsen	if n < 0 {
5148*1c12ee1eSDan Willemsen		return out, errDecode
5149*1c12ee1eSDan Willemsen	}
5150*1c12ee1eSDan Willemsen	*sp = append(*sp, string(v))
5151*1c12ee1eSDan Willemsen	out.n = n
5152*1c12ee1eSDan Willemsen	return out, nil
5153*1c12ee1eSDan Willemsen}
5154*1c12ee1eSDan Willemsen
5155*1c12ee1eSDan Willemsenvar coderStringSlice = pointerCoderFuncs{
5156*1c12ee1eSDan Willemsen	size:      sizeStringSlice,
5157*1c12ee1eSDan Willemsen	marshal:   appendStringSlice,
5158*1c12ee1eSDan Willemsen	unmarshal: consumeStringSlice,
5159*1c12ee1eSDan Willemsen	merge:     mergeStringSlice,
5160*1c12ee1eSDan Willemsen}
5161*1c12ee1eSDan Willemsen
5162*1c12ee1eSDan Willemsen// appendStringSliceValidateUTF8 encodes a []string pointer as a repeated String.
5163*1c12ee1eSDan Willemsenfunc appendStringSliceValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5164*1c12ee1eSDan Willemsen	s := *p.StringSlice()
5165*1c12ee1eSDan Willemsen	for _, v := range s {
5166*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
5167*1c12ee1eSDan Willemsen		b = protowire.AppendString(b, v)
5168*1c12ee1eSDan Willemsen		if !utf8.ValidString(v) {
5169*1c12ee1eSDan Willemsen			return b, errInvalidUTF8{}
5170*1c12ee1eSDan Willemsen		}
5171*1c12ee1eSDan Willemsen	}
5172*1c12ee1eSDan Willemsen	return b, nil
5173*1c12ee1eSDan Willemsen}
5174*1c12ee1eSDan Willemsen
5175*1c12ee1eSDan Willemsen// consumeStringSliceValidateUTF8 wire decodes a []string pointer as a repeated String.
5176*1c12ee1eSDan Willemsenfunc consumeStringSliceValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5177*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5178*1c12ee1eSDan Willemsen		return out, errUnknown
5179*1c12ee1eSDan Willemsen	}
5180*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5181*1c12ee1eSDan Willemsen	if n < 0 {
5182*1c12ee1eSDan Willemsen		return out, errDecode
5183*1c12ee1eSDan Willemsen	}
5184*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5185*1c12ee1eSDan Willemsen		return out, errInvalidUTF8{}
5186*1c12ee1eSDan Willemsen	}
5187*1c12ee1eSDan Willemsen	sp := p.StringSlice()
5188*1c12ee1eSDan Willemsen	*sp = append(*sp, string(v))
5189*1c12ee1eSDan Willemsen	out.n = n
5190*1c12ee1eSDan Willemsen	return out, nil
5191*1c12ee1eSDan Willemsen}
5192*1c12ee1eSDan Willemsen
5193*1c12ee1eSDan Willemsenvar coderStringSliceValidateUTF8 = pointerCoderFuncs{
5194*1c12ee1eSDan Willemsen	size:      sizeStringSlice,
5195*1c12ee1eSDan Willemsen	marshal:   appendStringSliceValidateUTF8,
5196*1c12ee1eSDan Willemsen	unmarshal: consumeStringSliceValidateUTF8,
5197*1c12ee1eSDan Willemsen	merge:     mergeStringSlice,
5198*1c12ee1eSDan Willemsen}
5199*1c12ee1eSDan Willemsen
5200*1c12ee1eSDan Willemsen// sizeStringValue returns the size of wire encoding a string value as a String.
5201*1c12ee1eSDan Willemsenfunc sizeStringValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
5202*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(len(v.String()))
5203*1c12ee1eSDan Willemsen}
5204*1c12ee1eSDan Willemsen
5205*1c12ee1eSDan Willemsen// appendStringValue encodes a string value as a String.
5206*1c12ee1eSDan Willemsenfunc appendStringValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
5207*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
5208*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v.String())
5209*1c12ee1eSDan Willemsen	return b, nil
5210*1c12ee1eSDan Willemsen}
5211*1c12ee1eSDan Willemsen
5212*1c12ee1eSDan Willemsen// consumeStringValue decodes a string value as a String.
5213*1c12ee1eSDan Willemsenfunc consumeStringValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
5214*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5215*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
5216*1c12ee1eSDan Willemsen	}
5217*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5218*1c12ee1eSDan Willemsen	if n < 0 {
5219*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
5220*1c12ee1eSDan Willemsen	}
5221*1c12ee1eSDan Willemsen	out.n = n
5222*1c12ee1eSDan Willemsen	return protoreflect.ValueOfString(string(v)), out, nil
5223*1c12ee1eSDan Willemsen}
5224*1c12ee1eSDan Willemsen
5225*1c12ee1eSDan Willemsenvar coderStringValue = valueCoderFuncs{
5226*1c12ee1eSDan Willemsen	size:      sizeStringValue,
5227*1c12ee1eSDan Willemsen	marshal:   appendStringValue,
5228*1c12ee1eSDan Willemsen	unmarshal: consumeStringValue,
5229*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
5230*1c12ee1eSDan Willemsen}
5231*1c12ee1eSDan Willemsen
5232*1c12ee1eSDan Willemsen// appendStringValueValidateUTF8 encodes a string value as a String.
5233*1c12ee1eSDan Willemsenfunc appendStringValueValidateUTF8(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
5234*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
5235*1c12ee1eSDan Willemsen	b = protowire.AppendString(b, v.String())
5236*1c12ee1eSDan Willemsen	if !utf8.ValidString(v.String()) {
5237*1c12ee1eSDan Willemsen		return b, errInvalidUTF8{}
5238*1c12ee1eSDan Willemsen	}
5239*1c12ee1eSDan Willemsen	return b, nil
5240*1c12ee1eSDan Willemsen}
5241*1c12ee1eSDan Willemsen
5242*1c12ee1eSDan Willemsen// consumeStringValueValidateUTF8 decodes a string value as a String.
5243*1c12ee1eSDan Willemsenfunc consumeStringValueValidateUTF8(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
5244*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5245*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
5246*1c12ee1eSDan Willemsen	}
5247*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5248*1c12ee1eSDan Willemsen	if n < 0 {
5249*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
5250*1c12ee1eSDan Willemsen	}
5251*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5252*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errInvalidUTF8{}
5253*1c12ee1eSDan Willemsen	}
5254*1c12ee1eSDan Willemsen	out.n = n
5255*1c12ee1eSDan Willemsen	return protoreflect.ValueOfString(string(v)), out, nil
5256*1c12ee1eSDan Willemsen}
5257*1c12ee1eSDan Willemsen
5258*1c12ee1eSDan Willemsenvar coderStringValueValidateUTF8 = valueCoderFuncs{
5259*1c12ee1eSDan Willemsen	size:      sizeStringValue,
5260*1c12ee1eSDan Willemsen	marshal:   appendStringValueValidateUTF8,
5261*1c12ee1eSDan Willemsen	unmarshal: consumeStringValueValidateUTF8,
5262*1c12ee1eSDan Willemsen	merge:     mergeScalarValue,
5263*1c12ee1eSDan Willemsen}
5264*1c12ee1eSDan Willemsen
5265*1c12ee1eSDan Willemsen// sizeStringSliceValue returns the size of wire encoding a []string value as a repeated String.
5266*1c12ee1eSDan Willemsenfunc sizeStringSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
5267*1c12ee1eSDan Willemsen	list := listv.List()
5268*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
5269*1c12ee1eSDan Willemsen		v := list.Get(i)
5270*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeBytes(len(v.String()))
5271*1c12ee1eSDan Willemsen	}
5272*1c12ee1eSDan Willemsen	return size
5273*1c12ee1eSDan Willemsen}
5274*1c12ee1eSDan Willemsen
5275*1c12ee1eSDan Willemsen// appendStringSliceValue encodes a []string value as a repeated String.
5276*1c12ee1eSDan Willemsenfunc appendStringSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
5277*1c12ee1eSDan Willemsen	list := listv.List()
5278*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
5279*1c12ee1eSDan Willemsen		v := list.Get(i)
5280*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
5281*1c12ee1eSDan Willemsen		b = protowire.AppendString(b, v.String())
5282*1c12ee1eSDan Willemsen	}
5283*1c12ee1eSDan Willemsen	return b, nil
5284*1c12ee1eSDan Willemsen}
5285*1c12ee1eSDan Willemsen
5286*1c12ee1eSDan Willemsen// consumeStringSliceValue wire decodes a []string value as a repeated String.
5287*1c12ee1eSDan Willemsenfunc consumeStringSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
5288*1c12ee1eSDan Willemsen	list := listv.List()
5289*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5290*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
5291*1c12ee1eSDan Willemsen	}
5292*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5293*1c12ee1eSDan Willemsen	if n < 0 {
5294*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
5295*1c12ee1eSDan Willemsen	}
5296*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfString(string(v)))
5297*1c12ee1eSDan Willemsen	out.n = n
5298*1c12ee1eSDan Willemsen	return listv, out, nil
5299*1c12ee1eSDan Willemsen}
5300*1c12ee1eSDan Willemsen
5301*1c12ee1eSDan Willemsenvar coderStringSliceValue = valueCoderFuncs{
5302*1c12ee1eSDan Willemsen	size:      sizeStringSliceValue,
5303*1c12ee1eSDan Willemsen	marshal:   appendStringSliceValue,
5304*1c12ee1eSDan Willemsen	unmarshal: consumeStringSliceValue,
5305*1c12ee1eSDan Willemsen	merge:     mergeListValue,
5306*1c12ee1eSDan Willemsen}
5307*1c12ee1eSDan Willemsen
5308*1c12ee1eSDan Willemsen// sizeBytes returns the size of wire encoding a []byte pointer as a Bytes.
5309*1c12ee1eSDan Willemsenfunc sizeBytes(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
5310*1c12ee1eSDan Willemsen	v := *p.Bytes()
5311*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(len(v))
5312*1c12ee1eSDan Willemsen}
5313*1c12ee1eSDan Willemsen
5314*1c12ee1eSDan Willemsen// appendBytes wire encodes a []byte pointer as a Bytes.
5315*1c12ee1eSDan Willemsenfunc appendBytes(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5316*1c12ee1eSDan Willemsen	v := *p.Bytes()
5317*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5318*1c12ee1eSDan Willemsen	b = protowire.AppendBytes(b, v)
5319*1c12ee1eSDan Willemsen	return b, nil
5320*1c12ee1eSDan Willemsen}
5321*1c12ee1eSDan Willemsen
5322*1c12ee1eSDan Willemsen// consumeBytes wire decodes a []byte pointer as a Bytes.
5323*1c12ee1eSDan Willemsenfunc consumeBytes(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5324*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5325*1c12ee1eSDan Willemsen		return out, errUnknown
5326*1c12ee1eSDan Willemsen	}
5327*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5328*1c12ee1eSDan Willemsen	if n < 0 {
5329*1c12ee1eSDan Willemsen		return out, errDecode
5330*1c12ee1eSDan Willemsen	}
5331*1c12ee1eSDan Willemsen	*p.Bytes() = append(emptyBuf[:], v...)
5332*1c12ee1eSDan Willemsen	out.n = n
5333*1c12ee1eSDan Willemsen	return out, nil
5334*1c12ee1eSDan Willemsen}
5335*1c12ee1eSDan Willemsen
5336*1c12ee1eSDan Willemsenvar coderBytes = pointerCoderFuncs{
5337*1c12ee1eSDan Willemsen	size:      sizeBytes,
5338*1c12ee1eSDan Willemsen	marshal:   appendBytes,
5339*1c12ee1eSDan Willemsen	unmarshal: consumeBytes,
5340*1c12ee1eSDan Willemsen	merge:     mergeBytes,
5341*1c12ee1eSDan Willemsen}
5342*1c12ee1eSDan Willemsen
5343*1c12ee1eSDan Willemsen// appendBytesValidateUTF8 wire encodes a []byte pointer as a Bytes.
5344*1c12ee1eSDan Willemsenfunc appendBytesValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5345*1c12ee1eSDan Willemsen	v := *p.Bytes()
5346*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5347*1c12ee1eSDan Willemsen	b = protowire.AppendBytes(b, v)
5348*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5349*1c12ee1eSDan Willemsen		return b, errInvalidUTF8{}
5350*1c12ee1eSDan Willemsen	}
5351*1c12ee1eSDan Willemsen	return b, nil
5352*1c12ee1eSDan Willemsen}
5353*1c12ee1eSDan Willemsen
5354*1c12ee1eSDan Willemsen// consumeBytesValidateUTF8 wire decodes a []byte pointer as a Bytes.
5355*1c12ee1eSDan Willemsenfunc consumeBytesValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5356*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5357*1c12ee1eSDan Willemsen		return out, errUnknown
5358*1c12ee1eSDan Willemsen	}
5359*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5360*1c12ee1eSDan Willemsen	if n < 0 {
5361*1c12ee1eSDan Willemsen		return out, errDecode
5362*1c12ee1eSDan Willemsen	}
5363*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5364*1c12ee1eSDan Willemsen		return out, errInvalidUTF8{}
5365*1c12ee1eSDan Willemsen	}
5366*1c12ee1eSDan Willemsen	*p.Bytes() = append(emptyBuf[:], v...)
5367*1c12ee1eSDan Willemsen	out.n = n
5368*1c12ee1eSDan Willemsen	return out, nil
5369*1c12ee1eSDan Willemsen}
5370*1c12ee1eSDan Willemsen
5371*1c12ee1eSDan Willemsenvar coderBytesValidateUTF8 = pointerCoderFuncs{
5372*1c12ee1eSDan Willemsen	size:      sizeBytes,
5373*1c12ee1eSDan Willemsen	marshal:   appendBytesValidateUTF8,
5374*1c12ee1eSDan Willemsen	unmarshal: consumeBytesValidateUTF8,
5375*1c12ee1eSDan Willemsen	merge:     mergeBytes,
5376*1c12ee1eSDan Willemsen}
5377*1c12ee1eSDan Willemsen
5378*1c12ee1eSDan Willemsen// sizeBytesNoZero returns the size of wire encoding a []byte pointer as a Bytes.
5379*1c12ee1eSDan Willemsen// The zero value is not encoded.
5380*1c12ee1eSDan Willemsenfunc sizeBytesNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
5381*1c12ee1eSDan Willemsen	v := *p.Bytes()
5382*1c12ee1eSDan Willemsen	if len(v) == 0 {
5383*1c12ee1eSDan Willemsen		return 0
5384*1c12ee1eSDan Willemsen	}
5385*1c12ee1eSDan Willemsen	return f.tagsize + protowire.SizeBytes(len(v))
5386*1c12ee1eSDan Willemsen}
5387*1c12ee1eSDan Willemsen
5388*1c12ee1eSDan Willemsen// appendBytesNoZero wire encodes a []byte pointer as a Bytes.
5389*1c12ee1eSDan Willemsen// The zero value is not encoded.
5390*1c12ee1eSDan Willemsenfunc appendBytesNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5391*1c12ee1eSDan Willemsen	v := *p.Bytes()
5392*1c12ee1eSDan Willemsen	if len(v) == 0 {
5393*1c12ee1eSDan Willemsen		return b, nil
5394*1c12ee1eSDan Willemsen	}
5395*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5396*1c12ee1eSDan Willemsen	b = protowire.AppendBytes(b, v)
5397*1c12ee1eSDan Willemsen	return b, nil
5398*1c12ee1eSDan Willemsen}
5399*1c12ee1eSDan Willemsen
5400*1c12ee1eSDan Willemsen// consumeBytesNoZero wire decodes a []byte pointer as a Bytes.
5401*1c12ee1eSDan Willemsen// The zero value is not decoded.
5402*1c12ee1eSDan Willemsenfunc consumeBytesNoZero(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5403*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5404*1c12ee1eSDan Willemsen		return out, errUnknown
5405*1c12ee1eSDan Willemsen	}
5406*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5407*1c12ee1eSDan Willemsen	if n < 0 {
5408*1c12ee1eSDan Willemsen		return out, errDecode
5409*1c12ee1eSDan Willemsen	}
5410*1c12ee1eSDan Willemsen	*p.Bytes() = append(([]byte)(nil), v...)
5411*1c12ee1eSDan Willemsen	out.n = n
5412*1c12ee1eSDan Willemsen	return out, nil
5413*1c12ee1eSDan Willemsen}
5414*1c12ee1eSDan Willemsen
5415*1c12ee1eSDan Willemsenvar coderBytesNoZero = pointerCoderFuncs{
5416*1c12ee1eSDan Willemsen	size:      sizeBytesNoZero,
5417*1c12ee1eSDan Willemsen	marshal:   appendBytesNoZero,
5418*1c12ee1eSDan Willemsen	unmarshal: consumeBytesNoZero,
5419*1c12ee1eSDan Willemsen	merge:     mergeBytesNoZero,
5420*1c12ee1eSDan Willemsen}
5421*1c12ee1eSDan Willemsen
5422*1c12ee1eSDan Willemsen// appendBytesNoZeroValidateUTF8 wire encodes a []byte pointer as a Bytes.
5423*1c12ee1eSDan Willemsen// The zero value is not encoded.
5424*1c12ee1eSDan Willemsenfunc appendBytesNoZeroValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5425*1c12ee1eSDan Willemsen	v := *p.Bytes()
5426*1c12ee1eSDan Willemsen	if len(v) == 0 {
5427*1c12ee1eSDan Willemsen		return b, nil
5428*1c12ee1eSDan Willemsen	}
5429*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, f.wiretag)
5430*1c12ee1eSDan Willemsen	b = protowire.AppendBytes(b, v)
5431*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5432*1c12ee1eSDan Willemsen		return b, errInvalidUTF8{}
5433*1c12ee1eSDan Willemsen	}
5434*1c12ee1eSDan Willemsen	return b, nil
5435*1c12ee1eSDan Willemsen}
5436*1c12ee1eSDan Willemsen
5437*1c12ee1eSDan Willemsen// consumeBytesNoZeroValidateUTF8 wire decodes a []byte pointer as a Bytes.
5438*1c12ee1eSDan Willemsenfunc consumeBytesNoZeroValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5439*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5440*1c12ee1eSDan Willemsen		return out, errUnknown
5441*1c12ee1eSDan Willemsen	}
5442*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5443*1c12ee1eSDan Willemsen	if n < 0 {
5444*1c12ee1eSDan Willemsen		return out, errDecode
5445*1c12ee1eSDan Willemsen	}
5446*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5447*1c12ee1eSDan Willemsen		return out, errInvalidUTF8{}
5448*1c12ee1eSDan Willemsen	}
5449*1c12ee1eSDan Willemsen	*p.Bytes() = append(([]byte)(nil), v...)
5450*1c12ee1eSDan Willemsen	out.n = n
5451*1c12ee1eSDan Willemsen	return out, nil
5452*1c12ee1eSDan Willemsen}
5453*1c12ee1eSDan Willemsen
5454*1c12ee1eSDan Willemsenvar coderBytesNoZeroValidateUTF8 = pointerCoderFuncs{
5455*1c12ee1eSDan Willemsen	size:      sizeBytesNoZero,
5456*1c12ee1eSDan Willemsen	marshal:   appendBytesNoZeroValidateUTF8,
5457*1c12ee1eSDan Willemsen	unmarshal: consumeBytesNoZeroValidateUTF8,
5458*1c12ee1eSDan Willemsen	merge:     mergeBytesNoZero,
5459*1c12ee1eSDan Willemsen}
5460*1c12ee1eSDan Willemsen
5461*1c12ee1eSDan Willemsen// sizeBytesSlice returns the size of wire encoding a [][]byte pointer as a repeated Bytes.
5462*1c12ee1eSDan Willemsenfunc sizeBytesSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
5463*1c12ee1eSDan Willemsen	s := *p.BytesSlice()
5464*1c12ee1eSDan Willemsen	for _, v := range s {
5465*1c12ee1eSDan Willemsen		size += f.tagsize + protowire.SizeBytes(len(v))
5466*1c12ee1eSDan Willemsen	}
5467*1c12ee1eSDan Willemsen	return size
5468*1c12ee1eSDan Willemsen}
5469*1c12ee1eSDan Willemsen
5470*1c12ee1eSDan Willemsen// appendBytesSlice encodes a [][]byte pointer as a repeated Bytes.
5471*1c12ee1eSDan Willemsenfunc appendBytesSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5472*1c12ee1eSDan Willemsen	s := *p.BytesSlice()
5473*1c12ee1eSDan Willemsen	for _, v := range s {
5474*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
5475*1c12ee1eSDan Willemsen		b = protowire.AppendBytes(b, v)
5476*1c12ee1eSDan Willemsen	}
5477*1c12ee1eSDan Willemsen	return b, nil
5478*1c12ee1eSDan Willemsen}
5479*1c12ee1eSDan Willemsen
5480*1c12ee1eSDan Willemsen// consumeBytesSlice wire decodes a [][]byte pointer as a repeated Bytes.
5481*1c12ee1eSDan Willemsenfunc consumeBytesSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5482*1c12ee1eSDan Willemsen	sp := p.BytesSlice()
5483*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5484*1c12ee1eSDan Willemsen		return out, errUnknown
5485*1c12ee1eSDan Willemsen	}
5486*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5487*1c12ee1eSDan Willemsen	if n < 0 {
5488*1c12ee1eSDan Willemsen		return out, errDecode
5489*1c12ee1eSDan Willemsen	}
5490*1c12ee1eSDan Willemsen	*sp = append(*sp, append(emptyBuf[:], v...))
5491*1c12ee1eSDan Willemsen	out.n = n
5492*1c12ee1eSDan Willemsen	return out, nil
5493*1c12ee1eSDan Willemsen}
5494*1c12ee1eSDan Willemsen
5495*1c12ee1eSDan Willemsenvar coderBytesSlice = pointerCoderFuncs{
5496*1c12ee1eSDan Willemsen	size:      sizeBytesSlice,
5497*1c12ee1eSDan Willemsen	marshal:   appendBytesSlice,
5498*1c12ee1eSDan Willemsen	unmarshal: consumeBytesSlice,
5499*1c12ee1eSDan Willemsen	merge:     mergeBytesSlice,
5500*1c12ee1eSDan Willemsen}
5501*1c12ee1eSDan Willemsen
5502*1c12ee1eSDan Willemsen// appendBytesSliceValidateUTF8 encodes a [][]byte pointer as a repeated Bytes.
5503*1c12ee1eSDan Willemsenfunc appendBytesSliceValidateUTF8(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
5504*1c12ee1eSDan Willemsen	s := *p.BytesSlice()
5505*1c12ee1eSDan Willemsen	for _, v := range s {
5506*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, f.wiretag)
5507*1c12ee1eSDan Willemsen		b = protowire.AppendBytes(b, v)
5508*1c12ee1eSDan Willemsen		if !utf8.Valid(v) {
5509*1c12ee1eSDan Willemsen			return b, errInvalidUTF8{}
5510*1c12ee1eSDan Willemsen		}
5511*1c12ee1eSDan Willemsen	}
5512*1c12ee1eSDan Willemsen	return b, nil
5513*1c12ee1eSDan Willemsen}
5514*1c12ee1eSDan Willemsen
5515*1c12ee1eSDan Willemsen// consumeBytesSliceValidateUTF8 wire decodes a [][]byte pointer as a repeated Bytes.
5516*1c12ee1eSDan Willemsenfunc consumeBytesSliceValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
5517*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5518*1c12ee1eSDan Willemsen		return out, errUnknown
5519*1c12ee1eSDan Willemsen	}
5520*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5521*1c12ee1eSDan Willemsen	if n < 0 {
5522*1c12ee1eSDan Willemsen		return out, errDecode
5523*1c12ee1eSDan Willemsen	}
5524*1c12ee1eSDan Willemsen	if !utf8.Valid(v) {
5525*1c12ee1eSDan Willemsen		return out, errInvalidUTF8{}
5526*1c12ee1eSDan Willemsen	}
5527*1c12ee1eSDan Willemsen	sp := p.BytesSlice()
5528*1c12ee1eSDan Willemsen	*sp = append(*sp, append(emptyBuf[:], v...))
5529*1c12ee1eSDan Willemsen	out.n = n
5530*1c12ee1eSDan Willemsen	return out, nil
5531*1c12ee1eSDan Willemsen}
5532*1c12ee1eSDan Willemsen
5533*1c12ee1eSDan Willemsenvar coderBytesSliceValidateUTF8 = pointerCoderFuncs{
5534*1c12ee1eSDan Willemsen	size:      sizeBytesSlice,
5535*1c12ee1eSDan Willemsen	marshal:   appendBytesSliceValidateUTF8,
5536*1c12ee1eSDan Willemsen	unmarshal: consumeBytesSliceValidateUTF8,
5537*1c12ee1eSDan Willemsen	merge:     mergeBytesSlice,
5538*1c12ee1eSDan Willemsen}
5539*1c12ee1eSDan Willemsen
5540*1c12ee1eSDan Willemsen// sizeBytesValue returns the size of wire encoding a []byte value as a Bytes.
5541*1c12ee1eSDan Willemsenfunc sizeBytesValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
5542*1c12ee1eSDan Willemsen	return tagsize + protowire.SizeBytes(len(v.Bytes()))
5543*1c12ee1eSDan Willemsen}
5544*1c12ee1eSDan Willemsen
5545*1c12ee1eSDan Willemsen// appendBytesValue encodes a []byte value as a Bytes.
5546*1c12ee1eSDan Willemsenfunc appendBytesValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
5547*1c12ee1eSDan Willemsen	b = protowire.AppendVarint(b, wiretag)
5548*1c12ee1eSDan Willemsen	b = protowire.AppendBytes(b, v.Bytes())
5549*1c12ee1eSDan Willemsen	return b, nil
5550*1c12ee1eSDan Willemsen}
5551*1c12ee1eSDan Willemsen
5552*1c12ee1eSDan Willemsen// consumeBytesValue decodes a []byte value as a Bytes.
5553*1c12ee1eSDan Willemsenfunc consumeBytesValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
5554*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5555*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
5556*1c12ee1eSDan Willemsen	}
5557*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5558*1c12ee1eSDan Willemsen	if n < 0 {
5559*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
5560*1c12ee1eSDan Willemsen	}
5561*1c12ee1eSDan Willemsen	out.n = n
5562*1c12ee1eSDan Willemsen	return protoreflect.ValueOfBytes(append(emptyBuf[:], v...)), out, nil
5563*1c12ee1eSDan Willemsen}
5564*1c12ee1eSDan Willemsen
5565*1c12ee1eSDan Willemsenvar coderBytesValue = valueCoderFuncs{
5566*1c12ee1eSDan Willemsen	size:      sizeBytesValue,
5567*1c12ee1eSDan Willemsen	marshal:   appendBytesValue,
5568*1c12ee1eSDan Willemsen	unmarshal: consumeBytesValue,
5569*1c12ee1eSDan Willemsen	merge:     mergeBytesValue,
5570*1c12ee1eSDan Willemsen}
5571*1c12ee1eSDan Willemsen
5572*1c12ee1eSDan Willemsen// sizeBytesSliceValue returns the size of wire encoding a [][]byte value as a repeated Bytes.
5573*1c12ee1eSDan Willemsenfunc sizeBytesSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) (size int) {
5574*1c12ee1eSDan Willemsen	list := listv.List()
5575*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
5576*1c12ee1eSDan Willemsen		v := list.Get(i)
5577*1c12ee1eSDan Willemsen		size += tagsize + protowire.SizeBytes(len(v.Bytes()))
5578*1c12ee1eSDan Willemsen	}
5579*1c12ee1eSDan Willemsen	return size
5580*1c12ee1eSDan Willemsen}
5581*1c12ee1eSDan Willemsen
5582*1c12ee1eSDan Willemsen// appendBytesSliceValue encodes a [][]byte value as a repeated Bytes.
5583*1c12ee1eSDan Willemsenfunc appendBytesSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
5584*1c12ee1eSDan Willemsen	list := listv.List()
5585*1c12ee1eSDan Willemsen	for i, llen := 0, list.Len(); i < llen; i++ {
5586*1c12ee1eSDan Willemsen		v := list.Get(i)
5587*1c12ee1eSDan Willemsen		b = protowire.AppendVarint(b, wiretag)
5588*1c12ee1eSDan Willemsen		b = protowire.AppendBytes(b, v.Bytes())
5589*1c12ee1eSDan Willemsen	}
5590*1c12ee1eSDan Willemsen	return b, nil
5591*1c12ee1eSDan Willemsen}
5592*1c12ee1eSDan Willemsen
5593*1c12ee1eSDan Willemsen// consumeBytesSliceValue wire decodes a [][]byte value as a repeated Bytes.
5594*1c12ee1eSDan Willemsenfunc consumeBytesSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
5595*1c12ee1eSDan Willemsen	list := listv.List()
5596*1c12ee1eSDan Willemsen	if wtyp != protowire.BytesType {
5597*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errUnknown
5598*1c12ee1eSDan Willemsen	}
5599*1c12ee1eSDan Willemsen	v, n := protowire.ConsumeBytes(b)
5600*1c12ee1eSDan Willemsen	if n < 0 {
5601*1c12ee1eSDan Willemsen		return protoreflect.Value{}, out, errDecode
5602*1c12ee1eSDan Willemsen	}
5603*1c12ee1eSDan Willemsen	list.Append(protoreflect.ValueOfBytes(append(emptyBuf[:], v...)))
5604*1c12ee1eSDan Willemsen	out.n = n
5605*1c12ee1eSDan Willemsen	return listv, out, nil
5606*1c12ee1eSDan Willemsen}
5607*1c12ee1eSDan Willemsen
5608*1c12ee1eSDan Willemsenvar coderBytesSliceValue = valueCoderFuncs{
5609*1c12ee1eSDan Willemsen	size:      sizeBytesSliceValue,
5610*1c12ee1eSDan Willemsen	marshal:   appendBytesSliceValue,
5611*1c12ee1eSDan Willemsen	unmarshal: consumeBytesSliceValue,
5612*1c12ee1eSDan Willemsen	merge:     mergeBytesListValue,
5613*1c12ee1eSDan Willemsen}
5614*1c12ee1eSDan Willemsen
5615*1c12ee1eSDan Willemsen// We append to an empty array rather than a nil []byte to get non-nil zero-length byte slices.
5616*1c12ee1eSDan Willemsenvar emptyBuf [0]byte
5617*1c12ee1eSDan Willemsen
5618*1c12ee1eSDan Willemsenvar wireTypes = map[protoreflect.Kind]protowire.Type{
5619*1c12ee1eSDan Willemsen	protoreflect.BoolKind:     protowire.VarintType,
5620*1c12ee1eSDan Willemsen	protoreflect.EnumKind:     protowire.VarintType,
5621*1c12ee1eSDan Willemsen	protoreflect.Int32Kind:    protowire.VarintType,
5622*1c12ee1eSDan Willemsen	protoreflect.Sint32Kind:   protowire.VarintType,
5623*1c12ee1eSDan Willemsen	protoreflect.Uint32Kind:   protowire.VarintType,
5624*1c12ee1eSDan Willemsen	protoreflect.Int64Kind:    protowire.VarintType,
5625*1c12ee1eSDan Willemsen	protoreflect.Sint64Kind:   protowire.VarintType,
5626*1c12ee1eSDan Willemsen	protoreflect.Uint64Kind:   protowire.VarintType,
5627*1c12ee1eSDan Willemsen	protoreflect.Sfixed32Kind: protowire.Fixed32Type,
5628*1c12ee1eSDan Willemsen	protoreflect.Fixed32Kind:  protowire.Fixed32Type,
5629*1c12ee1eSDan Willemsen	protoreflect.FloatKind:    protowire.Fixed32Type,
5630*1c12ee1eSDan Willemsen	protoreflect.Sfixed64Kind: protowire.Fixed64Type,
5631*1c12ee1eSDan Willemsen	protoreflect.Fixed64Kind:  protowire.Fixed64Type,
5632*1c12ee1eSDan Willemsen	protoreflect.DoubleKind:   protowire.Fixed64Type,
5633*1c12ee1eSDan Willemsen	protoreflect.StringKind:   protowire.BytesType,
5634*1c12ee1eSDan Willemsen	protoreflect.BytesKind:    protowire.BytesType,
5635*1c12ee1eSDan Willemsen	protoreflect.MessageKind:  protowire.BytesType,
5636*1c12ee1eSDan Willemsen	protoreflect.GroupKind:    protowire.StartGroupType,
5637*1c12ee1eSDan Willemsen}
5638