1
0
mirror of https://github.com/json-iterator/go.git synced 2025-06-12 22:47:42 +02:00

optimize read int

This commit is contained in:
Tao Wen
2016-12-06 10:41:05 +08:00
parent 688f2968dd
commit 38120d5ff2

View File

@ -8,6 +8,25 @@ import (
"unsafe" "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 { type Iterator struct {
reader io.Reader reader io.Reader
buf []byte buf []byte
@ -152,37 +171,26 @@ func (iter *Iterator) ReadUint32() (ret uint32) {
func (iter *Iterator) ReadUint64() (ret uint64) { func (iter *Iterator) ReadUint64() (ret uint64) {
c := iter.readByte() 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 return
} }
for {
/* 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 { if ret >= cutoffUint64 {
iter.ReportError("ReadUint64", "overflow") iter.ReportError("ReadUint64", "overflow")
return return
} }
ret = ret * uint64(10) + uint64(v) ret = ret * 10 + uint64(v)
c = iter.readByte() c = iter.readByte()
if iter.Error != nil { v = digits[c]
if iter.Error == io.EOF { if v == 255 {
break
} else {
return 0
}
}
}
if iter.Error != io.EOF {
iter.unreadByte() iter.unreadByte()
break
} }
} else {
iter.ReportError("ReadUint64", "expects 0~9")
return
} }
return ret return ret
} }