size.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package protocol
  2. import (
  3. "math/bits"
  4. "reflect"
  5. )
  6. func sizeOf(typ reflect.Type) int {
  7. switch typ.Kind() {
  8. case reflect.Bool, reflect.Int8:
  9. return 1
  10. case reflect.Int16:
  11. return 2
  12. case reflect.Int32:
  13. return 4
  14. case reflect.Int64:
  15. return 8
  16. default:
  17. return 0
  18. }
  19. }
  20. func sizeOfString(s string) int {
  21. return 2 + len(s)
  22. }
  23. func sizeOfBytes(b []byte) int {
  24. return 4 + len(b)
  25. }
  26. func sizeOfVarString(s string) int {
  27. return sizeOfVarInt(int64(len(s))) + len(s)
  28. }
  29. func sizeOfCompactString(s string) int {
  30. return sizeOfUnsignedVarInt(uint64(len(s)+1)) + len(s)
  31. }
  32. func sizeOfVarBytes(b []byte) int {
  33. return sizeOfVarInt(int64(len(b))) + len(b)
  34. }
  35. func sizeOfCompactBytes(b []byte) int {
  36. return sizeOfUnsignedVarInt(uint64(len(b)+1)) + len(b)
  37. }
  38. func sizeOfVarNullString(s string) int {
  39. n := len(s)
  40. if n == 0 {
  41. return sizeOfVarInt(-1)
  42. }
  43. return sizeOfVarInt(int64(n)) + n
  44. }
  45. func sizeOfCompactNullString(s string) int {
  46. n := len(s)
  47. if n == 0 {
  48. return sizeOfUnsignedVarInt(0)
  49. }
  50. return sizeOfUnsignedVarInt(uint64(n)+1) + n
  51. }
  52. func sizeOfVarNullBytes(b []byte) int {
  53. if b == nil {
  54. return sizeOfVarInt(-1)
  55. }
  56. n := len(b)
  57. return sizeOfVarInt(int64(n)) + n
  58. }
  59. func sizeOfVarNullBytesIface(b Bytes) int {
  60. if b == nil {
  61. return sizeOfVarInt(-1)
  62. }
  63. n := b.Len()
  64. return sizeOfVarInt(int64(n)) + n
  65. }
  66. func sizeOfCompactNullBytes(b []byte) int {
  67. if b == nil {
  68. return sizeOfUnsignedVarInt(0)
  69. }
  70. n := len(b)
  71. return sizeOfUnsignedVarInt(uint64(n)+1) + n
  72. }
  73. func sizeOfVarInt(i int64) int {
  74. return sizeOfUnsignedVarInt(uint64((i << 1) ^ (i >> 63))) // zig-zag encoding
  75. }
  76. func sizeOfUnsignedVarInt(i uint64) int {
  77. return (bits.Len64(i|1) + 6) / 7
  78. }