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..758de76e 100644 --- a/test/user_class.cpp +++ b/test/user_class.cpp @@ -537,3 +537,60 @@ 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()); + 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); + EXPECT_EQ(d2.d, "ABC"); +}