Added float Json::Value::asFloat() to obtain a floating point value as a float (avoid lost of precision warning caused by used of asDouble() to initialize a float).
diff --git a/NEWS.txt b/NEWS.txt
index 250b730..ded333f 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -38,6 +38,10 @@
array.append( 1234 );
int value = array[0].asInt(); // did not compile previously
+ - Added float Json::Value::asFloat() to obtain a floating point value as a
+ float (avoid lost of precision warning caused by used of asDouble()
+ to initialize a float).
+
* Tests
- Added test to ensure that the escape sequence "\/" is corrected handled
diff --git a/include/json/value.h b/include/json/value.h
index e9632a2..8d0d4c1 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -240,6 +240,7 @@
# endif
Int asInt() const;
UInt asUInt() const;
+ float asFloat() const;
double asDouble() const;
bool asBool() const;
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index a7b7328..15a1140 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -772,6 +772,35 @@
return 0; // unreachable;
}
+float
+Value::asFloat() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0.0f;
+ case intValue:
+ return static_cast<float>( value_.int_ );
+ case uintValue:
+#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ return static_cast<float>( value_.uint_ );
+#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ return static_cast<float>( Int(value_.uint_/2) ) * 2 + Int(value_.uint_ & 1);
+#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ case realValue:
+ return static_cast<float>( value_.real_ );
+ case booleanValue:
+ return value_.bool_ ? 1.0f : 0.0f;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_ASSERT_MESSAGE( false, "Type is not convertible to float" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0.0f; // unreachable;
+}
+
bool
Value::asBool() const
{
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index 30d039c..de64200 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -28,6 +28,7 @@
Json::Value unsignedInteger_;
Json::Value smallUnsignedInteger_;
Json::Value real_;
+ Json::Value float_;
Json::Value array1_;
Json::Value object1_;
Json::Value emptyString_;
@@ -43,6 +44,7 @@
, smallUnsignedInteger_( Json::Value::UInt( Json::Value::maxInt ) )
, unsignedInteger_( 34567890u )
, real_( 1234.56789 )
+ , float_( 0.00390625f )
, emptyString_( "" )
, string1_( "a" )
, string_( "sometext with space" )
@@ -184,6 +186,11 @@
}
+JSONTEST_FIXTURE( ValueTest, asFloat )
+{
+ JSONTEST_ASSERT_EQUAL( 0.00390625f, float_.asFloat() ) << "Json::Value::asFloat()";
+}
+
void
ValueTest::checkConstMemberCount( const Json::Value &value, unsigned int expectedCount )
{
@@ -259,5 +266,6 @@
JSONTEST_REGISTER_FIXTURE( runner, ValueTest, isNull );
JSONTEST_REGISTER_FIXTURE( runner, ValueTest, isNull );
JSONTEST_REGISTER_FIXTURE( runner, ValueTest, accessArray );
+ JSONTEST_REGISTER_FIXTURE( runner, ValueTest, asFloat );
return runner.runCommandLine( argc, argv );
}