Merge pull request #535 from redboltz/add_map_name

Supported any names for MSGPACK_DEFINE_MAP using MSGPACK_NVP.
This commit is contained in:
Takatoshi Kondo 2016-11-02 13:35:36 +09:00 committed by GitHub
commit 55b51c506f
2 changed files with 58 additions and 0 deletions

View File

@ -42,6 +42,7 @@
} }
#define MSGPACK_BASE_ARRAY(base) (*const_cast<base *>(static_cast<base const*>(this))) #define MSGPACK_BASE_ARRAY(base) (*const_cast<base *>(static_cast<base const*>(this)))
#define MSGPACK_NVP(name, value) (name) (value)
#define MSGPACK_DEFINE_MAP_EACH_PROC(r, data, elem) \ #define MSGPACK_DEFINE_MAP_EACH_PROC(r, data, elem) \
MSGPACK_PP_IF( \ MSGPACK_PP_IF( \

View File

@ -537,3 +537,60 @@ TEST(MSGPACK_USER_DEFINED, test_non_intrusive)
EXPECT_EQ(t1.name(), t2.name()); 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<nvp_derived>();
EXPECT_EQ(d2.a, 1);
EXPECT_EQ(d2.b, 2);
EXPECT_EQ(d2.c, 3);
EXPECT_EQ(d2.d, "ABC");
}