blob: ae872aad94a1a972c363964d74cb4e9a3c2125c5 [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
Damien Neil316febd2020-02-09 12:26:50 -080015func sizeEnum(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -070016 v := p.v.Elem().Int()
Damien Neil316febd2020-02-09 12:26:50 -080017 return f.tagsize + wire.SizeVarint(uint64(v))
Damien Neilc37adef2019-04-01 13:49:56 -070018}
19
Damien Neil316febd2020-02-09 12:26:50 -080020func appendEnum(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -070021 v := p.v.Elem().Int()
Damien Neil316febd2020-02-09 12:26:50 -080022 b = wire.AppendVarint(b, f.wiretag)
Damien Neilc37adef2019-04-01 13:49:56 -070023 b = wire.AppendVarint(b, uint64(v))
24 return b, nil
25}
26
Damien Neil316febd2020-02-09 12:26:50 -080027func consumeEnum(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ 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
Damien Neil316febd2020-02-09 12:26:50 -080046func sizeEnumNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -070047 if p.v.Elem().Int() == 0 {
48 return 0
49 }
Damien Neil316febd2020-02-09 12:26:50 -080050 return sizeEnum(p, f, opts)
Damien Neilc37adef2019-04-01 13:49:56 -070051}
52
Damien Neil316febd2020-02-09 12:26:50 -080053func appendEnumNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -070054 if p.v.Elem().Int() == 0 {
55 return b, nil
56 }
Damien Neil316febd2020-02-09 12:26:50 -080057 return appendEnum(b, p, f, opts)
Damien Neilc37adef2019-04-01 13:49:56 -070058}
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
Damien Neil316febd2020-02-09 12:26:50 -080066func sizeEnumPtr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
67 return sizeEnum(pointer{p.v.Elem()}, f, opts)
Damien Neilc37adef2019-04-01 13:49:56 -070068}
69
Damien Neil316febd2020-02-09 12:26:50 -080070func appendEnumPtr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
71 return appendEnum(b, pointer{p.v.Elem()}, f, opts)
Damien Neilc37adef2019-04-01 13:49:56 -070072}
73
Damien Neil316febd2020-02-09 12:26:50 -080074func consumeEnumPtr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, 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 }
Damien Neil316febd2020-02-09 12:26:50 -080081 return consumeEnum(b, pointer{p.v.Elem()}, wtyp, f, opts)
Damien Neile91877d2019-06-27 10:54:42 -070082}
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
Damien Neil316febd2020-02-09 12:26:50 -080090func sizeEnumSlice(p pointer, f *coderFieldInfo, 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++ {
Damien Neil316febd2020-02-09 12:26:50 -080093 size += wire.SizeVarint(uint64(s.Index(i).Int())) + f.tagsize
Damien Neil68b81c32019-08-22 11:41:32 -070094 }
95 return size
Damien Neilc37adef2019-04-01 13:49:56 -070096}
97
Damien Neil316febd2020-02-09 12:26:50 -080098func appendEnumSlice(b []byte, p pointer, f *coderFieldInfo, 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++ {
Damien Neil316febd2020-02-09 12:26:50 -0800101 b = wire.AppendVarint(b, f.wiretag)
Damien Neil68b81c32019-08-22 11:41:32 -0700102 b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
103 }
104 return b, nil
Damien Neilc37adef2019-04-01 13:49:56 -0700105}
106
Damien Neil316febd2020-02-09 12:26:50 -0800107func consumeEnumSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, 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 Neil316febd2020-02-09 12:26:50 -0800147func sizeEnumPackedSlice(p pointer, f *coderFieldInfo, 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 }
Damien Neil316febd2020-02-09 12:26:50 -0800157 return f.tagsize + wire.SizeBytes(n)
Damien Neilc37adef2019-04-01 13:49:56 -0700158}
159
Damien Neil316febd2020-02-09 12:26:50 -0800160func appendEnumPackedSlice(b []byte, p pointer, f *coderFieldInfo, 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 }
Damien Neil316febd2020-02-09 12:26:50 -0800166 b = wire.AppendVarint(b, f.wiretag)
Damien Neil68b81c32019-08-22 11:41:32 -0700167 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}