Skip to content

Commit 55b51c5

Browse files
authored
Merge pull request #535 from redboltz/add_map_name
Supported any names for MSGPACK_DEFINE_MAP using MSGPACK_NVP.
2 parents c30962d + a97c00e commit 55b51c5

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

include/msgpack/adaptor/define_decl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
}
4343

4444
#define MSGPACK_BASE_ARRAY(base) (*const_cast<base *>(static_cast<base const*>(this)))
45+
#define MSGPACK_NVP(name, value) (name) (value)
4546

4647
#define MSGPACK_DEFINE_MAP_EACH_PROC(r, data, elem) \
4748
MSGPACK_PP_IF( \

test/user_class.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,3 +537,60 @@ TEST(MSGPACK_USER_DEFINED, test_non_intrusive)
537537

538538
EXPECT_EQ(t1.name(), t2.name());
539539
}
540+
541+
struct nvp_base {
542+
int a;
543+
int b;
544+
MSGPACK_DEFINE_MAP(MSGPACK_NVP("aaa", a), b);
545+
};
546+
547+
struct nvp_derived : nvp_base {
548+
int c;
549+
std::string d;
550+
MSGPACK_DEFINE_MAP(MSGPACK_NVP("ccc", c), MSGPACK_NVP("base", MSGPACK_BASE(nvp_base)), MSGPACK_NVP("ddd", d));
551+
};
552+
553+
TEST(MSGPACK_NVP, combination)
554+
{
555+
msgpack::sbuffer sbuf;
556+
nvp_derived d1;
557+
d1.a = 1;
558+
d1.b = 2;
559+
d1.c = 3;
560+
d1.d = "ABC";
561+
562+
msgpack::pack(sbuf, d1);
563+
msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size());
564+
msgpack::object obj = oh.get();
565+
566+
EXPECT_EQ(obj.via.map.size, 3);
567+
568+
EXPECT_EQ(std::string(obj.via.map.ptr[0].key.via.str.ptr, obj.via.map.ptr[0].key.via.str.size), "ccc");
569+
EXPECT_EQ(obj.via.map.ptr[0].val.via.i64, 3);
570+
571+
EXPECT_EQ(std::string(obj.via.map.ptr[1].key.via.str.ptr, obj.via.map.ptr[1].key.via.str.size), "base");
572+
EXPECT_EQ(obj.via.map.ptr[1].val.via.map.size, 2);
573+
EXPECT_EQ(
574+
std::string(
575+
obj.via.map.ptr[1].val.via.map.ptr[0].key.via.str.ptr,
576+
obj.via.map.ptr[1].val.via.map.ptr[0].key.via.str.size),
577+
"aaa"
578+
);
579+
EXPECT_EQ(obj.via.map.ptr[1].val.via.map.ptr[0].val.via.i64, 1);
580+
EXPECT_EQ(
581+
std::string(
582+
obj.via.map.ptr[1].val.via.map.ptr[1].key.via.str.ptr,
583+
obj.via.map.ptr[1].val.via.map.ptr[1].key.via.str.size),
584+
"b"
585+
);
586+
EXPECT_EQ(obj.via.map.ptr[1].val.via.map.ptr[1].val.via.i64, 2);
587+
588+
EXPECT_EQ(std::string(obj.via.map.ptr[2].key.via.str.ptr, obj.via.map.ptr[2].key.via.str.size), "ddd");
589+
EXPECT_EQ(std::string(obj.via.map.ptr[2].val.via.str.ptr, obj.via.map.ptr[2].val.via.str.size), "ABC");
590+
591+
nvp_derived d2 = obj.as<nvp_derived>();
592+
EXPECT_EQ(d2.a, 1);
593+
EXPECT_EQ(d2.b, 2);
594+
EXPECT_EQ(d2.c, 3);
595+
EXPECT_EQ(d2.d, "ABC");
596+
}

0 commit comments

Comments
 (0)