integers.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package msgp
  2. /* ----------------------------------
  3. integer encoding utilities
  4. (inline-able)
  5. TODO(tinylib): there are faster,
  6. albeit non-portable solutions
  7. to the code below. implement
  8. byteswap?
  9. ---------------------------------- */
  10. func putMint64(b []byte, i int64) {
  11. b[0] = mint64
  12. b[1] = byte(i >> 56)
  13. b[2] = byte(i >> 48)
  14. b[3] = byte(i >> 40)
  15. b[4] = byte(i >> 32)
  16. b[5] = byte(i >> 24)
  17. b[6] = byte(i >> 16)
  18. b[7] = byte(i >> 8)
  19. b[8] = byte(i)
  20. }
  21. func getMint64(b []byte) int64 {
  22. return (int64(b[1]) << 56) | (int64(b[2]) << 48) |
  23. (int64(b[3]) << 40) | (int64(b[4]) << 32) |
  24. (int64(b[5]) << 24) | (int64(b[6]) << 16) |
  25. (int64(b[7]) << 8) | (int64(b[8]))
  26. }
  27. func putMint32(b []byte, i int32) {
  28. b[0] = mint32
  29. b[1] = byte(i >> 24)
  30. b[2] = byte(i >> 16)
  31. b[3] = byte(i >> 8)
  32. b[4] = byte(i)
  33. }
  34. func getMint32(b []byte) int32 {
  35. return (int32(b[1]) << 24) | (int32(b[2]) << 16) | (int32(b[3]) << 8) | (int32(b[4]))
  36. }
  37. func putMint16(b []byte, i int16) {
  38. b[0] = mint16
  39. b[1] = byte(i >> 8)
  40. b[2] = byte(i)
  41. }
  42. func getMint16(b []byte) (i int16) {
  43. return (int16(b[1]) << 8) | int16(b[2])
  44. }
  45. func putMint8(b []byte, i int8) {
  46. b[0] = mint8
  47. b[1] = byte(i)
  48. }
  49. func getMint8(b []byte) (i int8) {
  50. return int8(b[1])
  51. }
  52. func putMuint64(b []byte, u uint64) {
  53. b[0] = muint64
  54. b[1] = byte(u >> 56)
  55. b[2] = byte(u >> 48)
  56. b[3] = byte(u >> 40)
  57. b[4] = byte(u >> 32)
  58. b[5] = byte(u >> 24)
  59. b[6] = byte(u >> 16)
  60. b[7] = byte(u >> 8)
  61. b[8] = byte(u)
  62. }
  63. func getMuint64(b []byte) uint64 {
  64. return (uint64(b[1]) << 56) | (uint64(b[2]) << 48) |
  65. (uint64(b[3]) << 40) | (uint64(b[4]) << 32) |
  66. (uint64(b[5]) << 24) | (uint64(b[6]) << 16) |
  67. (uint64(b[7]) << 8) | (uint64(b[8]))
  68. }
  69. func putMuint32(b []byte, u uint32) {
  70. b[0] = muint32
  71. b[1] = byte(u >> 24)
  72. b[2] = byte(u >> 16)
  73. b[3] = byte(u >> 8)
  74. b[4] = byte(u)
  75. }
  76. func getMuint32(b []byte) uint32 {
  77. return (uint32(b[1]) << 24) | (uint32(b[2]) << 16) | (uint32(b[3]) << 8) | (uint32(b[4]))
  78. }
  79. func putMuint16(b []byte, u uint16) {
  80. b[0] = muint16
  81. b[1] = byte(u >> 8)
  82. b[2] = byte(u)
  83. }
  84. func getMuint16(b []byte) uint16 {
  85. return (uint16(b[1]) << 8) | uint16(b[2])
  86. }
  87. func putMuint8(b []byte, u uint8) {
  88. b[0] = muint8
  89. b[1] = byte(u)
  90. }
  91. func getMuint8(b []byte) uint8 {
  92. return uint8(b[1])
  93. }
  94. func getUnix(b []byte) (sec int64, nsec int32) {
  95. sec = (int64(b[0]) << 56) | (int64(b[1]) << 48) |
  96. (int64(b[2]) << 40) | (int64(b[3]) << 32) |
  97. (int64(b[4]) << 24) | (int64(b[5]) << 16) |
  98. (int64(b[6]) << 8) | (int64(b[7]))
  99. nsec = (int32(b[8]) << 24) | (int32(b[9]) << 16) | (int32(b[10]) << 8) | (int32(b[11]))
  100. return
  101. }
  102. func putUnix(b []byte, sec int64, nsec int32) {
  103. b[0] = byte(sec >> 56)
  104. b[1] = byte(sec >> 48)
  105. b[2] = byte(sec >> 40)
  106. b[3] = byte(sec >> 32)
  107. b[4] = byte(sec >> 24)
  108. b[5] = byte(sec >> 16)
  109. b[6] = byte(sec >> 8)
  110. b[7] = byte(sec)
  111. b[8] = byte(nsec >> 24)
  112. b[9] = byte(nsec >> 16)
  113. b[10] = byte(nsec >> 8)
  114. b[11] = byte(nsec)
  115. }
  116. /* -----------------------------
  117. prefix utilities
  118. ----------------------------- */
  119. // write prefix and uint8
  120. func prefixu8(b []byte, pre byte, sz uint8) {
  121. b[0] = pre
  122. b[1] = byte(sz)
  123. }
  124. // write prefix and big-endian uint16
  125. func prefixu16(b []byte, pre byte, sz uint16) {
  126. b[0] = pre
  127. b[1] = byte(sz >> 8)
  128. b[2] = byte(sz)
  129. }
  130. // write prefix and big-endian uint32
  131. func prefixu32(b []byte, pre byte, sz uint32) {
  132. b[0] = pre
  133. b[1] = byte(sz >> 24)
  134. b[2] = byte(sz >> 16)
  135. b[3] = byte(sz >> 8)
  136. b[4] = byte(sz)
  137. }
  138. func prefixu64(b []byte, pre byte, sz uint64) {
  139. b[0] = pre
  140. b[1] = byte(sz >> 56)
  141. b[2] = byte(sz >> 48)
  142. b[3] = byte(sz >> 40)
  143. b[4] = byte(sz >> 32)
  144. b[5] = byte(sz >> 24)
  145. b[6] = byte(sz >> 16)
  146. b[7] = byte(sz >> 8)
  147. b[8] = byte(sz)
  148. }