blob: b83a3b34d51fa4b4fd3f7d025d21f72c4014c50f [file] [log] [blame]
Damien Neilc37adef2019-04-01 13:49:56 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build purego appengine
6
7package impl
8
9import (
Damien Neile91877d2019-06-27 10:54:42 -070010 "reflect"
11
Damien Neilc37adef2019-04-01 13:49:56 -070012 "google.golang.org/protobuf/internal/encoding/wire"
13)
14
15func sizeEnum(p pointer, tagsize int, _ marshalOptions) (size int) {
16 v := p.v.Elem().Int()
17 return tagsize + wire.SizeVarint(uint64(v))
18}
19
20func appendEnum(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
21 v := p.v.Elem().Int()
22 b = wire.AppendVarint(b, wiretag)
23 b = wire.AppendVarint(b, uint64(v))
24 return b, nil
25}
26
Damien Neile91877d2019-06-27 10:54:42 -070027func consumeEnum(b []byte, p pointer, wtyp wire.Type, _ unmarshalOptions) (n int, err error) {
28 if wtyp != wire.VarintType {
29 return 0, errUnknown
30 }
31 v, n := wire.ConsumeVarint(b)
32 if n < 0 {
33 return 0, wire.ParseError(n)
34 }
35 p.v.Elem().SetInt(int64(v))
36 return n, nil
37}
38
Damien Neil5322bdb2019-04-09 15:57:05 -070039var coderEnum = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -070040 size: sizeEnum,
41 marshal: appendEnum,
42 unmarshal: consumeEnum,
Damien Neil5322bdb2019-04-09 15:57:05 -070043}
Damien Neilc37adef2019-04-01 13:49:56 -070044
45func sizeEnumNoZero(p pointer, tagsize int, opts marshalOptions) (size int) {
46 if p.v.Elem().Int() == 0 {
47 return 0
48 }
49 return sizeEnum(p, tagsize, opts)
50}
51
52func appendEnumNoZero(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
53 if p.v.Elem().Int() == 0 {
54 return b, nil
55 }
56 return appendEnum(b, p, wiretag, opts)
57}
58
Damien Neil5322bdb2019-04-09 15:57:05 -070059var coderEnumNoZero = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -070060 size: sizeEnumNoZero,
61 marshal: appendEnumNoZero,
62 unmarshal: consumeEnum,
Damien Neil5322bdb2019-04-09 15:57:05 -070063}
Damien Neilc37adef2019-04-01 13:49:56 -070064
65func sizeEnumPtr(p pointer, tagsize int, opts marshalOptions) (size int) {
66 return sizeEnum(pointer{p.v.Elem()}, tagsize, opts)
67}
68
69func appendEnumPtr(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
70 return appendEnum(b, pointer{p.v.Elem()}, wiretag, opts)
71}
72
Damien Neile91877d2019-06-27 10:54:42 -070073func consumeEnumPtr(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (n int, err error) {
74 if wtyp != wire.VarintType {
75 return 0, errUnknown
76 }
77 if p.v.Elem().IsNil() {
78 p.v.Elem().Set(reflect.New(p.v.Elem().Type().Elem()))
79 }
80 return consumeEnum(b, pointer{p.v.Elem()}, wtyp, opts)
81}
82
Damien Neil5322bdb2019-04-09 15:57:05 -070083var coderEnumPtr = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -070084 size: sizeEnumPtr,
85 marshal: appendEnumPtr,
86 unmarshal: consumeEnumPtr,
Damien Neil5322bdb2019-04-09 15:57:05 -070087}
Damien Neilc37adef2019-04-01 13:49:56 -070088
89func sizeEnumSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
90 return sizeEnumSliceReflect(p.v.Elem(), tagsize, opts)
91}
92
93func appendEnumSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
94 return appendEnumSliceReflect(b, p.v.Elem(), wiretag, opts)
95}
96
Damien Neile91877d2019-06-27 10:54:42 -070097func consumeEnumSlice(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (n int, err error) {
98 return consumeEnumSliceReflect(b, p.v, wtyp, opts)
99}
100
Damien Neil5322bdb2019-04-09 15:57:05 -0700101var coderEnumSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700102 size: sizeEnumSlice,
103 marshal: appendEnumSlice,
104 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700105}
Damien Neilc37adef2019-04-01 13:49:56 -0700106
Damien Neil7492a092019-07-10 15:23:29 -0700107func sizeEnumPackedSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
108 return sizeEnumPackedSliceReflect(p.v.Elem(), tagsize, opts)
Damien Neilc37adef2019-04-01 13:49:56 -0700109}
110
111func appendEnumPackedSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
Damien Neil7492a092019-07-10 15:23:29 -0700112 return appendEnumPackedSliceReflect(b, p.v.Elem(), wiretag, opts)
Damien Neilc37adef2019-04-01 13:49:56 -0700113}
114
Damien Neil5322bdb2019-04-09 15:57:05 -0700115var coderEnumPackedSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700116 size: sizeEnumPackedSlice,
117 marshal: appendEnumPackedSlice,
118 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700119}