encode_reflect.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // 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. // +build purego appengine
  5. package impl
  6. import (
  7. "google.golang.org/protobuf/internal/encoding/wire"
  8. )
  9. func sizeEnum(p pointer, tagsize int, _ marshalOptions) (size int) {
  10. v := p.v.Elem().Int()
  11. return tagsize + wire.SizeVarint(uint64(v))
  12. }
  13. func appendEnum(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  14. v := p.v.Elem().Int()
  15. b = wire.AppendVarint(b, wiretag)
  16. b = wire.AppendVarint(b, uint64(v))
  17. return b, nil
  18. }
  19. var coderEnum = pointerCoderFuncs{sizeEnum, appendEnum}
  20. func sizeEnumNoZero(p pointer, tagsize int, opts marshalOptions) (size int) {
  21. if p.v.Elem().Int() == 0 {
  22. return 0
  23. }
  24. return sizeEnum(p, tagsize, opts)
  25. }
  26. func appendEnumNoZero(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  27. if p.v.Elem().Int() == 0 {
  28. return b, nil
  29. }
  30. return appendEnum(b, p, wiretag, opts)
  31. }
  32. var coderEnumNoZero = pointerCoderFuncs{sizeEnumNoZero, appendEnumNoZero}
  33. func sizeEnumPtr(p pointer, tagsize int, opts marshalOptions) (size int) {
  34. return sizeEnum(pointer{p.v.Elem()}, tagsize, opts)
  35. }
  36. func appendEnumPtr(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  37. return appendEnum(b, pointer{p.v.Elem()}, wiretag, opts)
  38. }
  39. var coderEnumPtr = pointerCoderFuncs{sizeEnumPtr, appendEnumPtr}
  40. func sizeEnumSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
  41. return sizeEnumSliceReflect(p.v.Elem(), tagsize, opts)
  42. }
  43. func appendEnumSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  44. return appendEnumSliceReflect(b, p.v.Elem(), wiretag, opts)
  45. }
  46. var coderEnumSlice = pointerCoderFuncs{sizeEnumSlice, appendEnumSlice}
  47. func sizeEnumPackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
  48. s := p.v.Elem()
  49. slen := s.Len()
  50. if slen == 0 {
  51. return 0
  52. }
  53. n := 0
  54. for i := 0; i < slen; i++ {
  55. n += wire.SizeVarint(uint64(s.Index(i).Int()))
  56. }
  57. return tagsize + wire.SizeBytes(n)
  58. }
  59. func appendEnumPackedSlice(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  60. s := p.v.Elem()
  61. slen := s.Len()
  62. if slen == 0 {
  63. return b, nil
  64. }
  65. b = wire.AppendVarint(b, wiretag)
  66. n := 0
  67. for i := 0; i < slen; i++ {
  68. n += wire.SizeVarint(uint64(s.Index(i).Int()))
  69. }
  70. b = wire.AppendVarint(b, uint64(n))
  71. for i := 0; i < slen; i++ {
  72. b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
  73. }
  74. return b, nil
  75. }
  76. var coderEnumPackedSlice = pointerCoderFuncs{sizeEnumPackedSlice, appendEnumPackedSlice}