Procházet zdrojové kódy

support WhatIsNext

Tao Wen před 9 roky
rodič
revize
f98c2a4150
3 změnil soubory, kde provedl 54 přidání a 6 odebrání
  1. 51 3
      jsoniter.go
  2. 1 1
      jsoniter_array_test.go
  3. 2 2
      jsoniter_string_test.go

+ 51 - 3
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() {

+ 1 - 1
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()
 		}

+ 2 - 2
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()
 	}
 }