mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-04-25 17:28:15 +02:00
Refined base class pack/unpack support.
Not only C++11 but also C++03 supported.
This commit is contained in:
parent
e8e3052d1a
commit
7cd77292fc
@ -39,6 +39,8 @@
|
|||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MSGPACK_BASE(base) (*const_cast<base *>(static_cast<base const*>(this)))
|
||||||
|
|
||||||
// MSGPACK_ADD_ENUM must be used in the global namespace.
|
// MSGPACK_ADD_ENUM must be used in the global namespace.
|
||||||
#define MSGPACK_ADD_ENUM(enum_name) \
|
#define MSGPACK_ADD_ENUM(enum_name) \
|
||||||
namespace msgpack { \
|
namespace msgpack { \
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MSGPACK_BASE(base) (*const_cast<base *>(static_cast<base const*>(this)))
|
||||||
|
|
||||||
// MSGPACK_ADD_ENUM must be used in the global namespace.
|
// MSGPACK_ADD_ENUM must be used in the global namespace.
|
||||||
#define MSGPACK_ADD_ENUM(enum_name) \
|
#define MSGPACK_ADD_ENUM(enum_name) \
|
||||||
namespace msgpack { \
|
namespace msgpack { \
|
||||||
|
@ -43,18 +43,7 @@
|
|||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MSGPACK_BASE(base) \
|
#define MSGPACK_BASE(base) (*const_cast<base *>(static_cast<base const*>(this)))
|
||||||
static_cast<base &>( \
|
|
||||||
const_cast< \
|
|
||||||
std::add_lvalue_reference< \
|
|
||||||
std::remove_const< \
|
|
||||||
std::remove_pointer< \
|
|
||||||
decltype(this) \
|
|
||||||
>::type \
|
|
||||||
>::type \
|
|
||||||
>::type \
|
|
||||||
>(*this) \
|
|
||||||
)
|
|
||||||
|
|
||||||
// MSGPACK_ADD_ENUM must be used in the global namespace.
|
// MSGPACK_ADD_ENUM must be used in the global namespace.
|
||||||
#define MSGPACK_ADD_ENUM(enum_name) \
|
#define MSGPACK_ADD_ENUM(enum_name) \
|
||||||
|
@ -607,3 +607,81 @@ TEST(MSGPACK_USER_DEFINED, simple_buffer_union_member)
|
|||||||
EXPECT_EQ(val1.value.i, val2.value.i);
|
EXPECT_EQ(val1.value.i, val2.value.i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct top {
|
||||||
|
int t;
|
||||||
|
MSGPACK_DEFINE(t);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mid1 : top {
|
||||||
|
int m1;
|
||||||
|
MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mid2 : top {
|
||||||
|
int m2;
|
||||||
|
MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bottom : mid1, mid2 {
|
||||||
|
int b;
|
||||||
|
MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(MSGPACK_INHERIT, simple_buffer_non_virtual)
|
||||||
|
{
|
||||||
|
bottom b;
|
||||||
|
b.b = 1;
|
||||||
|
b.m1 = 2;
|
||||||
|
b.m2 = 3;
|
||||||
|
b.mid1::t = 4;
|
||||||
|
b.mid2::t = 5;
|
||||||
|
msgpack::sbuffer sbuf;
|
||||||
|
msgpack::pack(sbuf, b);
|
||||||
|
msgpack::unpacked ret;
|
||||||
|
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||||
|
bottom br = ret.get().as<bottom>();
|
||||||
|
EXPECT_EQ(b.b, br.b);
|
||||||
|
EXPECT_EQ(b.m1, br.m1);
|
||||||
|
EXPECT_EQ(b.m2, br.m2);
|
||||||
|
EXPECT_EQ(b.mid1::t, br.mid1::t);
|
||||||
|
EXPECT_EQ(b.mid2::t, br.mid2::t);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct v_top {
|
||||||
|
int t;
|
||||||
|
MSGPACK_DEFINE(t);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct v_mid1 : virtual v_top {
|
||||||
|
int m1;
|
||||||
|
MSGPACK_DEFINE(m1);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct v_mid2 : virtual v_top {
|
||||||
|
int m2;
|
||||||
|
MSGPACK_DEFINE(m2);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct v_bottom : v_mid1, v_mid2 {
|
||||||
|
int b;
|
||||||
|
MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(MSGPACK_INHERIT, simple_buffer_virtual)
|
||||||
|
{
|
||||||
|
v_bottom b;
|
||||||
|
b.b = 1;
|
||||||
|
b.m1 = 2;
|
||||||
|
b.m2 = 3;
|
||||||
|
b.t = 4;
|
||||||
|
msgpack::sbuffer sbuf;
|
||||||
|
msgpack::pack(sbuf, b);
|
||||||
|
msgpack::unpacked ret;
|
||||||
|
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||||
|
v_bottom br = ret.get().as<v_bottom>();
|
||||||
|
EXPECT_EQ(b.b, br.b);
|
||||||
|
EXPECT_EQ(b.m1, br.m1);
|
||||||
|
EXPECT_EQ(b.m2, br.m2);
|
||||||
|
EXPECT_EQ(b.t, br.t);
|
||||||
|
}
|
||||||
|
@ -185,80 +185,4 @@ TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_class_member)
|
|||||||
EXPECT_EQ(val1.t3, val2.t3);
|
EXPECT_EQ(val1.t3, val2.t3);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct top {
|
|
||||||
int t;
|
|
||||||
MSGPACK_DEFINE(t);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mid1 : top {
|
|
||||||
int m1;
|
|
||||||
MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mid2 : top {
|
|
||||||
int m2;
|
|
||||||
MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
|
|
||||||
};
|
|
||||||
|
|
||||||
struct bottom : mid1, mid2 {
|
|
||||||
int b;
|
|
||||||
MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(MSGPACK_INHERIT, simple_buffer_non_virtual)
|
|
||||||
{
|
|
||||||
bottom b;
|
|
||||||
b.b = 1;
|
|
||||||
b.m1 = 2;
|
|
||||||
b.m2 = 3;
|
|
||||||
b.mid1::t = 4;
|
|
||||||
b.mid2::t = 5;
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, b);
|
|
||||||
msgpack::unpacked ret = msgpack::unpack(sbuf.data(), sbuf.size());
|
|
||||||
bottom br = ret.get().as<bottom>();
|
|
||||||
EXPECT_EQ(b.b, br.b);
|
|
||||||
EXPECT_EQ(b.m1, br.m1);
|
|
||||||
EXPECT_EQ(b.m2, br.m2);
|
|
||||||
EXPECT_EQ(b.mid1::t, br.mid1::t);
|
|
||||||
EXPECT_EQ(b.mid2::t, br.mid2::t);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct v_top {
|
|
||||||
int t;
|
|
||||||
MSGPACK_DEFINE(t);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v_mid1 : virtual v_top {
|
|
||||||
int m1;
|
|
||||||
MSGPACK_DEFINE(m1);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v_mid2 : virtual v_top {
|
|
||||||
int m2;
|
|
||||||
MSGPACK_DEFINE(m2);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v_bottom : v_mid1, v_mid2 {
|
|
||||||
int b;
|
|
||||||
MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(MSGPACK_INHERIT, simple_buffer_virtual)
|
|
||||||
{
|
|
||||||
v_bottom b;
|
|
||||||
b.b = 1;
|
|
||||||
b.m1 = 2;
|
|
||||||
b.m2 = 3;
|
|
||||||
b.t = 4;
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, b);
|
|
||||||
msgpack::unpacked ret = msgpack::unpack(sbuf.data(), sbuf.size());
|
|
||||||
v_bottom br = ret.get().as<v_bottom>();
|
|
||||||
EXPECT_EQ(b.b, br.b);
|
|
||||||
EXPECT_EQ(b.m1, br.m1);
|
|
||||||
EXPECT_EQ(b.m2, br.m2);
|
|
||||||
EXPECT_EQ(b.t, br.t);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
#endif // !defined(MSGPACK_USE_CPP03)
|
||||||
|
@ -677,6 +677,83 @@ TEST(object_with_zone, construct_enum_outer)
|
|||||||
EXPECT_EQ(elem, obj.via.u64);
|
EXPECT_EQ(elem, obj.via.u64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// User defined inheriting classes
|
||||||
|
struct top {
|
||||||
|
int t;
|
||||||
|
MSGPACK_DEFINE(t);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mid1 : top {
|
||||||
|
int m1;
|
||||||
|
MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mid2 : top {
|
||||||
|
int m2;
|
||||||
|
MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bottom : mid1, mid2 {
|
||||||
|
int b;
|
||||||
|
MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(object_with_zone, user_defined_non_virtual)
|
||||||
|
{
|
||||||
|
bottom b;
|
||||||
|
b.b = 1;
|
||||||
|
b.m1 = 2;
|
||||||
|
b.m2 = 3;
|
||||||
|
b.mid1::t = 4;
|
||||||
|
b.mid2::t = 5;
|
||||||
|
|
||||||
|
msgpack::zone z;
|
||||||
|
msgpack::object obj(b, z);
|
||||||
|
bottom br = obj.as<bottom>();
|
||||||
|
EXPECT_EQ(b.b, br.b);
|
||||||
|
EXPECT_EQ(b.m1, br.m1);
|
||||||
|
EXPECT_EQ(b.m2, br.m2);
|
||||||
|
EXPECT_EQ(b.mid1::t, br.mid1::t);
|
||||||
|
EXPECT_EQ(b.mid2::t, br.mid2::t);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct v_top {
|
||||||
|
int t;
|
||||||
|
MSGPACK_DEFINE(t);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct v_mid1 : virtual v_top {
|
||||||
|
int m1;
|
||||||
|
MSGPACK_DEFINE(m1);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct v_mid2 : virtual v_top {
|
||||||
|
int m2;
|
||||||
|
MSGPACK_DEFINE(m2);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct v_bottom : v_mid1, v_mid2 {
|
||||||
|
int b;
|
||||||
|
MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(object_with_zone, user_defined_virtual)
|
||||||
|
{
|
||||||
|
v_bottom b;
|
||||||
|
b.b = 1;
|
||||||
|
b.m1 = 2;
|
||||||
|
b.m2 = 3;
|
||||||
|
b.t = 4;
|
||||||
|
|
||||||
|
msgpack::zone z;
|
||||||
|
msgpack::object obj(b, z);
|
||||||
|
v_bottom br = obj.as<v_bottom>();
|
||||||
|
EXPECT_EQ(b.b, br.b);
|
||||||
|
EXPECT_EQ(b.m1, br.m1);
|
||||||
|
EXPECT_EQ(b.m2, br.m2);
|
||||||
|
EXPECT_EQ(b.t, br.t);
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
#if !defined(MSGPACK_USE_CPP03)
|
||||||
|
|
||||||
TEST(object_with_zone, construct_enum_outer_newstyle)
|
TEST(object_with_zone, construct_enum_outer_newstyle)
|
||||||
@ -786,81 +863,4 @@ TEST(object_with_zone, tuple_empty)
|
|||||||
EXPECT_EQ(obj.as<test_t>(), v);
|
EXPECT_EQ(obj.as<test_t>(), v);
|
||||||
}
|
}
|
||||||
|
|
||||||
// User defined inheriting classes
|
|
||||||
struct top {
|
|
||||||
int t;
|
|
||||||
MSGPACK_DEFINE(t);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mid1 : top {
|
|
||||||
int m1;
|
|
||||||
MSGPACK_DEFINE(MSGPACK_BASE(top), m1);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mid2 : top {
|
|
||||||
int m2;
|
|
||||||
MSGPACK_DEFINE(m2, MSGPACK_BASE(top));
|
|
||||||
};
|
|
||||||
|
|
||||||
struct bottom : mid1, mid2 {
|
|
||||||
int b;
|
|
||||||
MSGPACK_DEFINE(MSGPACK_BASE(mid1), MSGPACK_BASE(mid2), b);
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(object_with_zone, user_defined_non_virtual)
|
|
||||||
{
|
|
||||||
bottom b;
|
|
||||||
b.b = 1;
|
|
||||||
b.m1 = 2;
|
|
||||||
b.m2 = 3;
|
|
||||||
b.mid1::t = 4;
|
|
||||||
b.mid2::t = 5;
|
|
||||||
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(b, z);
|
|
||||||
bottom br = obj.as<bottom>();
|
|
||||||
EXPECT_EQ(b.b, br.b);
|
|
||||||
EXPECT_EQ(b.m1, br.m1);
|
|
||||||
EXPECT_EQ(b.m2, br.m2);
|
|
||||||
EXPECT_EQ(b.mid1::t, br.mid1::t);
|
|
||||||
EXPECT_EQ(b.mid2::t, br.mid2::t);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct v_top {
|
|
||||||
int t;
|
|
||||||
MSGPACK_DEFINE(t);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v_mid1 : virtual v_top {
|
|
||||||
int m1;
|
|
||||||
MSGPACK_DEFINE(m1);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v_mid2 : virtual v_top {
|
|
||||||
int m2;
|
|
||||||
MSGPACK_DEFINE(m2);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v_bottom : v_mid1, v_mid2 {
|
|
||||||
int b;
|
|
||||||
MSGPACK_DEFINE(MSGPACK_BASE(v_mid1), MSGPACK_BASE(v_mid2), MSGPACK_BASE(v_top), b);
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(object_with_zone, user_defined_virtual)
|
|
||||||
{
|
|
||||||
v_bottom b;
|
|
||||||
b.b = 1;
|
|
||||||
b.m1 = 2;
|
|
||||||
b.m2 = 3;
|
|
||||||
b.t = 4;
|
|
||||||
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(b, z);
|
|
||||||
v_bottom br = obj.as<v_bottom>();
|
|
||||||
EXPECT_EQ(b.b, br.b);
|
|
||||||
EXPECT_EQ(b.m1, br.m1);
|
|
||||||
EXPECT_EQ(b.m2, br.m2);
|
|
||||||
EXPECT_EQ(b.t, br.t);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
#endif // !defined(MSGPACK_USE_CPP03)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user