Skip to content

Commit a112ebb

Browse files
committed
Merge pull request #265 from redboltz/add_base_class_support
Base classes packing/converting/creating object::with_zone support in C+...
2 parents 2919033 + d3e6f01 commit a112ebb

File tree

3 files changed

+167
-1
lines changed

3 files changed

+167
-1
lines changed

include/msgpack/adaptor/detail/cpp11_define.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@
4343
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
4444
}
4545

46+
#define MSGPACK_BASE(base) \
47+
static_cast<base &>( \
48+
const_cast< \
49+
std::add_lvalue_reference< \
50+
std::remove_const< \
51+
std::remove_pointer< \
52+
decltype(this) \
53+
>::type \
54+
>::type \
55+
>::type \
56+
>(*this) \
57+
)
58+
4659
// MSGPACK_ADD_ENUM must be used in the global namespace.
4760
#define MSGPACK_ADD_ENUM(enum_name) \
4861
namespace msgpack { \

test/msgpack_cpp11.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,80 @@ TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_class_member)
185185
EXPECT_EQ(val1.t3, val2.t3);
186186
}
187187

188+
struct top {
189+
int t;
190+
MSGPACK_DEFINE(t);
191+
};
192+
193+
struct mid1 : top {
194+
int m1;
195+
MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
196+
};
197+
198+
struct mid2 : top {
199+
int m2;
200+
MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
201+
};
202+
203+
struct bottom : mid1, mid2 {
204+
int b;
205+
MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
206+
};
207+
208+
TEST(MSGPACK_INHERIT, simple_buffer_non_virtual)
209+
{
210+
bottom b;
211+
b.b = 1;
212+
b.m1 = 2;
213+
b.m2 = 3;
214+
b.mid1::t = 4;
215+
b.mid2::t = 5;
216+
msgpack::sbuffer sbuf;
217+
msgpack::pack(sbuf, b);
218+
msgpack::unpacked ret = msgpack::unpack(sbuf.data(), sbuf.size());
219+
bottom br = ret.get().as<bottom>();
220+
EXPECT_EQ(b.b, br.b);
221+
EXPECT_EQ(b.m1, br.m1);
222+
EXPECT_EQ(b.m2, br.m2);
223+
EXPECT_EQ(b.mid1::t, br.mid1::t);
224+
EXPECT_EQ(b.mid2::t, br.mid2::t);
225+
}
226+
227+
struct v_top {
228+
int t;
229+
MSGPACK_DEFINE(t);
230+
};
231+
232+
struct v_mid1 : virtual v_top {
233+
int m1;
234+
MSGPACK_DEFINE(m1);
235+
};
236+
237+
struct v_mid2 : virtual v_top {
238+
int m2;
239+
MSGPACK_DEFINE(m2);
240+
};
241+
242+
struct v_bottom : v_mid1, v_mid2 {
243+
int b;
244+
MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
245+
};
246+
247+
TEST(MSGPACK_INHERIT, simple_buffer_virtual)
248+
{
249+
v_bottom b;
250+
b.b = 1;
251+
b.m1 = 2;
252+
b.m2 = 3;
253+
b.t = 4;
254+
msgpack::sbuffer sbuf;
255+
msgpack::pack(sbuf, b);
256+
msgpack::unpacked ret = msgpack::unpack(sbuf.data(), sbuf.size());
257+
v_bottom br = ret.get().as<v_bottom>();
258+
EXPECT_EQ(b.b, br.b);
259+
EXPECT_EQ(b.m1, br.m1);
260+
EXPECT_EQ(b.m2, br.m2);
261+
EXPECT_EQ(b.t, br.t);
262+
}
263+
188264
#endif // !defined(MSGPACK_USE_CPP03)

test/object_with_zone.cpp

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,4 +786,81 @@ TEST(object_with_zone, tuple_empty)
786786
EXPECT_EQ(obj.as<test_t>(), v);
787787
}
788788

789-
#endif
789+
// User defined inheriting classes
790+
struct top {
791+
int t;
792+
MSGPACK_DEFINE(t);
793+
};
794+
795+
struct mid1 : top {
796+
int m1;
797+
MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
798+
};
799+
800+
struct mid2 : top {
801+
int m2;
802+
MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
803+
};
804+
805+
struct bottom : mid1, mid2 {
806+
int b;
807+
MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
808+
};
809+
810+
TEST(object_with_zone, user_defined_non_virtual)
811+
{
812+
bottom b;
813+
b.b = 1;
814+
b.m1 = 2;
815+
b.m2 = 3;
816+
b.mid1::t = 4;
817+
b.mid2::t = 5;
818+
819+
msgpack::zone z;
820+
msgpack::object obj(b, z);
821+
bottom br = obj.as<bottom>();
822+
EXPECT_EQ(b.b, br.b);
823+
EXPECT_EQ(b.m1, br.m1);
824+
EXPECT_EQ(b.m2, br.m2);
825+
EXPECT_EQ(b.mid1::t, br.mid1::t);
826+
EXPECT_EQ(b.mid2::t, br.mid2::t);
827+
}
828+
829+
struct v_top {
830+
int t;
831+
MSGPACK_DEFINE(t);
832+
};
833+
834+
struct v_mid1 : virtual v_top {
835+
int m1;
836+
MSGPACK_DEFINE(m1);
837+
};
838+
839+
struct v_mid2 : virtual v_top {
840+
int m2;
841+
MSGPACK_DEFINE(m2);
842+
};
843+
844+
struct v_bottom : v_mid1, v_mid2 {
845+
int b;
846+
MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
847+
};
848+
849+
TEST(object_with_zone, user_defined_virtual)
850+
{
851+
v_bottom b;
852+
b.b = 1;
853+
b.m1 = 2;
854+
b.m2 = 3;
855+
b.t = 4;
856+
857+
msgpack::zone z;
858+
msgpack::object obj(b, z);
859+
v_bottom br = obj.as<v_bottom>();
860+
EXPECT_EQ(b.b, br.b);
861+
EXPECT_EQ(b.m1, br.m1);
862+
EXPECT_EQ(b.m2, br.m2);
863+
EXPECT_EQ(b.t, br.t);
864+
}
865+
866+
#endif // !defined(MSGPACK_USE_CPP03)

0 commit comments

Comments
 (0)