blob: 5884ee41326cfcdf129291d23356de3887509c51 [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) {
Damien Neil68b81c32019-08-22 11:41:32 -070090 s := p.v.Elem()
91 for i, llen := 0, s.Len(); i < llen; i++ {
92 size += wire.SizeVarint(uint64(s.Index(i).Int())) + tagsize
93 }
94 return size
Damien Neilc37adef2019-04-01 13:49:56 -070095}
96
97func appendEnumSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
Damien Neil68b81c32019-08-22 11:41:32 -070098 s := p.v.Elem()
99 for i, llen := 0, s.Len(); i < llen; i++ {
100 b = wire.AppendVarint(b, wiretag)
101 b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
102 }
103 return b, nil
Damien Neilc37adef2019-04-01 13:49:56 -0700104}
105
Damien Neile91877d2019-06-27 10:54:42 -0700106func consumeEnumSlice(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (n int, err error) {
Damien Neil68b81c32019-08-22 11:41:32 -0700107 s := p.v.Elem()
108 if wtyp == wire.BytesType {
109 b, n = wire.ConsumeBytes(b)
110 if n < 0 {
111 return 0, wire.ParseError(n)
112 }
113 for len(b) > 0 {
114 v, n := wire.ConsumeVarint(b)
115 if n < 0 {
116 return 0, wire.ParseError(n)
117 }
118 rv := reflect.New(s.Type().Elem()).Elem()
119 rv.SetInt(int64(v))
120 s.Set(reflect.Append(s, rv))
121 b = b[n:]
122 }
123 return n, nil
124 }
125 if wtyp != wire.VarintType {
126 return 0, errUnknown
127 }
128 v, n := wire.ConsumeVarint(b)
129 if n < 0 {
130 return 0, wire.ParseError(n)
131 }
132 rv := reflect.New(s.Type().Elem()).Elem()
133 rv.SetInt(int64(v))
134 s.Set(reflect.Append(s, rv))
135 return n, nil
Damien Neile91877d2019-06-27 10:54:42 -0700136}
137
Damien Neil5322bdb2019-04-09 15:57:05 -0700138var coderEnumSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700139 size: sizeEnumSlice,
140 marshal: appendEnumSlice,
141 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700142}
Damien Neilc37adef2019-04-01 13:49:56 -0700143
Damien Neil7492a092019-07-10 15:23:29 -0700144func sizeEnumPackedSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
Damien Neil68b81c32019-08-22 11:41:32 -0700145 s := p.v.Elem()
146 llen := s.Len()
147 if llen == 0 {
148 return 0
149 }
150 n := 0
151 for i := 0; i < llen; i++ {
152 n += wire.SizeVarint(uint64(s.Index(i).Int()))
153 }
154 return tagsize + wire.SizeBytes(n)
Damien Neilc37adef2019-04-01 13:49:56 -0700155}
156
157func appendEnumPackedSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
Damien Neil68b81c32019-08-22 11:41:32 -0700158 s := p.v.Elem()
159 llen := s.Len()
160 if llen == 0 {
161 return b, nil
162 }
163 b = wire.AppendVarint(b, wiretag)
164 n := 0
165 for i := 0; i < llen; i++ {
166 n += wire.SizeVarint(uint64(s.Index(i).Int()))
167 }
168 b = wire.AppendVarint(b, uint64(n))
169 for i := 0; i < llen; i++ {
170 b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
171 }
172 return b, nil
Damien Neilc37adef2019-04-01 13:49:56 -0700173}
174
Damien Neil5322bdb2019-04-09 15:57:05 -0700175var coderEnumPackedSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700176 size: sizeEnumPackedSlice,
177 marshal: appendEnumPackedSlice,
178 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700179}