feature_iter_int.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package jsoniter
  2. var intDigits []int8
  3. const maxUint64 = (1<<64 - 1)
  4. const cutoffUint64 = maxUint64/10 + 1
  5. const maxUint32 = (1<<32 - 1)
  6. const cutoffUint32 = maxUint32/10 + 1
  7. const int32SafeToMultiply10 = uint32(int32(0x7fffffff)/10 - 10)
  8. const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 10
  9. func init() {
  10. intDigits = make([]int8, 256)
  11. for i := 0; i < len(floatDigits); i++ {
  12. intDigits[i] = invalidCharForNumber
  13. }
  14. for i := int8('0'); i <= int8('9'); i++ {
  15. intDigits[i] = i - int8('0')
  16. }
  17. }
  18. // ReadUint reads a json object as Uint
  19. func (iter *Iterator) ReadUint() (ret uint) {
  20. val := iter.ReadUint64()
  21. converted := uint(val)
  22. if uint64(converted) != val {
  23. iter.reportError("ReadUint", "int overflow")
  24. return
  25. }
  26. return converted
  27. }
  28. // ReadUint8 reads a json object as Uint8
  29. func (iter *Iterator) ReadUint8() (ret uint8) {
  30. val := iter.ReadUint64()
  31. converted := uint8(val)
  32. if uint64(converted) != val {
  33. iter.reportError("ReadUint8", "int overflow")
  34. return
  35. }
  36. return converted
  37. }
  38. // ReadUint16 reads a json object as Uint16
  39. func (iter *Iterator) ReadUint16() (ret uint16) {
  40. val := iter.ReadUint64()
  41. converted := uint16(val)
  42. if uint64(converted) != val {
  43. iter.reportError("ReadUint16", "int overflow")
  44. return
  45. }
  46. return converted
  47. }
  48. // ReadUint64 reads a json object as Uint64
  49. func (iter *Iterator) ReadUint64() (ret uint64) {
  50. c := iter.nextToken()
  51. v := hexDigits[c]
  52. if v == 0 {
  53. return 0 // single zero
  54. }
  55. if v == 255 {
  56. iter.reportError("ReadUint64", "unexpected character")
  57. return
  58. }
  59. for {
  60. if ret >= cutoffUint64 {
  61. iter.reportError("ReadUint64", "overflow")
  62. return
  63. }
  64. ret = ret*10 + uint64(v)
  65. c = iter.readByte()
  66. v = hexDigits[c]
  67. if v == 255 {
  68. iter.unreadByte()
  69. break
  70. }
  71. }
  72. return ret
  73. }
  74. // ReadInt reads a json object as Int
  75. func (iter *Iterator) ReadInt() (ret int) {
  76. val := iter.ReadInt64()
  77. converted := int(val)
  78. if int64(converted) != val {
  79. iter.reportError("ReadInt", "int overflow")
  80. return
  81. }
  82. return converted
  83. }
  84. // ReadInt8 reads a json object as Int8
  85. func (iter *Iterator) ReadInt8() (ret int8) {
  86. val := iter.ReadInt64()
  87. converted := int8(val)
  88. if int64(converted) != val {
  89. iter.reportError("ReadInt8", "int overflow")
  90. return
  91. }
  92. return converted
  93. }
  94. // ReadInt16 reads a json object as Int16
  95. func (iter *Iterator) ReadInt16() (ret int16) {
  96. val := iter.ReadInt64()
  97. converted := int16(val)
  98. if int64(converted) != val {
  99. iter.reportError("ReadInt16", "int overflow")
  100. return
  101. }
  102. return converted
  103. }
  104. func (iter *Iterator) ReadInt32() int32 {
  105. c := iter.nextToken()
  106. if c == '-' {
  107. return -int32(iter.readUint32(int32SafeToMultiply10, iter.readByte()))
  108. } else {
  109. return int32(iter.readUint32(int32SafeToMultiply10, c))
  110. }
  111. }
  112. func (iter *Iterator) ReadUint32() uint32 {
  113. return iter.readUint32(uint32SafeToMultiply10, iter.nextToken())
  114. }
  115. func (iter *Iterator) readUint32(safeToMultiply10 uint32, c byte) (ret uint32) {
  116. ind := intDigits[c]
  117. if ind == 0 {
  118. return 0 // single zero
  119. }
  120. if ind == invalidCharForNumber {
  121. iter.reportError("readUint32", "unexpected character: " + string([]byte{byte(ind)}))
  122. return
  123. }
  124. value := uint32(ind)
  125. for {
  126. for i := iter.head; i < iter.tail; i++ {
  127. if value > safeToMultiply10 {
  128. iter.reportError("readUint32", "overflow")
  129. return
  130. }
  131. ind = intDigits[iter.buf[i]]
  132. if ind == invalidCharForNumber {
  133. return value
  134. }
  135. value = (value << 3) + (value << 1) + uint32(ind)
  136. }
  137. if (!iter.loadMore()) {
  138. return value
  139. }
  140. }
  141. }
  142. // ReadInt64 reads a json object as Int64
  143. func (iter *Iterator) ReadInt64() (ret int64) {
  144. c := iter.nextToken()
  145. if iter.Error != nil {
  146. return
  147. }
  148. /* optional leading minus */
  149. if c == '-' {
  150. n := iter.ReadUint64()
  151. return -int64(n)
  152. }
  153. iter.unreadByte()
  154. n := iter.ReadUint64()
  155. return int64(n)
  156. }