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"); +}