diff --git a/jsoniter.go b/jsoniter.go index 3c17c4d..eface04 100644 --- a/jsoniter.go +++ b/jsoniter.go @@ -9,7 +9,20 @@ import ( "encoding/base64" ) +type ValueType int + +const ( + Invalid ValueType = iota + String + Number + Null + Boolean + Array + Object +) + var digits []byte +var valueTypes []ValueType func init() { digits = make([]byte, 256) @@ -25,6 +38,27 @@ func init() { for i := 'A'; i <= 'F'; i++ { digits[i] = byte((i - 'A') + 10); } + valueTypes = make([]ValueType, 256) + for i := 0; i < len(valueTypes); i++ { + valueTypes[i] = Invalid + } + valueTypes['"'] = String; + valueTypes['-'] = Number; + valueTypes['0'] = Number; + valueTypes['1'] = Number; + valueTypes['2'] = Number; + valueTypes['3'] = Number; + valueTypes['4'] = Number; + valueTypes['5'] = Number; + valueTypes['6'] = Number; + valueTypes['7'] = Number; + valueTypes['8'] = Number; + valueTypes['9'] = Number; + valueTypes['t'] = Boolean; + valueTypes['f'] = Boolean; + valueTypes['n'] = Null; + valueTypes['['] = Array; + valueTypes['{'] = Object; } type Iterator struct { @@ -57,7 +91,19 @@ func ParseBytes(input []byte) *Iterator { return iter } -func (iter *Iterator) Reuse(input []byte) *Iterator { +func ParseString(input string) *Iterator { + return ParseBytes([]byte(input)) +} + +func (iter *Iterator) Reset(reader io.Reader) *Iterator { + iter.reader = reader + iter.head = 0 + iter.tail = 0 + iter.skipWhitespaces() + return iter +} + +func (iter *Iterator) ResetBytes(input []byte) *Iterator { // only for benchmarking iter.reader = nil iter.Error = nil @@ -68,8 +114,10 @@ func (iter *Iterator) Reuse(input []byte) *Iterator { return iter } -func ParseString(input string) *Iterator { - return ParseBytes([]byte(input)) +func (iter *Iterator) WhatIsNext() ValueType { + valueType := valueTypes[iter.readByte()]; + iter.unreadByte(); + return valueType; } func (iter *Iterator) skipWhitespaces() { diff --git a/jsoniter_array_test.go b/jsoniter_array_test.go index 7deb9f5..5a988d1 100644 --- a/jsoniter_array_test.go +++ b/jsoniter_array_test.go @@ -123,7 +123,7 @@ func Benchmark_jsoniter_array(b *testing.B) { iter := ParseBytes(input) b.ResetTimer() for n := 0; n < b.N; n++ { - iter.Reuse(input) + iter.ResetBytes(input) for iter.ReadArray() { iter.ReadUint64() } diff --git a/jsoniter_string_test.go b/jsoniter_string_test.go index bde8f09..aa4e1b4 100644 --- a/jsoniter_string_test.go +++ b/jsoniter_string_test.go @@ -95,7 +95,7 @@ func Benchmark_jsoniter_ascii(b *testing.B) { iter := ParseString(`"hello, world!"`) b.ResetTimer() for n := 0; n < b.N; n++ { - iter.Reuse(iter.buf) + iter.ResetBytes(iter.buf) iter.ReadString() } } @@ -104,7 +104,7 @@ func Benchmark_jsoniter_string_as_bytes(b *testing.B) { iter := ParseString(`"hello, world!"`) b.ResetTimer() for n := 0; n < b.N; n++ { - iter.Reuse(iter.buf) + iter.ResetBytes(iter.buf) iter.ReadStringAsBytes() } }