diff --git a/include/msgpack/object.h b/include/msgpack/object.h index b19d126f..0da280f5 100644 --- a/include/msgpack/object.h +++ b/include/msgpack/object.h @@ -29,6 +29,8 @@ typedef enum { MSGPACK_OBJECT_BOOLEAN = 0x01, MSGPACK_OBJECT_POSITIVE_INTEGER = 0x02, MSGPACK_OBJECT_NEGATIVE_INTEGER = 0x03, + MSGPACK_OBJECT_FLOAT32 = 0x0a, + MSGPACK_OBJECT_FLOAT64 = 0x04, MSGPACK_OBJECT_FLOAT = 0x04, #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) MSGPACK_OBJECT_DOUBLE = MSGPACK_OBJECT_FLOAT, /* obsolete */ diff --git a/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp b/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp index 84cf5801..26eff00b 100644 --- a/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp +++ b/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp @@ -47,7 +47,7 @@ struct basic_variant : bool, // BOOL int64_t, // NEGATIVE_INTEGER uint64_t, // POSITIVE_INTEGER - double, // FLOAT + double, // FLOAT32, FLOAT64 std::string, // STR #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 boost::string_ref, // STR @@ -66,7 +66,7 @@ struct basic_variant : bool, // BOOL int64_t, // NEGATIVE_INTEGER uint64_t, // POSITIVE_INTEGER - double, // FLOAT + double, // FLOAT32, FLOAT64 std::string, // STR #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 boost::string_ref, // STR @@ -286,7 +286,8 @@ struct as > { return o.as(); case type::NEGATIVE_INTEGER: return o.as(); - case type::FLOAT: + case type::FLOAT32: + case type::FLOAT64: return o.as(); case type::STR: return o.as(); @@ -326,7 +327,8 @@ struct convert > { case type::NEGATIVE_INTEGER: v = o.as(); break; - case type::FLOAT: + case type::FLOAT32: + case type::FLOAT64: v = o.as(); break; case type::STR: diff --git a/include/msgpack/v1/adaptor/float.hpp b/include/msgpack/v1/adaptor/float.hpp index b6848c1d..ae075fc6 100644 --- a/include/msgpack/v1/adaptor/float.hpp +++ b/include/msgpack/v1/adaptor/float.hpp @@ -27,7 +27,7 @@ namespace adaptor { template <> struct convert { msgpack::object const& operator()(msgpack::object const& o, float& v) const { - if(o.type == msgpack::type::FLOAT) { + if(o.type == msgpack::type::FLOAT32 || o.type == msgpack::type::FLOAT64) { v = static_cast(o.via.f64); } else if (o.type == msgpack::type::POSITIVE_INTEGER) { @@ -56,7 +56,7 @@ struct pack { template <> struct convert { msgpack::object const& operator()(msgpack::object const& o, double& v) const { - if(o.type == msgpack::type::FLOAT) { + if(o.type == msgpack::type::FLOAT32 || o.type == msgpack::type::FLOAT64) { v = o.via.f64; } else if (o.type == msgpack::type::POSITIVE_INTEGER) { @@ -85,7 +85,7 @@ struct pack { template <> struct object { void operator()(msgpack::object& o, float v) const { - o.type = msgpack::type::FLOAT; + o.type = msgpack::type::FLOAT32; o.via.f64 = static_cast(v); } }; @@ -93,7 +93,7 @@ struct object { template <> struct object { void operator()(msgpack::object& o, double v) const { - o.type = msgpack::type::FLOAT; + o.type = msgpack::type::FLOAT64; o.via.f64 = v; } }; diff --git a/include/msgpack/v1/object.hpp b/include/msgpack/v1/object.hpp index 7e6dac14..decdfdf7 100644 --- a/include/msgpack/v1/object.hpp +++ b/include/msgpack/v1/object.hpp @@ -257,7 +257,11 @@ struct pack { o.pack_int64(v.via.i64); return o; - case msgpack::type::FLOAT: + case msgpack::type::FLOAT32: + o.pack_float(static_cast(v.via.f64)); + return o; + + case msgpack::type::FLOAT64: o.pack_double(v.via.f64); return o; @@ -311,7 +315,8 @@ struct object_with_zone { case msgpack::type::BOOLEAN: case msgpack::type::POSITIVE_INTEGER: case msgpack::type::NEGATIVE_INTEGER: - case msgpack::type::FLOAT: + case msgpack::type::FLOAT32: + case msgpack::type::FLOAT64: std::memcpy(&o.via, &v.via, sizeof(v.via)); return; @@ -438,7 +443,8 @@ inline bool operator==(const msgpack::object& x, const msgpack::object& y) case msgpack::type::NEGATIVE_INTEGER: return x.via.i64 == y.via.i64; - case msgpack::type::FLOAT: + case msgpack::type::FLOAT32: + case msgpack::type::FLOAT64: return x.via.f64 == y.via.f64; case msgpack::type::STR: @@ -698,7 +704,11 @@ inline msgpack::packer& operator<< (msgpack::packer& o, const ms o.pack_int64(v.via.i64); return o; - case msgpack::type::FLOAT: + case msgpack::type::FLOAT32: + o.pack_float(v.via.f64); + return o; + + case msgpack::type::FLOAT64: o.pack_double(v.via.f64); return o; @@ -766,7 +776,8 @@ inline std::ostream& operator<< (std::ostream& s, const msgpack::object& o) s << o.via.i64; break; - case msgpack::type::FLOAT: + case msgpack::type::FLOAT32: + case msgpack::type::FLOAT64: s << o.via.f64; break; diff --git a/include/msgpack/v1/object_fwd_decl.hpp b/include/msgpack/v1/object_fwd_decl.hpp index 693ab5db..b7a4423b 100644 --- a/include/msgpack/v1/object_fwd_decl.hpp +++ b/include/msgpack/v1/object_fwd_decl.hpp @@ -30,6 +30,8 @@ namespace type { BOOLEAN = MSGPACK_OBJECT_BOOLEAN, POSITIVE_INTEGER = MSGPACK_OBJECT_POSITIVE_INTEGER, NEGATIVE_INTEGER = MSGPACK_OBJECT_NEGATIVE_INTEGER, + FLOAT32 = MSGPACK_OBJECT_FLOAT32, + FLOAT64 = MSGPACK_OBJECT_FLOAT64, FLOAT = MSGPACK_OBJECT_FLOAT, #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) DOUBLE = MSGPACK_OBJECT_DOUBLE, // obsolete diff --git a/include/msgpack/v1/unpack.hpp b/include/msgpack/v1/unpack.hpp index dd87392a..34aca95e 100644 --- a/include/msgpack/v1/unpack.hpp +++ b/include/msgpack/v1/unpack.hpp @@ -184,10 +184,10 @@ inline void unpack_int64(int64_t d, msgpack::object& o) else { o.type = msgpack::type::NEGATIVE_INTEGER; o.via.i64 = d; } } inline void unpack_float(float d, msgpack::object& o) -{ o.type = msgpack::type::FLOAT; o.via.f64 = d; } +{ o.type = msgpack::type::FLOAT32; o.via.f64 = d; } inline void unpack_double(double d, msgpack::object& o) -{ o.type = msgpack::type::FLOAT; o.via.f64 = d; } +{ o.type = msgpack::type::FLOAT64; o.via.f64 = d; } inline void unpack_nil(msgpack::object& o) { o.type = msgpack::type::NIL; } diff --git a/include/msgpack/v2/object_fwd_decl.hpp b/include/msgpack/v2/object_fwd_decl.hpp index 92bd29b1..64246e51 100644 --- a/include/msgpack/v2/object_fwd_decl.hpp +++ b/include/msgpack/v2/object_fwd_decl.hpp @@ -25,6 +25,8 @@ using v1::type::NIL; using v1::type::BOOLEAN; using v1::type::POSITIVE_INTEGER; using v1::type::NEGATIVE_INTEGER; +using v1::type::FLOAT32; +using v1::type::FLOAT64; using v1::type::FLOAT; #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) using v1::type::DOUBLE; diff --git a/src/objectc.c b/src/objectc.c index 5ebd2838..69b54d06 100644 --- a/src/objectc.c +++ b/src/objectc.c @@ -45,7 +45,10 @@ int msgpack_pack_object(msgpack_packer* pk, msgpack_object d) case MSGPACK_OBJECT_NEGATIVE_INTEGER: return msgpack_pack_int64(pk, d.via.i64); - case MSGPACK_OBJECT_FLOAT: + case MSGPACK_OBJECT_FLOAT32: + return msgpack_pack_float(pk, (float)d.via.f64); + + case MSGPACK_OBJECT_FLOAT64: return msgpack_pack_double(pk, d.via.f64); case MSGPACK_OBJECT_STR: @@ -191,7 +194,8 @@ void msgpack_object_print(FILE* out, msgpack_object o) #endif break; - case MSGPACK_OBJECT_FLOAT: + case MSGPACK_OBJECT_FLOAT32: + case MSGPACK_OBJECT_FLOAT64: fprintf(out, "%f", o.via.f64); break; @@ -324,7 +328,8 @@ int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object #endif break; - case MSGPACK_OBJECT_FLOAT: + case MSGPACK_OBJECT_FLOAT32: + case MSGPACK_OBJECT_FLOAT64: ret = snprintf(aux_buffer, aux_buffer_size, "%f", o.via.f64); aux_buffer = aux_buffer + ret; aux_buffer_size = aux_buffer_size - ret; @@ -481,7 +486,8 @@ bool msgpack_object_equal(const msgpack_object x, const msgpack_object y) case MSGPACK_OBJECT_NEGATIVE_INTEGER: return x.via.i64 == y.via.i64; - case MSGPACK_OBJECT_FLOAT: + case MSGPACK_OBJECT_FLOAT32: + case MSGPACK_OBJECT_FLOAT64: return x.via.f64 == y.via.f64; case MSGPACK_OBJECT_STR: diff --git a/src/unpack.c b/src/unpack.c index a6b29f1a..1e6cd026 100644 --- a/src/unpack.c +++ b/src/unpack.c @@ -151,7 +151,7 @@ static inline int template_callback_int64(unpack_user* u, int64_t d, msgpack_obj static inline int template_callback_float(unpack_user* u, float d, msgpack_object* o) { MSGPACK_UNUSED(u); - o->type = MSGPACK_OBJECT_FLOAT; + o->type = MSGPACK_OBJECT_FLOAT32; o->via.f64 = d; return 0; } @@ -159,7 +159,7 @@ static inline int template_callback_float(unpack_user* u, float d, msgpack_objec static inline int template_callback_double(unpack_user* u, double d, msgpack_object* o) { MSGPACK_UNUSED(u); - o->type = MSGPACK_OBJECT_FLOAT; + o->type = MSGPACK_OBJECT_FLOAT64; o->via.f64 = d; return 0; } diff --git a/test/msgpack_c.cpp b/test/msgpack_c.cpp index f6ba1713..abb9796b 100644 --- a/test/msgpack_c.cpp +++ b/test/msgpack_c.cpp @@ -225,10 +225,7 @@ TEST(MSGPACKC, simple_buffer_float) msgpack_unpack_return ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); - EXPECT_EQ(MSGPACK_OBJECT_FLOAT, obj.type); -#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) - EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type); -#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT + EXPECT_EQ(MSGPACK_OBJECT_FLOAT32, obj.type); if (isnan(val)) { EXPECT_TRUE(isnan(obj.via.f64)); #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) @@ -290,6 +287,7 @@ TEST(MSGPACKC, simple_buffer_double) msgpack_unpack_return ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); + EXPECT_EQ(MSGPACK_OBJECT_FLOAT64, obj.type); EXPECT_EQ(MSGPACK_OBJECT_FLOAT, obj.type); #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type); diff --git a/test/object.cpp b/test/object.cpp index 37b324c2..ddb888a3 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -277,12 +277,17 @@ TEST(object, construct_primitive) EXPECT_EQ(msgpack::type::NEGATIVE_INTEGER, obj_int.type); EXPECT_EQ(-1, obj_int.via.i64); - msgpack::object obj_float(1.2); - EXPECT_EQ(msgpack::type::FLOAT, obj_float.type); - EXPECT_EQ(1.2, obj_float.via.f64); + msgpack::object obj_float(1.2F); + EXPECT_EQ(msgpack::type::FLOAT32, obj_float.type); + EXPECT_EQ(1.2F, obj_float.via.f64); + + msgpack::object obj_double(1.2); + EXPECT_EQ(msgpack::type::FLOAT64, obj_double.type); + EXPECT_EQ(msgpack::type::FLOAT, obj_double.type); + EXPECT_EQ(1.2, obj_double.via.f64); #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) - EXPECT_EQ(msgpack::type::DOUBLE, obj_float.type); - EXPECT_EQ(1.2, obj_float.via.dec); + EXPECT_EQ(msgpack::type::DOUBLE, obj_double.type); + EXPECT_EQ(1.2, obj_double.via.dec); #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT msgpack::object obj_bool(true); @@ -418,3 +423,25 @@ TEST(object, clone_map) EXPECT_EQ(h.get(), obj); EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); } + +TEST(object, pack_float) +{ + msgpack::object obj(1.2F); + std::stringstream ss1; + msgpack::pack(ss1, obj); + std::stringstream ss2; + msgpack::pack(ss2, 1.2F); + EXPECT_EQ(5, ss1.str().size()); + EXPECT_EQ(ss1.str(), ss2.str()); +} + +TEST(object, pack_double) +{ + msgpack::object obj(1.2); + std::stringstream ss1; + msgpack::pack(ss1, obj); + std::stringstream ss2; + msgpack::pack(ss2, 1.2); + EXPECT_EQ(9, ss1.str().size()); + EXPECT_EQ(ss1.str(), ss2.str()); +} diff --git a/test/object_with_zone.cpp b/test/object_with_zone.cpp index 591424a7..22b068bb 100644 --- a/test/object_with_zone.cpp +++ b/test/object_with_zone.cpp @@ -176,6 +176,7 @@ TEST(object_with_zone, float) float v = 1.23f; msgpack::zone z; msgpack::object obj(v, z); + EXPECT_EQ(obj.type, msgpack::type::FLOAT32); EXPECT_TRUE(fabs(obj.as() - v) <= kEPS); v = 4.56f; EXPECT_TRUE(fabs(obj.as() - static_cast(1.23)) <= kEPS); @@ -187,6 +188,7 @@ TEST(object_with_zone, double) double v = 1.23; msgpack::zone z; msgpack::object obj(v, z); + EXPECT_EQ(obj.type, msgpack::type::FLOAT64); EXPECT_TRUE(fabs(obj.as() - v) <= kEPS); v = 4.56; EXPECT_TRUE(fabs(obj.as() - 1.23) <= kEPS);