feature_stream_int.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package jsoniter
  2. var digits []uint32
  3. func init() {
  4. digits = make([]uint32, 1000)
  5. for i := uint32(0); i < 1000; i++ {
  6. digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0'
  7. if i < 10 {
  8. digits[i] += 2 << 24
  9. } else if i < 100 {
  10. digits[i] += 1 << 24
  11. }
  12. }
  13. }
  14. func writeFirstBuf(buf []byte, v uint32, n int) int {
  15. start := v >> 24
  16. if start == 0 {
  17. buf[n] = byte(v >> 16)
  18. n++
  19. buf[n] = byte(v >> 8)
  20. n++
  21. } else if start == 1 {
  22. buf[n] = byte(v >> 8)
  23. n++
  24. }
  25. buf[n] = byte(v)
  26. n++
  27. return n
  28. }
  29. func writeBuf(buf []byte, v uint32, n int) {
  30. buf[n] = byte(v >> 16)
  31. buf[n+1] = byte(v >> 8)
  32. buf[n+2] = byte(v)
  33. }
  34. // WriteUint8 write uint8 to stream
  35. func (stream *Stream) WriteUint8(val uint8) {
  36. stream.ensure(3)
  37. stream.n = writeFirstBuf(stream.buf, digits[val], stream.n)
  38. }
  39. // WriteInt8 write int8 to stream
  40. func (stream *Stream) WriteInt8(nval int8) {
  41. stream.ensure(4)
  42. n := stream.n
  43. var val uint8
  44. if nval < 0 {
  45. val = uint8(-nval)
  46. stream.buf[n] = '-'
  47. n++
  48. } else {
  49. val = uint8(nval)
  50. }
  51. stream.n = writeFirstBuf(stream.buf, digits[val], n)
  52. }
  53. // WriteUint16 write uint16 to stream
  54. func (stream *Stream) WriteUint16(val uint16) {
  55. stream.ensure(5)
  56. q1 := val / 1000
  57. if q1 == 0 {
  58. stream.n = writeFirstBuf(stream.buf, digits[val], stream.n)
  59. return
  60. }
  61. r1 := val - q1*1000
  62. n := writeFirstBuf(stream.buf, digits[q1], stream.n)
  63. writeBuf(stream.buf, digits[r1], n)
  64. stream.n = n + 3
  65. return
  66. }
  67. // WriteInt16 write int16 to stream
  68. func (stream *Stream) WriteInt16(nval int16) {
  69. stream.ensure(6)
  70. n := stream.n
  71. var val uint16
  72. if nval < 0 {
  73. val = uint16(-nval)
  74. stream.buf[n] = '-'
  75. n++
  76. } else {
  77. val = uint16(nval)
  78. }
  79. q1 := val / 1000
  80. if q1 == 0 {
  81. stream.n = writeFirstBuf(stream.buf, digits[val], n)
  82. return
  83. }
  84. r1 := val - q1*1000
  85. n = writeFirstBuf(stream.buf, digits[q1], n)
  86. writeBuf(stream.buf, digits[r1], n)
  87. stream.n = n + 3
  88. return
  89. }
  90. // WriteUint32 write uint32 to stream
  91. func (stream *Stream) WriteUint32(val uint32) {
  92. stream.ensure(10)
  93. n := stream.n
  94. q1 := val / 1000
  95. if q1 == 0 {
  96. stream.n = writeFirstBuf(stream.buf, digits[val], n)
  97. return
  98. }
  99. r1 := val - q1*1000
  100. q2 := q1 / 1000
  101. if q2 == 0 {
  102. n := writeFirstBuf(stream.buf, digits[q1], n)
  103. writeBuf(stream.buf, digits[r1], n)
  104. stream.n = n + 3
  105. return
  106. }
  107. r2 := q1 - q2*1000
  108. q3 := q2 / 1000
  109. if q3 == 0 {
  110. n = writeFirstBuf(stream.buf, digits[q2], n)
  111. } else {
  112. r3 := q2 - q3*1000
  113. stream.buf[n] = byte(q3 + '0')
  114. n++
  115. writeBuf(stream.buf, digits[r3], n)
  116. n += 3
  117. }
  118. writeBuf(stream.buf, digits[r2], n)
  119. writeBuf(stream.buf, digits[r1], n+3)
  120. stream.n = n + 6
  121. }
  122. // WriteInt32 write int32 to stream
  123. func (stream *Stream) WriteInt32(nval int32) {
  124. stream.ensure(11)
  125. n := stream.n
  126. var val uint32
  127. if nval < 0 {
  128. val = uint32(-nval)
  129. stream.buf[n] = '-'
  130. n++
  131. } else {
  132. val = uint32(nval)
  133. }
  134. q1 := val / 1000
  135. if q1 == 0 {
  136. stream.n = writeFirstBuf(stream.buf, digits[val], n)
  137. return
  138. }
  139. r1 := val - q1*1000
  140. q2 := q1 / 1000
  141. if q2 == 0 {
  142. n := writeFirstBuf(stream.buf, digits[q1], n)
  143. writeBuf(stream.buf, digits[r1], n)
  144. stream.n = n + 3
  145. return
  146. }
  147. r2 := q1 - q2*1000
  148. q3 := q2 / 1000
  149. if q3 == 0 {
  150. n = writeFirstBuf(stream.buf, digits[q2], n)
  151. } else {
  152. r3 := q2 - q3*1000
  153. stream.buf[n] = byte(q3 + '0')
  154. n++
  155. writeBuf(stream.buf, digits[r3], n)
  156. n += 3
  157. }
  158. writeBuf(stream.buf, digits[r2], n)
  159. writeBuf(stream.buf, digits[r1], n+3)
  160. stream.n = n + 6
  161. }
  162. // WriteUint64 write uint64 to stream
  163. func (stream *Stream) WriteUint64(val uint64) {
  164. stream.ensure(20)
  165. n := stream.n
  166. q1 := val / 1000
  167. if q1 == 0 {
  168. stream.n = writeFirstBuf(stream.buf, digits[val], n)
  169. return
  170. }
  171. r1 := val - q1*1000
  172. q2 := q1 / 1000
  173. if q2 == 0 {
  174. n := writeFirstBuf(stream.buf, digits[q1], n)
  175. writeBuf(stream.buf, digits[r1], n)
  176. stream.n = n + 3
  177. return
  178. }
  179. r2 := q1 - q2*1000
  180. q3 := q2 / 1000
  181. if q3 == 0 {
  182. n = writeFirstBuf(stream.buf, digits[q2], n)
  183. writeBuf(stream.buf, digits[r2], n)
  184. writeBuf(stream.buf, digits[r1], n+3)
  185. stream.n = n + 6
  186. return
  187. }
  188. r3 := q2 - q3*1000
  189. q4 := q3 / 1000
  190. if q4 == 0 {
  191. n = writeFirstBuf(stream.buf, digits[q3], n)
  192. writeBuf(stream.buf, digits[r3], n)
  193. writeBuf(stream.buf, digits[r2], n+3)
  194. writeBuf(stream.buf, digits[r1], n+6)
  195. stream.n = n + 9
  196. return
  197. }
  198. r4 := q3 - q4*1000
  199. q5 := q4 / 1000
  200. if q5 == 0 {
  201. n = writeFirstBuf(stream.buf, digits[q4], n)
  202. writeBuf(stream.buf, digits[r4], n)
  203. writeBuf(stream.buf, digits[r3], n+3)
  204. writeBuf(stream.buf, digits[r2], n+6)
  205. writeBuf(stream.buf, digits[r1], n+9)
  206. stream.n = n + 12
  207. return
  208. }
  209. r5 := q4 - q5*1000
  210. q6 := q5 / 1000
  211. if q6 == 0 {
  212. n = writeFirstBuf(stream.buf, digits[q5], n)
  213. } else {
  214. n = writeFirstBuf(stream.buf, digits[q6], n)
  215. r6 := q5 - q6*1000
  216. writeBuf(stream.buf, digits[r6], n)
  217. n += 3
  218. }
  219. writeBuf(stream.buf, digits[r5], n)
  220. writeBuf(stream.buf, digits[r4], n+3)
  221. writeBuf(stream.buf, digits[r3], n+6)
  222. writeBuf(stream.buf, digits[r2], n+9)
  223. writeBuf(stream.buf, digits[r1], n+12)
  224. stream.n = n + 15
  225. }
  226. // WriteInt64 write int64 to stream
  227. func (stream *Stream) WriteInt64(nval int64) {
  228. stream.ensure(20)
  229. n := stream.n
  230. var val uint64
  231. if nval < 0 {
  232. val = uint64(-nval)
  233. stream.buf[n] = '-'
  234. n++
  235. } else {
  236. val = uint64(nval)
  237. }
  238. q1 := val / 1000
  239. if q1 == 0 {
  240. stream.n = writeFirstBuf(stream.buf, digits[val], n)
  241. return
  242. }
  243. r1 := val - q1*1000
  244. q2 := q1 / 1000
  245. if q2 == 0 {
  246. n := writeFirstBuf(stream.buf, digits[q1], n)
  247. writeBuf(stream.buf, digits[r1], n)
  248. stream.n = n + 3
  249. return
  250. }
  251. r2 := q1 - q2*1000
  252. q3 := q2 / 1000
  253. if q3 == 0 {
  254. n = writeFirstBuf(stream.buf, digits[q2], n)
  255. writeBuf(stream.buf, digits[r2], n)
  256. writeBuf(stream.buf, digits[r1], n+3)
  257. stream.n = n + 6
  258. return
  259. }
  260. r3 := q2 - q3*1000
  261. q4 := q3 / 1000
  262. if q4 == 0 {
  263. n = writeFirstBuf(stream.buf, digits[q3], n)
  264. writeBuf(stream.buf, digits[r3], n)
  265. writeBuf(stream.buf, digits[r2], n+3)
  266. writeBuf(stream.buf, digits[r1], n+6)
  267. stream.n = n + 9
  268. return
  269. }
  270. r4 := q3 - q4*1000
  271. q5 := q4 / 1000
  272. if q5 == 0 {
  273. n = writeFirstBuf(stream.buf, digits[q4], n)
  274. writeBuf(stream.buf, digits[r4], n)
  275. writeBuf(stream.buf, digits[r3], n+3)
  276. writeBuf(stream.buf, digits[r2], n+6)
  277. writeBuf(stream.buf, digits[r1], n+9)
  278. stream.n = n + 12
  279. return
  280. }
  281. r5 := q4 - q5*1000
  282. q6 := q5 / 1000
  283. if q6 == 0 {
  284. n = writeFirstBuf(stream.buf, digits[q5], n)
  285. } else {
  286. stream.buf[n] = byte(q6 + '0')
  287. n++
  288. r6 := q5 - q6*1000
  289. writeBuf(stream.buf, digits[r6], n)
  290. n += 3
  291. }
  292. writeBuf(stream.buf, digits[r5], n)
  293. writeBuf(stream.buf, digits[r4], n+3)
  294. writeBuf(stream.buf, digits[r3], n+6)
  295. writeBuf(stream.buf, digits[r2], n+9)
  296. writeBuf(stream.buf, digits[r1], n+12)
  297. stream.n = n + 15
  298. }
  299. // WriteInt write int to stream
  300. func (stream *Stream) WriteInt(val int) {
  301. stream.WriteInt64(int64(val))
  302. }
  303. // WriteUint write uint to stream
  304. func (stream *Stream) WriteUint(val uint) {
  305. stream.WriteUint64(uint64(val))
  306. }