Tao Wen 8 年 前
コミット
d49ea1bc49
3 ファイル変更45 行追加9 行削除
  1. 1 1
      feature_any.go
  2. 34 7
      feature_any_float.go
  3. 10 1
      jsoniter_float_test.go

+ 1 - 1
feature_any.go

@@ -22,7 +22,7 @@ func (iter *Iterator) ReadAny() Any {
 	case Number:
 		dotFound, lazyBuf := iter.skipNumber()
 		if dotFound {
-			return &floatLazyAny{lazyBuf, nil, nil}
+			return &floatLazyAny{lazyBuf, nil, nil, 0}
 		} else {
 			return &intLazyAny{lazyBuf, nil, nil, 0}
 		}

+ 34 - 7
feature_any_float.go

@@ -1,9 +1,31 @@
 package jsoniter
 
+import (
+	"io"
+	"unsafe"
+)
+
 type floatLazyAny struct {
 	buf []byte
 	iter *Iterator
 	err error
+	cache float64
+}
+
+func (any *floatLazyAny) fillCache() {
+	if any.err != nil {
+		return
+	}
+	iter := any.iter
+	if iter == nil {
+		iter = NewIterator()
+	}
+	iter.ResetBytes(any.buf)
+	any.cache = iter.ReadFloat64()
+	if iter.Error != io.EOF {
+		iter.reportError("floatLazyAny", "there are bytes left")
+	}
+	any.err = iter.Error
 }
 
 func (any *floatLazyAny) LastError() error {
@@ -11,29 +33,34 @@ func (any *floatLazyAny) LastError() error {
 }
 
 func (any *floatLazyAny) ToBool() bool {
-	return false
+	return any.ToFloat64() != 0
 }
 
 func (any *floatLazyAny) ToInt() int {
-	return 0
+	any.fillCache()
+	return int(any.cache)
 }
 
 func (any *floatLazyAny) ToInt32() int32 {
-	return 0
+	any.fillCache()
+	return int32(any.cache)
 }
 
 func (any *floatLazyAny) ToInt64() int64 {
-	return 0
+	any.fillCache()
+	return int64(any.cache)
 }
 
 func (any *floatLazyAny) ToFloat32() float32 {
-	return 0
+	any.fillCache()
+	return float32(any.cache)
 }
 
 func (any *floatLazyAny) ToFloat64() float64 {
-	return 0
+	any.fillCache()
+	return any.cache
 }
 
 func (any *floatLazyAny) ToString() string {
-	return ""
+	return *(*string)(unsafe.Pointer(&any.buf))
 }

+ 10 - 1
jsoniter_float_test.go

@@ -45,12 +45,21 @@ func Test_read_float(t *testing.T) {
 	}
 }
 
-func Test_read_float_via_read(t *testing.T) {
+func Test_read_float_as_interface(t *testing.T) {
 	should := require.New(t)
 	iter := ParseString(`12.3`)
 	should.Equal(float64(12.3), iter.Read())
 }
 
+func Test_read_float_as_any(t *testing.T) {
+	should := require.New(t)
+	any, err := UnmarshalAnyFromString("12.3")
+	should.Nil(err)
+	should.Equal(float64(12.3), any.ToFloat64())
+	should.Equal("12.3", any.ToString())
+	should.True(any.ToBool())
+}
+
 func Test_write_float32(t *testing.T) {
 	vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
 	-0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}