From cf4113fc22d61f04a74a74cad7d5927c911b7497 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Thu, 26 Jan 2017 16:33:16 +0800 Subject: [PATCH] wrap float --- feature_any.go | 6 ++++- feature_any_float.go | 54 ++++++++++++++++++++++++++++++++++++++++++ feature_any_int.go | 3 +-- jsoniter_array_test.go | 7 ++++++ jsoniter_float_test.go | 7 ++++++ 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/feature_any.go b/feature_any.go index 2cd7c4d..7ded0d3 100644 --- a/feature_any.go +++ b/feature_any.go @@ -65,7 +65,11 @@ func (any *baseAny) SetObject(map[string]Any) bool { } func WrapInt64(val int64) Any { - return &intAny{baseAny{}, nil, val} + return &intAny{baseAny{}, val} +} + +func WrapFloat64(val float64) Any { + return &floatAny{baseAny{}, val} } func (iter *Iterator) ReadAny() Any { diff --git a/feature_any_float.go b/feature_any_float.go index aa42c13..55464b3 100644 --- a/feature_any_float.go +++ b/feature_any_float.go @@ -3,6 +3,7 @@ package jsoniter import ( "io" "unsafe" + "strconv" ) type floatLazyAny struct { @@ -82,4 +83,57 @@ func (any *floatLazyAny) WriteTo(stream *Stream) { func (any *floatLazyAny) GetInterface() interface{} { any.fillCache() return any.cache +} + +type floatAny struct { + baseAny + val float64 +} + +func (any *floatAny) Parse() *Iterator { + return nil +} + +func (any *floatAny) ValueType() ValueType { + return Number +} + +func (any *floatAny) LastError() error { + return nil +} + +func (any *floatAny) ToBool() bool { + return any.ToFloat64() != 0 +} + +func (any *floatAny) ToInt() int { + return int(any.val) +} + +func (any *floatAny) ToInt32() int32 { + return int32(any.val) +} + +func (any *floatAny) ToInt64() int64 { + return int64(any.val) +} + +func (any *floatAny) ToFloat32() float32 { + return float32(any.val) +} + +func (any *floatAny) ToFloat64() float64 { + return any.val +} + +func (any *floatAny) ToString() string { + return strconv.FormatFloat(any.val, 'E', -1, 64) +} + +func (any *floatAny) WriteTo(stream *Stream) { + stream.WriteFloat64(any.val) +} + +func (any *floatAny) GetInterface() interface{} { + return any.val } \ No newline at end of file diff --git a/feature_any_int.go b/feature_any_int.go index 68fbd83..de52570 100644 --- a/feature_any_int.go +++ b/feature_any_int.go @@ -87,12 +87,11 @@ func (any *intLazyAny) GetInterface() interface{} { type intAny struct { baseAny - err error val int64 } func (any *intAny) LastError() error { - return any.err + return nil } func (any *intAny) ValueType() ValueType { diff --git a/jsoniter_array_test.go b/jsoniter_array_test.go index d0d77b1..6b604c3 100644 --- a/jsoniter_array_test.go +++ b/jsoniter_array_test.go @@ -90,6 +90,13 @@ func Test_array_lazy_any_get(t *testing.T) { should.Equal("[1,[2,3],4]", any.ToString()) } +func Test_array_lazy_any_get_all(t *testing.T) { + should := require.New(t) + any, err := UnmarshalAnyFromString("[[1],[2],[3,4]]") + should.Nil(err) + should.Equal("[1,2,3]", any.Get('*',0).ToString()) +} + func Test_array_lazy_any_get_invalid(t *testing.T) { should := require.New(t) any, err := UnmarshalAnyFromString("[]") diff --git a/jsoniter_float_test.go b/jsoniter_float_test.go index 63d2df9..c32e924 100644 --- a/jsoniter_float_test.go +++ b/jsoniter_float_test.go @@ -60,6 +60,13 @@ func Test_read_float_as_any(t *testing.T) { should.True(any.ToBool()) } +func Test_wrap_float(t *testing.T) { + should := require.New(t) + str, err := MarshalToString(WrapFloat64(12.3)) + should.Nil(err) + should.Equal("12.3", str) +} + 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}