mirror of
https://github.com/json-iterator/go.git
synced 2025-03-29 21:20:52 +02:00
optimize read int
This commit is contained in:
parent
688f2968dd
commit
38120d5ff2
60
jsoniter.go
60
jsoniter.go
@ -8,6 +8,25 @@ import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var digits []byte
|
||||
|
||||
func init() {
|
||||
digits = make([]byte, 256)
|
||||
for i := 0; i < len(digits); i++ {
|
||||
digits[i] = 255
|
||||
}
|
||||
for i := '0'; i <= '9'; i++ {
|
||||
digits[i] = byte(i - '0');
|
||||
}
|
||||
for i := 'a'; i <= 'f'; i++ {
|
||||
digits[i] = byte((i - 'a') + 10);
|
||||
}
|
||||
for i := 'A'; i <= 'F'; i++ {
|
||||
digits[i] = byte((i - 'A') + 10);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
type Iterator struct {
|
||||
reader io.Reader
|
||||
buf []byte
|
||||
@ -152,37 +171,26 @@ func (iter *Iterator) ReadUint32() (ret uint32) {
|
||||
|
||||
func (iter *Iterator) ReadUint64() (ret uint64) {
|
||||
c := iter.readByte()
|
||||
if iter.Error != nil {
|
||||
v := digits[c]
|
||||
if v == 0 {
|
||||
return 0 // single zero
|
||||
}
|
||||
if v == 255 {
|
||||
iter.ReportError("ReadUint64", "unexpected character")
|
||||
return
|
||||
}
|
||||
|
||||
/* a single zero, or a series of integers */
|
||||
if c == '0' {
|
||||
return 0
|
||||
} else if c >= '1' && c <= '9' {
|
||||
for c >= '0' && c <= '9' {
|
||||
var v byte
|
||||
v = c - '0'
|
||||
if ret >= cutoffUint64 {
|
||||
iter.ReportError("ReadUint64", "overflow")
|
||||
return
|
||||
}
|
||||
ret = ret * uint64(10) + uint64(v)
|
||||
c = iter.readByte()
|
||||
if iter.Error != nil {
|
||||
if iter.Error == io.EOF {
|
||||
break
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
for {
|
||||
if ret >= cutoffUint64 {
|
||||
iter.ReportError("ReadUint64", "overflow")
|
||||
return
|
||||
}
|
||||
if iter.Error != io.EOF {
|
||||
ret = ret * 10 + uint64(v)
|
||||
c = iter.readByte()
|
||||
v = digits[c]
|
||||
if v == 255 {
|
||||
iter.unreadByte()
|
||||
break
|
||||
}
|
||||
} else {
|
||||
iter.ReportError("ReadUint64", "expects 0~9")
|
||||
return
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user