mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-10-14 15:05:37 +02:00
Added 'as' support for containers.
This commit is contained in:
@@ -192,6 +192,18 @@ struct no_def_con {
|
||||
MSGPACK_DEFINE(i);
|
||||
};
|
||||
|
||||
inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) {
|
||||
return lhs.i == rhs.i;
|
||||
}
|
||||
|
||||
inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) {
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator<(no_def_con const& lhs, no_def_con const& rhs) {
|
||||
return lhs.i < rhs.i;
|
||||
}
|
||||
|
||||
namespace msgpack {
|
||||
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
|
||||
namespace adaptor {
|
||||
@@ -207,6 +219,14 @@ struct as<no_def_con> {
|
||||
} // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
|
||||
} // msgpack
|
||||
|
||||
namespace std {
|
||||
template <> struct hash<no_def_con> {
|
||||
size_t operator()(const no_def_con & x) const {
|
||||
return hash<int>()(x.i);
|
||||
}
|
||||
};
|
||||
} // std
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON, simple_buffer)
|
||||
{
|
||||
no_def_con val1(42);
|
||||
@@ -216,16 +236,29 @@ TEST(MSGPACK_NO_DEF_CON, simple_buffer)
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
|
||||
no_def_con val2 = ret.get().as<no_def_con>();
|
||||
EXPECT_EQ(val1.i, val2.i);
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
struct no_def_con_composite {
|
||||
no_def_con_composite() = delete;
|
||||
no_def_con_composite(int i):ndc(i) {}
|
||||
no_def_con_composite(no_def_con const& a):ndc(a) {}
|
||||
no_def_con ndc;
|
||||
MSGPACK_DEFINE(ndc);
|
||||
};
|
||||
|
||||
inline bool operator==(no_def_con_composite const& lhs, no_def_con_composite const& rhs) {
|
||||
return lhs.ndc == rhs.ndc;
|
||||
}
|
||||
|
||||
inline bool operator!=(no_def_con_composite const& lhs, no_def_con_composite const& rhs) {
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
inline bool operator<(no_def_con_composite const& lhs, no_def_con_composite const& rhs) {
|
||||
return lhs.ndc < rhs.ndc;
|
||||
}
|
||||
|
||||
namespace msgpack {
|
||||
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
|
||||
namespace adaptor {
|
||||
@@ -249,7 +282,7 @@ TEST(MSGPACK_NO_DEF_CON_COMPOSITE, simple_buffer)
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
no_def_con_composite val2 = ret.get().as<no_def_con_composite>();
|
||||
EXPECT_EQ(val1.ndc.i, val2.ndc.i);
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
struct no_def_con_inherit : no_def_con {
|
||||
@@ -281,7 +314,191 @@ TEST(MSGPACK_NO_DEF_CON_INHERIT, simple_buffer)
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
no_def_con_inherit val2 = ret.get().as<no_def_con_inherit>();
|
||||
EXPECT_EQ(val1.i, val2.i);
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_VECTOR, simple_buffer)
|
||||
{
|
||||
std::vector<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::vector<no_def_con> val2 = ret.get().as<std::vector<no_def_con>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_LIST, simple_buffer)
|
||||
{
|
||||
std::list<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::list<no_def_con> val2 = ret.get().as<std::list<no_def_con>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_SET, simple_buffer)
|
||||
{
|
||||
std::set<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::set<no_def_con> val2 = ret.get().as<std::set<no_def_con>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_MULTISET, simple_buffer)
|
||||
{
|
||||
std::multiset<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::multiset<no_def_con> val2 = ret.get().as<std::multiset<no_def_con>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_ASSOC_VECTOR, simple_buffer)
|
||||
{
|
||||
msgpack::type::assoc_vector<no_def_con, no_def_con_composite> val1 { {1, 2}, {3, 4}, {5, 6}};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
msgpack::type::assoc_vector<no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<msgpack::type::assoc_vector<no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_MAP, simple_buffer)
|
||||
{
|
||||
std::map<no_def_con, no_def_con_composite> val1 { {1, 2}, {3, 4}, {5, 6}};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::map<no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<std::map<no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_MULTIMAP, simple_buffer)
|
||||
{
|
||||
std::multimap<no_def_con, no_def_con_composite> val1 { {1, 2}, {3, 4}, {5, 6}};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::multimap<no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<std::multimap<no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_PAIR, simple_buffer)
|
||||
{
|
||||
std::pair<no_def_con, no_def_con_composite> val1 {1, 2};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::pair<no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<std::pair<no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_TUPLE, simple_buffer)
|
||||
{
|
||||
std::tuple<no_def_con, no_def_con, no_def_con_composite> val1 {1, 2, 3};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::tuple<no_def_con, no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<std::tuple<no_def_con, no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_MSGPACK_TUPLE, simple_buffer)
|
||||
{
|
||||
msgpack::type::tuple<no_def_con, no_def_con, no_def_con_composite> val1 {1, 2, 3};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
msgpack::type::tuple<no_def_con, no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<msgpack::type::tuple<no_def_con, no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_FORWARD_LIST, simple_buffer)
|
||||
{
|
||||
std::forward_list<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::forward_list<no_def_con> val2 = ret.get().as<std::forward_list<no_def_con>>();
|
||||
EXPECT_TRUE(val1 == val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_UNORDERED_SET, simple_buffer)
|
||||
{
|
||||
std::unordered_set<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::unordered_set<no_def_con> val2 = ret.get().as<std::unordered_set<no_def_con>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_UNORDERED_MULTISET, simple_buffer)
|
||||
{
|
||||
std::unordered_multiset<no_def_con> val1 { 1, 2, 3 };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::unordered_multiset<no_def_con> val2 = ret.get().as<std::unordered_multiset<no_def_con>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_UNORDERED_MAP, simple_buffer)
|
||||
{
|
||||
std::unordered_map<no_def_con, no_def_con_composite> val1 { {1, 2}, {3, 4}, {5, 6}};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::unordered_map<no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<std::unordered_map<no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_UNORDERED_MULTIMAP, simple_buffer)
|
||||
{
|
||||
std::unordered_multimap<no_def_con, no_def_con_composite> val1 { {1, 2}, {3, 4}, {5, 6}};
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::unordered_multimap<no_def_con, no_def_con_composite> val2
|
||||
= ret.get().as<std::unordered_multimap<no_def_con, no_def_con_composite>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
TEST(MSGPACK_NO_DEF_CON_ARRAY, simple_buffer)
|
||||
{
|
||||
std::array<no_def_con, 3> val1 { { 1, 2, 3 } };
|
||||
msgpack::sbuffer sbuf;
|
||||
msgpack::pack(sbuf, val1);
|
||||
msgpack::unpacked ret;
|
||||
msgpack::unpack(ret, sbuf.data(), sbuf.size());
|
||||
std::array<no_def_con, 3> val2 = ret.get().as<std::array<no_def_con, 3>>();
|
||||
EXPECT_EQ(val1, val2);
|
||||
}
|
||||
|
||||
#endif // !defined(MSGPACK_USE_CPP03)
|
||||
|
Reference in New Issue
Block a user