feature_iter_int.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package jsoniter
  2. import "strconv"
  3. var intDigits []int8
  4. const uint32SafeToMultiply10 = uint32(0xffffffff) / 10 - 1
  5. const uint64SafeToMultiple10 = uint64(0xffffffffffffffff) / 10 - 1
  6. const int64Max = uint64(0x7fffffffffffffff)
  7. const int32Max = uint32(0x7fffffff)
  8. const int16Max = uint32(0x7fff)
  9. const uint16Max = uint32(0xffff)
  10. const int8Max = uint32(0x7fff)
  11. const uint8Max = uint32(0xffff)
  12. func init() {
  13. intDigits = make([]int8, 256)
  14. for i := 0; i < len(floatDigits); i++ {
  15. intDigits[i] = invalidCharForNumber
  16. }
  17. for i := int8('0'); i <= int8('9'); i++ {
  18. intDigits[i] = i - int8('0')
  19. }
  20. }
  21. func (iter *Iterator) ReadUint() uint {
  22. return uint(iter.ReadUint64())
  23. }
  24. func (iter *Iterator) ReadInt() int {
  25. return int(iter.ReadInt64())
  26. }
  27. func (iter *Iterator) ReadInt8() (ret int8) {
  28. c := iter.nextToken()
  29. if c == '-' {
  30. val := iter.readUint32(iter.readByte())
  31. if val > int8Max + 1 {
  32. iter.reportError("ReadInt8", "overflow: " + strconv.FormatInt(int64(val), 10))
  33. return
  34. }
  35. return -int8(val)
  36. } else {
  37. val := iter.readUint32(c)
  38. if val > int8Max {
  39. iter.reportError("ReadInt8", "overflow: " + strconv.FormatInt(int64(val), 10))
  40. return
  41. }
  42. return int8(val)
  43. }
  44. }
  45. func (iter *Iterator) ReadUint8() (ret uint8) {
  46. val := iter.readUint32(iter.nextToken())
  47. if val > uint8Max {
  48. iter.reportError("ReadUint8", "overflow: " + strconv.FormatInt(int64(val), 10))
  49. return
  50. }
  51. return uint8(val)
  52. }
  53. func (iter *Iterator) ReadInt16() (ret int16) {
  54. c := iter.nextToken()
  55. if c == '-' {
  56. val := iter.readUint32(iter.readByte())
  57. if val > int16Max + 1 {
  58. iter.reportError("ReadInt16", "overflow: " + strconv.FormatInt(int64(val), 10))
  59. return
  60. }
  61. return -int16(val)
  62. } else {
  63. val := iter.readUint32(c)
  64. if val > int16Max {
  65. iter.reportError("ReadInt16", "overflow: " + strconv.FormatInt(int64(val), 10))
  66. return
  67. }
  68. return int16(val)
  69. }
  70. }
  71. func (iter *Iterator) ReadUint16() (ret uint16) {
  72. val := iter.readUint32(iter.nextToken())
  73. if val > uint16Max {
  74. iter.reportError("ReadUint16", "overflow: " + strconv.FormatInt(int64(val), 10))
  75. return
  76. }
  77. return uint16(val)
  78. }
  79. func (iter *Iterator) ReadInt32() (ret int32) {
  80. c := iter.nextToken()
  81. if c == '-' {
  82. val := iter.readUint32(iter.readByte())
  83. if val > int32Max + 1 {
  84. iter.reportError("ReadInt32", "overflow: " + strconv.FormatInt(int64(val), 10))
  85. return
  86. }
  87. return -int32(val)
  88. } else {
  89. val := iter.readUint32(c)
  90. if val > int32Max {
  91. iter.reportError("ReadInt32", "overflow: " + strconv.FormatInt(int64(val), 10))
  92. return
  93. }
  94. return int32(val)
  95. }
  96. }
  97. func (iter *Iterator) ReadUint32() (ret uint32) {
  98. return iter.readUint32(iter.nextToken())
  99. }
  100. func (iter *Iterator) readUint32(c byte) (ret uint32) {
  101. ind := intDigits[c]
  102. if ind == 0 {
  103. return 0 // single zero
  104. }
  105. if ind == invalidCharForNumber {
  106. iter.reportError("readUint32", "unexpected character: " + string([]byte{byte(ind)}))
  107. return
  108. }
  109. value := uint32(ind)
  110. for {
  111. for i := iter.head; i < iter.tail; i++ {
  112. ind = intDigits[iter.buf[i]]
  113. if ind == invalidCharForNumber {
  114. return value
  115. }
  116. if value > uint32SafeToMultiply10 {
  117. value2 := (value << 3) + (value << 1) + uint32(ind)
  118. if value2 < value {
  119. iter.reportError("readUint32", "overflow")
  120. return
  121. } else {
  122. value = value2
  123. continue
  124. }
  125. }
  126. value = (value << 3) + (value << 1) + uint32(ind)
  127. }
  128. if (!iter.loadMore()) {
  129. return value
  130. }
  131. }
  132. }
  133. func (iter *Iterator) ReadInt64() (ret int64) {
  134. c := iter.nextToken()
  135. if c == '-' {
  136. val := iter.readUint64(iter.readByte())
  137. if val > int64Max + 1 {
  138. iter.reportError("ReadInt64", "overflow: " + strconv.FormatUint(uint64(val), 10))
  139. return
  140. }
  141. return -int64(val)
  142. } else {
  143. val := iter.readUint64(c)
  144. if val > int64Max {
  145. iter.reportError("ReadInt64", "overflow: " + strconv.FormatUint(uint64(val), 10))
  146. return
  147. }
  148. return int64(val)
  149. }
  150. }
  151. func (iter *Iterator) ReadUint64() uint64 {
  152. return iter.readUint64(iter.nextToken())
  153. }
  154. func (iter *Iterator) readUint64(c byte) (ret uint64) {
  155. ind := intDigits[c]
  156. if ind == 0 {
  157. return 0 // single zero
  158. }
  159. if ind == invalidCharForNumber {
  160. iter.reportError("readUint64", "unexpected character: " + string([]byte{byte(ind)}))
  161. return
  162. }
  163. value := uint64(ind)
  164. for {
  165. for i := iter.head; i < iter.tail; i++ {
  166. ind = intDigits[iter.buf[i]]
  167. if ind == invalidCharForNumber {
  168. return value
  169. }
  170. if value > uint64SafeToMultiple10 {
  171. value2 := (value << 3) + (value << 1) + uint64(ind)
  172. if value2 < value {
  173. iter.reportError("readUint64", "overflow")
  174. return
  175. } else {
  176. value = value2
  177. continue
  178. }
  179. }
  180. value = (value << 3) + (value << 1) + uint64(ind)
  181. }
  182. if (!iter.loadMore()) {
  183. return value
  184. }
  185. }
  186. }