feature_stream_int.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. package jsoniter
  2. var digits []uint8
  3. var digitTens []uint8
  4. var digitOnes []uint8
  5. func init() {
  6. digits = []uint8{
  7. '0', '1', '2', '3', '4', '5',
  8. '6', '7', '8', '9', 'a', 'b',
  9. 'c', 'd', 'e', 'f', 'g', 'h',
  10. 'i', 'j', 'k', 'l', 'm', 'n',
  11. 'o', 'p', 'q', 'r', 's', 't',
  12. 'u', 'v', 'w', 'x', 'y', 'z',
  13. }
  14. digitTens = []uint8{
  15. '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
  16. '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
  17. '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
  18. '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
  19. '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
  20. '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
  21. '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
  22. '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
  23. '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
  24. '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
  25. }
  26. digitOnes = []uint8{
  27. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  28. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  29. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  30. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  31. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  32. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  33. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  34. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  35. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  36. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  37. }
  38. }
  39. func (stream *Stream) WriteUint8(val uint8) {
  40. if stream.Available() < 3 {
  41. stream.Flush()
  42. }
  43. charPos := stream.n
  44. if val <= 9 {
  45. charPos += 1;
  46. } else {
  47. if val <= 99 {
  48. charPos += 2;
  49. } else {
  50. charPos += 3;
  51. }
  52. }
  53. stream.n = charPos
  54. var q uint8
  55. for {
  56. q = val / 10
  57. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  58. charPos--
  59. stream.buf[charPos] = digits[r]
  60. val = q;
  61. if val == 0 {
  62. break
  63. }
  64. }
  65. }
  66. func (stream *Stream) WriteInt8(val int8) {
  67. if stream.Available() < 4 {
  68. stream.Flush()
  69. }
  70. charPos := stream.n
  71. if (val < 0) {
  72. charPos += 1
  73. val = -val
  74. stream.buf[stream.n] = '-'
  75. }
  76. if val <= 9 {
  77. charPos += 1;
  78. } else {
  79. if val <= 99 {
  80. charPos += 2;
  81. } else {
  82. charPos += 3;
  83. }
  84. }
  85. stream.n = charPos
  86. var q int8
  87. for {
  88. q = val / 10
  89. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  90. charPos--
  91. stream.buf[charPos] = digits[r]
  92. val = q;
  93. if val == 0 {
  94. break
  95. }
  96. }
  97. }
  98. func (stream *Stream) WriteUint16(val uint16) {
  99. if stream.Available() < 5 {
  100. stream.Flush()
  101. }
  102. charPos := stream.n
  103. if val <= 99 {
  104. if val <= 9 {
  105. charPos += 1;
  106. } else {
  107. charPos += 2;
  108. }
  109. } else {
  110. if val <= 999 {
  111. charPos += 3;
  112. } else {
  113. if val <= 9999 {
  114. charPos += 4;
  115. } else {
  116. charPos += 5;
  117. }
  118. }
  119. }
  120. stream.n = charPos
  121. var q uint16
  122. for {
  123. q = val / 10
  124. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  125. charPos--
  126. stream.buf[charPos] = digits[r]
  127. val = q;
  128. if val == 0 {
  129. break
  130. }
  131. }
  132. }
  133. func (stream *Stream) WriteInt16(val int16) {
  134. if stream.Available() < 6 {
  135. stream.Flush()
  136. }
  137. charPos := stream.n
  138. if (val < 0) {
  139. charPos += 1
  140. val = -val
  141. stream.buf[stream.n] = '-'
  142. }
  143. if val <= 99 {
  144. if val <= 9 {
  145. charPos += 1;
  146. } else {
  147. charPos += 2;
  148. }
  149. } else {
  150. if val <= 999 {
  151. charPos += 3;
  152. } else {
  153. if val <= 9999 {
  154. charPos += 4;
  155. } else {
  156. charPos += 5;
  157. }
  158. }
  159. }
  160. stream.n = charPos
  161. var q int16
  162. for {
  163. q = val / 10
  164. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  165. charPos--
  166. stream.buf[charPos] = digits[r]
  167. val = q;
  168. if val == 0 {
  169. break
  170. }
  171. }
  172. }
  173. func (stream *Stream) WriteUint32(val uint32) {
  174. if stream.Available() < 10 {
  175. stream.Flush()
  176. }
  177. charPos := stream.n
  178. if val <= 99999 {
  179. if val <= 999 {
  180. if val <= 9 {
  181. charPos += 1;
  182. } else {
  183. if val <= 99 {
  184. charPos += 2;
  185. } else {
  186. charPos += 3;
  187. }
  188. }
  189. } else {
  190. if val <= 9999 {
  191. charPos += 4;
  192. } else {
  193. charPos += 5;
  194. }
  195. }
  196. } else {
  197. if val < 99999999 {
  198. if val <= 999999 {
  199. charPos += 6;
  200. } else {
  201. if val <= 9999999 {
  202. charPos += 7;
  203. } else {
  204. charPos += 8;
  205. }
  206. }
  207. } else {
  208. if val <= 999999999 {
  209. charPos += 9;
  210. } else {
  211. charPos += 10;
  212. }
  213. }
  214. }
  215. stream.n = charPos
  216. var q uint32
  217. for val >= 65536 {
  218. q = val / 100;
  219. // really: r = i - (q * 100);
  220. r := val - ((q << 6) + (q << 5) + (q << 2));
  221. val = q;
  222. charPos--
  223. stream.buf[charPos] = digitOnes[r];
  224. charPos--
  225. stream.buf[charPos] = digitTens[r];
  226. }
  227. for {
  228. q = val / 10
  229. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  230. charPos--
  231. stream.buf[charPos] = digits[r]
  232. val = q;
  233. if val == 0 {
  234. break
  235. }
  236. }
  237. }
  238. func (stream *Stream) WriteInt32(val int32) {
  239. if stream.Available() < 11 {
  240. stream.Flush()
  241. }
  242. charPos := stream.n
  243. if (val < 0) {
  244. charPos += 1
  245. val = -val
  246. stream.buf[stream.n] = '-'
  247. }
  248. if val <= 99999 {
  249. if val <= 999 {
  250. if val <= 9 {
  251. charPos += 1;
  252. } else {
  253. if val <= 99 {
  254. charPos += 2;
  255. } else {
  256. charPos += 3;
  257. }
  258. }
  259. } else {
  260. if val <= 9999 {
  261. charPos += 4;
  262. } else {
  263. charPos += 5;
  264. }
  265. }
  266. } else {
  267. if val < 99999999 {
  268. if val <= 999999 {
  269. charPos += 6;
  270. } else {
  271. if val <= 9999999 {
  272. charPos += 7;
  273. } else {
  274. charPos += 8;
  275. }
  276. }
  277. } else {
  278. if val <= 999999999 {
  279. charPos += 9;
  280. } else {
  281. charPos += 10;
  282. }
  283. }
  284. }
  285. stream.n = charPos
  286. var q int32
  287. for val >= 65536 {
  288. q = val / 100;
  289. // really: r = i - (q * 100);
  290. r := val - ((q << 6) + (q << 5) + (q << 2));
  291. val = q;
  292. charPos--
  293. stream.buf[charPos] = digitOnes[r];
  294. charPos--
  295. stream.buf[charPos] = digitTens[r];
  296. }
  297. for {
  298. q = val / 10
  299. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  300. charPos--
  301. stream.buf[charPos] = digits[r]
  302. val = q;
  303. if val == 0 {
  304. break
  305. }
  306. }
  307. }
  308. func (stream *Stream) WriteUint64(val uint64) {
  309. if stream.Available() < 10 {
  310. stream.Flush()
  311. }
  312. charPos := stream.n
  313. if val <= 99999 {
  314. if val <= 999 {
  315. if val <= 9 {
  316. charPos += 1;
  317. } else {
  318. if val <= 99 {
  319. charPos += 2;
  320. } else {
  321. charPos += 3;
  322. }
  323. }
  324. } else {
  325. if val <= 9999 {
  326. charPos += 4;
  327. } else {
  328. charPos += 5;
  329. }
  330. }
  331. } else if val < 9999999999 {
  332. if val < 99999999 {
  333. if val <= 999999 {
  334. charPos += 6;
  335. } else {
  336. if val <= 9999999 {
  337. charPos += 7;
  338. } else {
  339. charPos += 8;
  340. }
  341. }
  342. } else {
  343. if val <= 999999999 {
  344. charPos += 9;
  345. } else {
  346. charPos += 10;
  347. }
  348. }
  349. } else {
  350. stream.writeUint64SlowPath(val)
  351. return
  352. }
  353. stream.n = charPos
  354. var q uint64
  355. for val >= 65536 {
  356. q = val / 100;
  357. // really: r = i - (q * 100);
  358. r := val - ((q << 6) + (q << 5) + (q << 2));
  359. val = q;
  360. charPos--
  361. stream.buf[charPos] = digitOnes[r];
  362. charPos--
  363. stream.buf[charPos] = digitTens[r];
  364. }
  365. for {
  366. q = val / 10
  367. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  368. charPos--
  369. stream.buf[charPos] = digits[r]
  370. val = q;
  371. if val == 0 {
  372. break
  373. }
  374. }
  375. }
  376. func (stream *Stream) WriteInt64(val int64) {
  377. if (val < 0) {
  378. val = -val
  379. stream.writeByte('-')
  380. }
  381. stream.WriteUint64(uint64(val))
  382. }
  383. func (stream *Stream) writeUint64SlowPath(val uint64) {
  384. var temp [20]byte
  385. charPos := 20
  386. var q uint64
  387. for val >= 65536 {
  388. q = val / 100;
  389. // really: r = i - (q * 100);
  390. r := val - ((q << 6) + (q << 5) + (q << 2));
  391. val = q;
  392. charPos--
  393. temp[charPos] = digitOnes[r];
  394. charPos--
  395. temp[charPos] = digitTens[r];
  396. }
  397. for {
  398. q = val / 10
  399. r := val - ((q << 3) + (q << 1)) // r = i-(q*10) ...
  400. charPos--
  401. temp[charPos] = digits[r]
  402. val = q;
  403. if val == 0 {
  404. break
  405. }
  406. }
  407. stream.Write(temp[charPos:])
  408. }
  409. func (stream *Stream) WriteInt(val int) {
  410. stream.WriteInt64(int64(val))
  411. }
  412. func (stream *Stream) WriteUint(val uint) {
  413. stream.WriteUint64(uint64(val))
  414. }