blob: d307efe9d4f332f8202b5344ec056b0e1b40b0e0 [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
107func sizeEnumPackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
108 s := p.v.Elem()
109 slen := s.Len()
110 if slen == 0 {
111 return 0
112 }
113 n := 0
114 for i := 0; i < slen; i++ {
115 n += wire.SizeVarint(uint64(s.Index(i).Int()))
116 }
117 return tagsize + wire.SizeBytes(n)
118}
119
120func appendEnumPackedSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
121 s := p.v.Elem()
122 slen := s.Len()
123 if slen == 0 {
124 return b, nil
125 }
126 b = wire.AppendVarint(b, wiretag)
127 n := 0
128 for i := 0; i < slen; i++ {
129 n += wire.SizeVarint(uint64(s.Index(i).Int()))
130 }
131 b = wire.AppendVarint(b, uint64(n))
132 for i := 0; i < slen; i++ {
133 b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
134 }
135 return b, nil
136}
137
Damien Neil5322bdb2019-04-09 15:57:05 -0700138var coderEnumPackedSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700139 size: sizeEnumPackedSlice,
140 marshal: appendEnumPackedSlice,
141 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700142}