From e61cd763109b17966f270fe0247a240fd2a6a24d Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sun, 30 Oct 2016 16:25:19 +0900 Subject: [PATCH 1/2] Supported any names for MSGPACK_DEFINE_MAP using MSGPACK_NVP. --- include/msgpack/adaptor/define_decl.hpp | 1 + test/user_class.cpp | 30 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/msgpack/adaptor/define_decl.hpp b/include/msgpack/adaptor/define_decl.hpp index 2760b653..d25363cc 100644 --- a/include/msgpack/adaptor/define_decl.hpp +++ b/include/msgpack/adaptor/define_decl.hpp @@ -42,6 +42,7 @@ } #define MSGPACK_BASE_ARRAY(base) (*const_cast(static_cast(this))) +#define MSGPACK_NVP(name, value) (name) (value) #define MSGPACK_DEFINE_MAP_EACH_PROC(r, data, elem) \ MSGPACK_PP_IF( \ diff --git a/test/user_class.cpp b/test/user_class.cpp index e06e305f..d5750f5e 100644 --- a/test/user_class.cpp +++ b/test/user_class.cpp @@ -537,3 +537,33 @@ TEST(MSGPACK_USER_DEFINED, test_non_intrusive) EXPECT_EQ(t1.name(), t2.name()); } + +struct nvp_base { + int a; + int b; + MSGPACK_DEFINE_MAP(MSGPACK_NVP("aaa", a), b); +}; + +struct nvp_derived : nvp_base { + int c; + std::string d; + MSGPACK_DEFINE_MAP(MSGPACK_NVP("ccc", c), MSGPACK_NVP("base", MSGPACK_BASE(nvp_base)), MSGPACK_NVP("ddd", d)); +}; + +TEST(MSGPACK_NVP, combination) +{ + msgpack::sbuffer sbuf; + nvp_derived d1; + d1.a = 1; + d1.b = 2; + d1.c = 3; + d1.d = "ABC"; + + msgpack::pack(sbuf, d1); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + nvp_derived d2 = oh.get().as(); + EXPECT_EQ(d2.a, 1); + EXPECT_EQ(d2.b, 2); + EXPECT_EQ(d2.c, 3); + EXPECT_EQ(d2.d, "ABC"); +} From a97c00e46370f4ab8c0452f219311c68f2525bea Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Wed, 2 Nov 2016 08:53:14 +0900 Subject: [PATCH 2/2] Added msgpack::object cheking code before covert it. --- test/user_class.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/test/user_class.cpp b/test/user_class.cpp index d5750f5e..758de76e 100644 --- a/test/user_class.cpp +++ b/test/user_class.cpp @@ -561,7 +561,34 @@ TEST(MSGPACK_NVP, combination) msgpack::pack(sbuf, d1); msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - nvp_derived d2 = oh.get().as(); + msgpack::object obj = oh.get(); + + EXPECT_EQ(obj.via.map.size, 3); + + EXPECT_EQ(std::string(obj.via.map.ptr[0].key.via.str.ptr, obj.via.map.ptr[0].key.via.str.size), "ccc"); + EXPECT_EQ(obj.via.map.ptr[0].val.via.i64, 3); + + EXPECT_EQ(std::string(obj.via.map.ptr[1].key.via.str.ptr, obj.via.map.ptr[1].key.via.str.size), "base"); + EXPECT_EQ(obj.via.map.ptr[1].val.via.map.size, 2); + EXPECT_EQ( + std::string( + obj.via.map.ptr[1].val.via.map.ptr[0].key.via.str.ptr, + obj.via.map.ptr[1].val.via.map.ptr[0].key.via.str.size), + "aaa" + ); + EXPECT_EQ(obj.via.map.ptr[1].val.via.map.ptr[0].val.via.i64, 1); + EXPECT_EQ( + std::string( + obj.via.map.ptr[1].val.via.map.ptr[1].key.via.str.ptr, + obj.via.map.ptr[1].val.via.map.ptr[1].key.via.str.size), + "b" + ); + EXPECT_EQ(obj.via.map.ptr[1].val.via.map.ptr[1].val.via.i64, 2); + + EXPECT_EQ(std::string(obj.via.map.ptr[2].key.via.str.ptr, obj.via.map.ptr[2].key.via.str.size), "ddd"); + EXPECT_EQ(std::string(obj.via.map.ptr[2].val.via.str.ptr, obj.via.map.ptr[2].val.via.str.size), "ABC"); + + nvp_derived d2 = obj.as(); EXPECT_EQ(d2.a, 1); EXPECT_EQ(d2.b, 2); EXPECT_EQ(d2.c, 3);