blob: 75420d94028a3e644a5826a95fb56234387ec578 [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 Neilf0831e82020-01-21 14:25:12 -080027func consumeEnum(b []byte, p pointer, wtyp wire.Type, _ unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neile91877d2019-06-27 10:54:42 -070028 if wtyp != wire.VarintType {
Damien Neilf0831e82020-01-21 14:25:12 -080029 return out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -070030 }
31 v, n := wire.ConsumeVarint(b)
32 if n < 0 {
Damien Neilf0831e82020-01-21 14:25:12 -080033 return out, wire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -070034 }
35 p.v.Elem().SetInt(int64(v))
Damien Neilf0831e82020-01-21 14:25:12 -080036 out.n = n
37 return out, nil
Damien Neile91877d2019-06-27 10:54:42 -070038}
39
Damien Neil5322bdb2019-04-09 15:57:05 -070040var coderEnum = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -070041 size: sizeEnum,
42 marshal: appendEnum,
43 unmarshal: consumeEnum,
Damien Neil5322bdb2019-04-09 15:57:05 -070044}
Damien Neilc37adef2019-04-01 13:49:56 -070045
46func sizeEnumNoZero(p pointer, tagsize int, opts marshalOptions) (size int) {
47 if p.v.Elem().Int() == 0 {
48 return 0
49 }
50 return sizeEnum(p, tagsize, opts)
51}
52
53func appendEnumNoZero(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
54 if p.v.Elem().Int() == 0 {
55 return b, nil
56 }
57 return appendEnum(b, p, wiretag, opts)
58}
59
Damien Neil5322bdb2019-04-09 15:57:05 -070060var coderEnumNoZero = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -070061 size: sizeEnumNoZero,
62 marshal: appendEnumNoZero,
63 unmarshal: consumeEnum,
Damien Neil5322bdb2019-04-09 15:57:05 -070064}
Damien Neilc37adef2019-04-01 13:49:56 -070065
66func sizeEnumPtr(p pointer, tagsize int, opts marshalOptions) (size int) {
67 return sizeEnum(pointer{p.v.Elem()}, tagsize, opts)
68}
69
70func appendEnumPtr(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
71 return appendEnum(b, pointer{p.v.Elem()}, wiretag, opts)
72}
73
Damien Neilf0831e82020-01-21 14:25:12 -080074func consumeEnumPtr(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neile91877d2019-06-27 10:54:42 -070075 if wtyp != wire.VarintType {
Damien Neilf0831e82020-01-21 14:25:12 -080076 return out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -070077 }
78 if p.v.Elem().IsNil() {
79 p.v.Elem().Set(reflect.New(p.v.Elem().Type().Elem()))
80 }
81 return consumeEnum(b, pointer{p.v.Elem()}, wtyp, opts)
82}
83
Damien Neil5322bdb2019-04-09 15:57:05 -070084var coderEnumPtr = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -070085 size: sizeEnumPtr,
86 marshal: appendEnumPtr,
87 unmarshal: consumeEnumPtr,
Damien Neil5322bdb2019-04-09 15:57:05 -070088}
Damien Neilc37adef2019-04-01 13:49:56 -070089
90func sizeEnumSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
Damien Neil68b81c32019-08-22 11:41:32 -070091 s := p.v.Elem()
92 for i, llen := 0, s.Len(); i < llen; i++ {
93 size += wire.SizeVarint(uint64(s.Index(i).Int())) + tagsize
94 }
95 return size
Damien Neilc37adef2019-04-01 13:49:56 -070096}
97
98func appendEnumSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
Damien Neil68b81c32019-08-22 11:41:32 -070099 s := p.v.Elem()
100 for i, llen := 0, s.Len(); i < llen; i++ {
101 b = wire.AppendVarint(b, wiretag)
102 b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
103 }
104 return b, nil
Damien Neilc37adef2019-04-01 13:49:56 -0700105}
106
Damien Neilf0831e82020-01-21 14:25:12 -0800107func consumeEnumSlice(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neil68b81c32019-08-22 11:41:32 -0700108 s := p.v.Elem()
109 if wtyp == wire.BytesType {
Damien Neilf0831e82020-01-21 14:25:12 -0800110 b, n := wire.ConsumeBytes(b)
Damien Neil68b81c32019-08-22 11:41:32 -0700111 if n < 0 {
Damien Neilf0831e82020-01-21 14:25:12 -0800112 return out, wire.ParseError(n)
Damien Neil68b81c32019-08-22 11:41:32 -0700113 }
114 for len(b) > 0 {
115 v, n := wire.ConsumeVarint(b)
116 if n < 0 {
Damien Neilf0831e82020-01-21 14:25:12 -0800117 return out, wire.ParseError(n)
Damien Neil68b81c32019-08-22 11:41:32 -0700118 }
119 rv := reflect.New(s.Type().Elem()).Elem()
120 rv.SetInt(int64(v))
121 s.Set(reflect.Append(s, rv))
122 b = b[n:]
123 }
Damien Neilf0831e82020-01-21 14:25:12 -0800124 out.n = n
125 return out, nil
Damien Neil68b81c32019-08-22 11:41:32 -0700126 }
127 if wtyp != wire.VarintType {
Damien Neilf0831e82020-01-21 14:25:12 -0800128 return out, errUnknown
Damien Neil68b81c32019-08-22 11:41:32 -0700129 }
130 v, n := wire.ConsumeVarint(b)
131 if n < 0 {
Damien Neilf0831e82020-01-21 14:25:12 -0800132 return out, wire.ParseError(n)
Damien Neil68b81c32019-08-22 11:41:32 -0700133 }
134 rv := reflect.New(s.Type().Elem()).Elem()
135 rv.SetInt(int64(v))
136 s.Set(reflect.Append(s, rv))
Damien Neilf0831e82020-01-21 14:25:12 -0800137 out.n = n
138 return out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700139}
140
Damien Neil5322bdb2019-04-09 15:57:05 -0700141var coderEnumSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700142 size: sizeEnumSlice,
143 marshal: appendEnumSlice,
144 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700145}
Damien Neilc37adef2019-04-01 13:49:56 -0700146
Damien Neil7492a092019-07-10 15:23:29 -0700147func sizeEnumPackedSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
Damien Neil68b81c32019-08-22 11:41:32 -0700148 s := p.v.Elem()
149 llen := s.Len()
150 if llen == 0 {
151 return 0
152 }
153 n := 0
154 for i := 0; i < llen; i++ {
155 n += wire.SizeVarint(uint64(s.Index(i).Int()))
156 }
157 return tagsize + wire.SizeBytes(n)
Damien Neilc37adef2019-04-01 13:49:56 -0700158}
159
160func appendEnumPackedSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
Damien Neil68b81c32019-08-22 11:41:32 -0700161 s := p.v.Elem()
162 llen := s.Len()
163 if llen == 0 {
164 return b, nil
165 }
166 b = wire.AppendVarint(b, wiretag)
167 n := 0
168 for i := 0; i < llen; i++ {
169 n += wire.SizeVarint(uint64(s.Index(i).Int()))
170 }
171 b = wire.AppendVarint(b, uint64(n))
172 for i := 0; i < llen; i++ {
173 b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
174 }
175 return b, nil
Damien Neilc37adef2019-04-01 13:49:56 -0700176}
177
Damien Neil5322bdb2019-04-09 15:57:05 -0700178var coderEnumPackedSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700179 size: sizeEnumPackedSlice,
180 marshal: appendEnumPackedSlice,
181 unmarshal: consumeEnumSlice,
Damien Neil5322bdb2019-04-09 15:57:05 -0700182}